スワップ関連はロックとプロセス状態が複雑で難しい2018年01月17日 12時16分40秒

FreeBSD で無駄にスワップデバイスが解放されない場合があるので、実験してみた。

swapoff_all() 関数を参考に、スワップ領域が埋まってきたら、全てのプロセスのメモリを調べる。vmpage が実メモリに存在し、一度スワップに書き出されて呼び戻された後に、内容が更新されたとマークされているメモリを探す。

探して見付けたメモリの番地を表示したり、見付けた数を表示するだけは、比較的簡単に出来た。しかし、swp_pager_freeswapspace() 関数を呼び出すと、プロセスのスイッチやロック関連でカーネルパニックを連発する。他にも、何処からか kill シグナルが送られる様になったケースもあった。

スワップ領域が圧迫されている環境は、たいがい大量のページインとページアウトが行われている状態なので、それらの いIO 等と競合してしまうようだ。何度も試してみたが、思ったよりも複雑で、今は諦めるしか無さそうだ。

前回