Humanity

Edit the world by your favorite way

Linuxでのメモリ割り当て・解放のタイミングが分からない

とりあえず現象だけをメモ。
解決策はネットに頼ってもダメだったらカーネルのソース見なきゃいけないんだろうか。。。


Net::FriendFeed::Backupというモジュールを主に自分用に作っているんだけど、CentOSで(Windowsでは未確認)バックアップをディレクトリに書き出す時、メモリがフルに使われてしまう。
これはgitでバックアップしようとした時も出くわした現象なんだけど、そのディレクトリを削除するとメモリが一気に解放される。
メモリ解放が起きるのは削除した時のみ。
移動してもメモリは解放されない。
多分これはinodeとかいうのが関係してるんだろう。
ようするにLinuxが特定のinodeを持つファイルのキャッシュを持ってて、そのファイルが削除されたらそのキャッシュも解放されると。多分。分かんないけど。


GNOMEのメモリのアプレットとか見てると、そのタイミングで一気にグラフが現象するのが分かる。
こういう現象は自分の所で起きるだけなら見てて面白いんだけど、仮にもモジュールとして配布してる以上こういうのはマズいだろう。
なんかいい方法ないかなー。。。


とりあえず今strace rm -r dirした時のシステムコールで何呼ばれたか調べて、どのシステムコールが呼ばれた時点でそのディレクトリのキャッシュが解放されるのか調べるというとても低レベルなことをやっている。
(straceにそれぞれのシステムコールが呼ばれたタイミングで動作を止めるオプションとかあったらいいのに。。。とまだ数えられる位しかstrace使ったことのない自分が言ってみる)
これでディレクトリを削除するシステムコール以外のタイミングで解放されていたら、スクリプトからそのシステムコールを呼べばいいんだけど、多分それはない。


低レベルな知識を付けたい。
アセンブラとかやりたい。と今一瞬だけ思った瞬間萎えた。