たごもりすメモ

コードとかその他の話とか。

perl 5.16.0 でメモリリーク

Fluentd out_exec_filter から起動しているperlのプロセスがある。ApacheアクセスログをSTDINから1行読んでparseしていくつか正規表現などで判定処理をしてフラグ立てなどをして、タブ区切りの1行として出力する、という処理としては割と簡単なもの。ただし秒間にけっこうな行数を処理する。
最近サーバを足したので、これまでと全く同じコードをデプロイしてえいやと起動してみたら、なんか突然メモリを馬鹿食いするようになってた。既存のサーバはそんなことない。見てみたらperlのプロセスがやたらとメモリを食ってる。

既存サーバは perl 5.14.2 を使ってて、追加したサーバは何も考えず perl 5.16.0 を入れてみてたんだけど、そこの違いで起きるようだった。試しに追加サーバのうち1台を perl 5.14.2 に変えてみた(グラフの01:30頃の再起動がそう)ら、以下のようにはっきり差が出た。

左側が perl 5.14.2 で右側が perl 5.16.0 を使っているノード。




処理してる量もCPU負荷も違いがないしコードも全く同一のはずだが、メモリ使用量は perl 5.16.0 の側のノードだけがんがん上がってる。なんでやねん。
perl 5.16.0 のchangesもいちおう眺めてみたんだけど、メモリまわりで大きな変更があったようには読めなかった。また念のため perl 5.16.0 + jemalloc を使うようにしてみたノードも上げてあるんだけど、そっちも状況は変わらずメモリを食いまくる。

とりあえずは 5.14.2 を使えば解決するんだけど、こまったなこれ。Webアプリとかではどうなんだろ。何を調べればいいのかもよくわからんし、どなたか何かご存知ないでしょうか。

追記

たいへん親切な人が調べてくれた結果、どうも perl 5.16.0 のバグっぽいねという感じです。
Re: perl 5.16.0 でメモリリーク? - blog.64p.org

追記2

そしてHEADでも直ってなかったのが、修正されるパッチが作成されたようです。すごい!
Re: Re: perl 5.16.0 でメモリリーク? - Islands in the byte stream