nginx rtmp-module 録画した場合のメモリ使用量の問題について

nginx + rtmp-moduleを利用して映像配信サーバを構築すると、リモート録画も可能になる

nginx rtmp ライブストリーミングを録画 リモート操作

ただ、これ録画すると、メモリを段々と圧迫する事が分かりました。

録画を続けて1日以上回した場合
2.5M,1M,512K ビットレート3本を、3エンコードし、それを録画して1日回してみたらこんな感じ。

top - 09:49:56 up 9 days, 19:26, 2 users, load average: 11.37, 9.94, 14.17
Tasks: 150 total, 6 running, 144 sleeping, 0 stopped, 0 zombie
%Cpu(s): 16.4 us, 1.7 sy, 5.7 ni, 20.5 id, 55.4 wa, 0.0 hi, 0.3 si, 0.0 st
KiB Mem: 4016292 total, 3894296 used, 121996 free, 13080 buffers
KiB Swap: 8301564 total, 145888 used, 8155676 free. 2867264 cached Mem

cachedメモリが増え、freeが風前の灯となっていた。この状態で、さらにエンコーダを停止、再度エンコードし直したら、なんと映像がカクカクした動きになり、接続と切断を繰り返すようになりました。つまりサーバが不安定な状態。

良く分からなかったので、再起動したら、通常の状態に戻ったけど、再度同じエンコード試験をしたらどんどんキャッシュメモリが増えて、freeが少なくなります。

ここで取れる選択肢は2つで、

1.余分なキャッシュを排除するか
2.録画しない

になります。録画した時にこれあれですかね。メモリリークしちゃってるんでしょうか。

余分なキャッシュを排除する方法としては、

こちらで可能です。
http://www.atmarkit.co.jp/ait/articles/0810/01/news134_3.html
ページキャッシュがいつまでも残り続けていることに不満を感じる声をよく聞きます。そんなあなたは、drop_cachesを使うと悩みを解決できるかもしれません。
drop_cachesは、既に利用されておらず、ストレージと同期の取れているページキャッシュやSlabキャッシュをMemFreeに移動してくれます。つまり、MemFree≒利用可能なメモリとなるわけです。

echo 3 > /proc/sys/vm/drop_caches

とする事で、一気にキャッシュメモリ・buffersが減ってfreeが多くなります。このコマンドを定期実行させるのも手段としてありですが。なんか気持ち悪いですよね。ちょっと悩むところです。

とりあえずページキャッシュをクリアすると一気に

top - 10:42:49 up 51 min, 2 users, load average: 0.79, 1.13, 1.39
Tasks: 166 total, 2 running, 164 sleeping, 0 stopped, 0 zombie
%Cpu(s): 19.8 us, 0.8 sy, 5.5 ni, 73.5 id, 0.1 wa, 0.0 hi, 0.2 si, 0.0 st
KiB Mem: 4016292 total, 694388 used, 3321904 free, 5556 buffers
KiB Swap: 8301564 total, 0 used, 8301564 free. 217324 cached Mem

このようになります。録画をしていない状態だと、700000 usedを行ったり来たりで、ずっと増え続けるような事はありません

とりあえず10分ごとにページキャッシュのみクリアする形をとって、他に影響などが出ないか見てみたいと思います。

*/10 * * * * echo 1 > /proc/sys/vm/drop_caches

やってみて、最後録画情報にyamdiをかけてメタ情報をつけるのですが、長時間録画していると、やぱりメモリ厳しくなります。このページキャッシュをクリアしていくのもなんだか怖いので、安定配信を目指すときにはやめようと思いました。