hirapi's blog

ちゃんとしたふりをする

builderscon tokyo 2018 聴講メモ #5「高集積コンテナホスティングにおけるボトルネックとその解法」by P山さん

speakerdeck.com

※ 以下は私個人の解釈を多大に含んだメモ書きです。正確な講演内容はスライドか、もしくはYouTubeで公開される(?)公式動画をご覧ください。

高集積コンテナホスティングにおけるボトルネックとその解法

@pyama86

GMOペパボ ホスティング事業部
ロリポップ! マネージドクラウド

テーマ

  • 7分であなたもコンテナーマイスター講座
  • はまった問題
  • 展望

テイクホームメッセージ

  • コンテナのボトルネックLinuxコマンドを駆使してあたりをつけて解決する
  • そのシステムコールが何をするのか、基礎的学習が必要(manを読んでわかるように)
    Linuxプログラミングインタフェース』

内容めも

  • ロリポップマネージドクラウド
    haconiwaを採用(mruby製。DSLで定義)

  • コンテナ = プロセス

    • namespace
      unshareによってnamespaceを分離できる。
    • chroot
      プロセスごとに見れるディレクトリを制限
    • cgroup
      プロセスごとにリソースを制限
    • capability
      プロセス・ファイルごとに権限管理
      cap_net_bind_service well-knownポートをlistenすることができる
      dockerで権限付けて起動してるときは、このcapabilityを全付けしてる
  • FastContainerアーキテクチャ

    • FastCGI:リクエストが来た時点でプロセスをフォークして処理、終わったらフォークしたものを殺す
    • nginxがコンテナ起動を確認、してなければ起動、起動したらコンテナで処理 ← リクエスト単位でコンテナを起動させるため
    • → オートスケールもハードウェア障害時対応も「次のリクエストから」実施される
    • → コンテナの高速起動が重要になる
  • 事象:監視コンテナのダウン

    • netns(network namespace)の追加に1分くらいかかっていた
    • ipコマンド:インタフェースの確認以外にもnsの管理にも使える。使っている
    • straceで調査、unshareがボトルネックらしい
    • perf <コマンド>:コマンドの中のどこが遅いのか、システムコールのレベルでわかる
    • deactivate_slab という処理
      Linuxソースコード読んでみた。Slabが12Gと肥大化し、ボトルネックになっているらしい
    • drop_caches:procの機能。キャッシュを開放する
  • 事象:コンテナが起動しない

    • bridgeにインタフェース追加するとき:1025になっている。上限ぽいな
    • BR_PORT_BITS:10 ← 1つのbridgeに2の10乗がポートの上限
    • bridgeを分散させる
  • 事象:CPU・メモリには余裕があるのにLAが高い

    • cadviser:google製コンテナリソース管理
    • gdb → bt(back trace)
    • iproute2でnetlinkを利用したNSID取得 ← 最新のソースでは取得していなかった
      もともと、ディストリビューションが配布しているパッケージでインストールしていた
    • 取得しないようにしたら2秒→0.05秒へ
  • gdb 便利
    ディストリビューション配布、意外と最新のソースと乖離している。詰まったらソース読んで見る

  • 4000コンテナ弱でメモリ枯渇 = リソース使い切れた!

  • システム調査コマンド valfrind

    • 自作のmrubyのAPIクライアントが重い(メモリ9Gくらいとってる)
    • 測定 → バックトレース → システムコール調査
    • mrubyの実装を読んでみて、文字列結合時のメモリのアロケーションを調べる
      c = a + b より a << b のほうがメモリ確保が小さくて済む
  • あるwordpressサイトにabかけたら別のサイトが落ちた
    コンテナなのに……?

    • NFSでファイルを開くとき、毎回ロックをかける
      小さいファイルをたくさん開くPHPと相性が悪い
      → OPcacheを使う

質疑

  • 直感的に、コンテナの起動はI/O等に比べて負荷にはならなさそうだけど
    うちではディスクI/Oは負荷にはなっていなかった
  • コンテナの起動速度(イメージによりそうだけど)
    過負荷状態でなければ1秒以内。起動直前の状態をメモリにのせて、メモリから起動する方法を検証中
  • iproute2入れ方
    makeインストール

感想

「測定 → バックトレース → ソース読む」の流れ、言うは易し行うは難しだ……。インフラ屋さんすごい……。
今まで現職でもうわからんって匙を投げてたところをこういうふうに調べて直していけたらどんなに良いだろう。
ものを言うのは知識と努力だ、がんばろって思わせてくれた。

あと何より面白かった!w
こんな高い技術あってこんな楽しく話す人と働けたらめっちゃ楽しいだろうなーって、こういう人たちと一緒に働けるくらい勉強と経験を積まないとなーって思った。