地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Ruby】LinuxとRubyとCoW

hiboma.hatenadiary.jp

こちらのアンサー記事を書いてみますw

なぜ CoW の話が出てきたのか

なぜCoWを気にしたのかを話すとまず社内で動かしているAPIサーバがメモリ利用過多となってアラートがなったのが話のスタートでした。サービス自体はUnicornを使って動いています。

メモリ利用過多となったときに調べる手法は言語ごとに様々ですが私はRubyの経験がほぼなくプロファイラなども使ったことがありません。この状況でできることは/procを見るくらいしかなかったので/proc/$pid/smapsを見始めました。そこで始めたのがメモリ共有率の計算でした。

以下のツールを書いてUnicornの親子プロセスのメモリ共有率を確認するとなんと40~60%程度となっていて「え!?」ってなったのが始まりでした。プロセスの生存期間が長いのかと思ったのですが起動時間も出すと数分前に起動したプロセスも漏れなくそのくらいの共有率となっていました。mod_perlとかの世界で生きていたので「びっくり!」って感じでした 。この辺が話の始まりでした。

github.com

そこで颯爽と登場して疑問を解決してくれたのがhiboma (id:hiboma) さんと id:udzura さんのお二人でした。感謝!

どんなことをディスカッションしてたのか

そもそもRubyはCoWの恩恵をあんま受けないよねという話を聞きました。

techracho.bpsinc.jp

RubyVALUEとかRVALUEとか小さめのインスタンスをたくさん作っては消すのでglibcmallocとはあまり相性が良くないのではとのことでした。加えてjemallocを使うと良いかもという話も聞きました。

github.com

そこから発展してCoWが起こるときの特定のカーネル関数をトレースするにはどうすれば良いかという話になりその回答としてhiboma (id:hiboma)さんが検証記事を書いてくれました。自分じゃたどり着けないような解法で大変勉強になりました。検証コードやツールの理解に加えて当然ながらカーネルの知識なんかがあって初めてスタートラインでかつ説明をわかりやすく書いてるあたり「すごすぎる。。」という感想以外出ませんでした。いつかはその領域まで行ってみたいですね。。!!

今後

社内で動いているアプリケーションの多くはRubyで動いておりそこへの入門が最優先かなと思ってやっていきます。あとは並行してBPFに入門し、こういった視点からアプリケーション調査やサービスを支えれるようなエンジニアになりたいみたいなざっくり目標はあるのでそこへ進んでいく感じ行きたいなと思います!

感想

これまでこの辺の話を社内ですることってあまりなくて寂しさを感じていたりもしたので社内で話を出来るのはとてもとてもとても楽しく嬉しくてという思いでした。

また各レイヤごとにすごい人たちだらけの会社で議論のログなんかも全て閲覧可能だったりとめっちゃいい環境だなと改めて感じたりもしました。特にissue上でのやりとりなんかは「なぜこうなったか」みたいな思考過程とかまでまとまっていたりでいわゆる技術書からは学べない現場の知識を得られていると感じました。

転職して早2ヶ月なので3ヶ月目も頑張ろう〜〜

tech.pepabo.com

イベントもやってるらしいので是非〜〜