Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Performance analysis on microservices and kubernetes

Performance analysis on microservices and kubernetes

This is an attempt on analyzing and finding correlations between node usage metrics (CPU, IO, etc.) and API level responsiveness. For node and container level metrics collection, prometheus was used. Istio/Jaeger was used to collect API level traces.

IWAMOTO Toshihiro

December 05, 2018
Tweet

More Decks by IWAMOTO Toshihiro

Other Decks in Programming

Transcript

  1. Disclaimer • This is not something production-ready. • Uses a

    synthetic app for analysis • No details on Istio will be provided, while I’d love to discuss later
  2. マイクロサービス化 • 最近の流行だそうです – 去年 12 月の kubecon は推しがすごかった •

    アプリの開発がやりやすくなる等は専門じゃないのでよくわからない • 単純な処理をする Pod(container) に分解されることで、システムに与える負 荷がわかりやすくなるかは興味がある – IO 主体 – CPU 負荷主体 – メモリ負荷主体 – Etc.
  3. イメージ図 (microservice’d) client micro-A 0 1 2 3 4 5

    6 7 CPU usage IO memory micro-B micro-C
  4. イメージ図 (microservice’d) client micro-A 0 1 2 3 4 5

    6 7 CPU usage IO memory micro-B micro-C
  5. 夢は広がる ... • ノード間の CPU, メモリ ,IO 帯域が平準化されるように Pod を

    配置したい ( 自動的に ) • Pod 間の負荷に正の相関がある場合 ( 複数のサービスが混在 してるような ) 、それらを別々のノードに配置して性能の悪影響 を抑えられる (?) • IO 負荷はノード単位で限界を越えないと顕在化しずらい • マイクロサービスの応答時間で負荷状況がみえるはず
  6. 実験環境 • On-prem OpenStack クラスタ上 – 4GB, 2 vCPU x

    4 台 • Kubernetes 1.12.2 • Istio 1.0.3 – mTLS 無効 • Prometheus-operator master (commit 5805237b) – Node-exporter – cAdvisor (kubelet)
  7. テスト用 web アプリ • フロントエンド (fe) – worker にリクエスト投げるだけ (

    複数回 ) • Worker – CPU 担当 – mysql からデータとってきて regression する • パラメータで指定された比率でランダムサンプリング – 乱数でデータつくって mysql にいれる • Mysql – IO 担当 ( のはず )
  8. Pod 単位で一定の傾向を示してほしかった • アクセスにいってるテーブルの大きさが 1 桁ちがう – 中間のちょうどいいサイズの負荷があれば (?) –

    並列に動かしてもキャッシュアルゴリズムの関係で ... • 間引きして worker に渡るデータの大きさを揃えてる – これ使って正規化すればよかったかも • 実際の workload ならいろいろ混ざって定常的になる? –
  9. 相関ありません ... >>> i2s=np.loadtxt('30-i2scatter.data') >>> print(np.array2string(np.corrcoef(i2s[...,1:5],rowvar=0),pre cision=4)) [[ 1.0000e+00 7.6919e-03

    4.2872e-02 -1.2068e-04] [ 7.6919e-03 1.0000e+00 -4.0794e-01 8.9741e-01] [ 4.2872e-02 -4.0794e-01 1.0000e+00 -6.7476e-01] [-1.2068e-04 8.9741e-01 -6.7476e-01 1.0000e+00]]
  10. >>> print(np.array2string(np.corrcoef(i2s[...,1:5], rowvar=0),precision=4)) [[ 1. 0.1716 0.019 0.1387] [ 0.1716

    1. -0.4079 0.8974] [ 0.019 -0.4079 1. -0.6748] [ 0.1387 0.8974 -0.6748 1. ]]
  11. まとめ • Prometheus でなんかとれる ( ご存知の通り ) • Istio/Jaeger でなんかとれる

    ( ご存知の通り ) • これらは理屈としては当然関連がある指標 – いちおう見えた • どう活用できるか – 性能予想 – ノードの負荷状況の指標として • 他の負荷もあったらどうなっていたか