ファイル転送時にディスクIO起因で起こるOOM Killer
3 min read
こんにちは、無能です。
新居に格安で自宅サーバーを組んでから数日が経ちました。何気に前から気になってた問題がメモリもりもりでもおきてしまいましたとさ。
何が起きたのか
ちょっと私の今の環境は特殊、というかメモリ容量は16GB + 8GBという中途半端な感じなのですが余り物で作ったのでご了承いただきたい。
というのも、これでRAM自体は24GBと今では当たり前なのかもしれないが個人的にだいぶリッチな状態であるのでOOMなんて起きないだろうと思っていたらLinuxカーネルからお叱りのようなOOMが発生した。
アプリケーションなんて、apacheとphp-fpm, Redisとかくらいでそれぞれが確保するメモリなんてたかがしれているのだが・・・。
ファイル転送に頭悩ます
実家にまだ置いている自宅サーバからscpで持ってこようとしたりある程度イメージを保存するために一括でaria2cで2TBのHDDに保存処理をしていたら起きた。
さて、ここでなんでこの書き込み処理だけでOOMが発生するか?と、言いますとファイルというものは一度メモリで受け取ってその後に記録領域に書き込みが行われるので高速化のためにも一度キャッシュとしてメモリ側で受け付ける必要がある。
おおよそscp -r
で数百GB単位くらいのファイルでかつそのファイルがランダムなIO処理が入るとマジでリソースを食うようだ。
そして、これはあくまでプロセス単位のメモリ使用には当たらないのでtopで確認したりしても単一プロセスでは確認出来ずあくまでLinuxカーネル側のお話なのでなかなかに特定がしんどい。
簡潔に言えばIO待ちによって一時的にメモリに格納する量が書き込みに追いつかなくなってジリ貧になってしまうからこうなってしまっているようだ。
変更できるカーネルパラメータ
カーネル側ができるものとして、どのくらいキャッシュするかなどを設定できるようで調整してみたは良いもののあまり効果を感じられない。
2.2. VFS チューニングオプション: リサーチと実験 Red Hat Product Documentation
Linuxページキャッシュの設定を変更してWrite I/Oをチューニングしたメモ- YOMON8.NET
事象的にはこの人に近い。
OOM Killer invoked due to slow disk I/O - #17 by Whis-key - troubleshooting - Storj Community Forum (official)
久しぶりにStorjの文字見たな。。。俺の無料枠勝手に消されていたけど。。。
まさかの、HDDへの書き込みだけでのメモリ枯渇に頭を悩ますとは・・・。
よくいう、メモリ周りに関して「LinuxはRAMには楽観的、Windowsは悲観的」と言われる部分でもありますね。ただしメモリをフル活用してパフォーマンスをより効率的に、という意図は受け取れるのだがどうにかこのIO待ちで起こる問題に対処したいなあ。