Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

システムパフォーマンス勉強会#5

322 views

Published on

社内システムパフォーマンス勉強会の第5回
詳解システム・パフォーマンス 6 章 CPUの話

Published in: Software
  • Be the first to comment

  • Be the first to like this

システムパフォーマンス勉強会#5

  1. 1. システムパフォーマンス 勉強会 #5 SRA 産業第1事業部 鈴木真吾
  2. 2. 注意 • このスライドは勉強会後に SlideShare にアップロードする予 定です • メーリングリストで告知予定
  3. 3. 今回の内容 詳解システム・パフォーマンス 6 章 CPU • 6 CPU • 用語 • モデル • アーキテクチャ • メソドロジ • 入れてない箇所 • スケジューラ、スケジューラクラス • チューニング • etc
  4. 4. ■ 用語 • プロセッサ • 物理チップ。ひとつ以上のCPUを含む • コア • マルチコアプロセッサに含まれる独立したCPUインスタンス • ハードウェアスレッド • ひとつのコアの上で複数のスレッドの並列実行をサポーするCPUアーキテクチャ • CPU 命令 • CPUの命令セットに含まれる1個のCPUオペレーション • 論理 CPU • オペレーティングシステムのCPUインスタンス(スケジューリングできるCPU) • スケジューラ • 実行のためにスレッドにCPUを当たるカーネルサブシステム • ランキュー • CPUによる処理を待っている実行可能スレッドのキュー
  5. 5. ■ モデル • CPUアーキテクチャ • メモリキャッシュ • ランキュー
  6. 6. CPUアーキテクチャ • 4 コアの CPU • ハードウェアスレッド があるので、OSからは 8 個のコアがあるよう に見える CPU コア ハードウェアスレッド ハードウェアスレッド コア ハードウェアスレッド ハードウェアスレッド コア ハードウェアスレッド ハードウェアスレッド コア ハードウェアスレッド ハードウェアスレッド
  7. 7. CPUのメモリキャッシュ • 上に行くほど低レイテンシだがサイズは小さい ストレージデバイス メインメモリ L3キャッシュ L2キャッシュ L1キャッシュ CPU レジスタ
  8. 8. CPUのランキュー • ランキューはCPUごとに提供される CPU R R RR O R 実行可能 O 実行中 ランキュー内の待ち時間 = スケジューラレイテンシ
  9. 9. ■ コンセプト • クロックスピード • 命令 • 命令パイプライン • CPU使用率 • ユーザ時間/カーネル時間
  10. 10. クロックスピード • プロセッサのロジックを動かすデジタル信号 • 1つ以上のクロックサイクルで1命令が進む • 1クロックで1命令進むわけではない • CPUの性能の単位であるHzは、一秒間にこのクロックサイクル が何回あるかを示している • クロックスピードを上げれば必ずパフォーマンスが向上すると は限らない。 • 例;メモリアクセス待ちでストールサイクルになっている場合
  11. 11. 命令 • 命令の例 • 命令のフェッチ • 命令のデコード • 命令の実行 • メモリアクセス • レジスタへの書き戻し • このうち: • メモリアクセスは非常に遅い。数十サイクルかかってしまうこともあ る。 • ハードウェアキャッシュで改善している。
  12. 12. 命令パイプライン • 5段パイプラインなら5 並列で処理が行える • パイプラインの長さが長いほうが並列度は高くなるが、オーバーヘッドも大きく なってしまう • 最近 Meltdown で話題になっている投機的実行はこの仕組みと関わりがある • 分岐予測とかも参照 F フェッチ D デコード E 実行 M メモリアクセス R レジスタ書き戻し R M E D F R M E D F R M E D F R M E D F R M E D F ここでそれぞれの命令を実行 クロックのたびに進む
  13. 13. CPU使用率 • 一定期間内でCPUインスタンスがビジー状態になっていた割合 • CPUの飽和 • = CPU使用率 が 100% • かならずしも悪い状態とは限らない • CPU使用率が高くても、メモリ待ちでストールしてるだけのこともある
  14. 14. ユーザー時間/カーネル時間 • ユーザー時間 ユーザレベルコードに使われたCPU時間 • カーネル時間 カーネルレベルコードに使われたCPU時間 • CPUを酷使するアプリケーションは、ほとんどがユーザー時間 • I/Oを酷使するアプリケーションは、カーネル時間が多い
  15. 15. ■ アーキテクチャ • プロセッサ • CPUキャッシュ • キャッシュライン • インターコネクト
  16. 16. プロセッサ • 2コアプロセッサ • 制御ロジック • 命令のフェッチ、 デコードなどを行 うCPUの心臓部 • ALU • 算術演算 • FPU • 浮動小数点演算 • TLB,MMUについては後 で レベ FPU MMU CPU 制御ロジック レジスタ ALU レベル1 命令 キャッシュ レベル1 データ キャッシュ レベル2 キャッシュ TLB CPU 制御ロジック レジスタ ALU レベル1 命令 キャッシュ レベル1 データ キャッシュ レベル2 キャッシュ レベル3キャッシュ バスインターフェース
  17. 17. CPUキャッシュ I$ D$ MMU TLB L2キャッシュ ページテーブル on メインメモリ CPU 仮想 アドレス 仮想 アドレス で参照 L1 キャッシュ 物理アドレス キャッシュを 調べる 仮想アドレス-> 物理アドレス への変換 物理アドレス で参照 TLBミス • キャッシュに乗っ ている=速い • キャッシュミスが起こ るたび、より遅いレイ ヤへのアクセスが発生 する
  18. 18. キャッシュライン • or キャッシュ線 • キャッシュにひとつの単位として格納されるバイトの範囲 • x86では 64 バイトのことが多い • コンパイラ、インタープリタはパフォーマンスの向上のため、このサ イズを意識して最適化する • オブジェクトのサイズを 64 バイトに納めるようにするなど… • 同じ範囲のキャッシュラインを異なるCPUが取ろうとするとパ フォーマンス問題になる (フォルスシェア)
  19. 19. インターコネクト • モダンなCPUは複数コア • (NUMA) • 同じ線をCPUが共有してしま うと競合が起きる • ⇒CPU間ごとにCPUインター コネクトを用意 • CPU毎にDRAMがあるので CPUバインドして同じプロセ スを同じCPUで実行できると うれしい(=>CPUバインド) CPU CPU I/O コントローラ I/O コントローラ DRAM DRAM CPU CPUDRAM DRAM
  20. 20. ■ メソドロジ • ツールメソッド • USE メソッド • ワークロード特性の把握 • プロファイリング • 静的パフォーマンスチューニング
  21. 21. ツールメソッド • uptime • ロードアベレージのチェックに使う • vmstat • 仮想メモリの統計情報をみる • ランキューの状態も表示してくれる • mpstawt • 個別のホットCPUをチェックし、スレッドのスケーラビリティ問題になって いるものを探す • top • どのプロセス、ユーザーがCPUを最も消費しているか調べる • perf,SystemTap • カーネルスタックのプロファイリングetc
  22. 22. USEメソッド • CPUにおける USE は次のようになる • 使用率 • CPUがビジーだった時間 • 飽和 • 実行可能スレッドがCPU待ちでキューイングされている度合い • エラー • 修正可能なエラー (Error-Correcting-Code)ものも含むCPUエラー • OS によっては ECC が増加したときに、修正不能なエラーでCPUがエラーを起 こす前にCPUをオフラインにするものもある
  23. 23. ワークロード特性の把握 • 次のような指標からワークロード特性を把握できる • ロードアベレージ • ユーザ時間とシステム時間の比率 • システムコールの頻度 • 自発的なコンテキストスイッチの頻度 • 割り込みの頻度 • 例 • ユーザ時間が長い→アプリケーションが独自計算の実行に時間をかけている • システム時間が長い+システムコールの頻度が高い→I/Oバウンドのワーク ロードが高い
  24. 24. プロファイリング • 次の手順でサンプリングする • 選択: キャプチャするデータのタイプと頻度を選択 • 開始:一定のインターバルでサンプリングを開始する • 待機:関心を持っているアクティビティの発生を待つ • 終了:サンプリングを終了し、サンプルデータを集める • 処理:データを処理する • Linux の場合は perf を使うとよい • ビジュアライゼーションツールもある
  25. 25. 静的パフォーマンスチューニング • 何個のCPUが使えるか • CPUはコアか、ハードウェアスレッドか • CPUキャッシュのサイズはどれだけか • CPUのクロックスピードはどれだけか • BIOSで有効or無効になっているCPU関連の機能は何か • 対象のプロセッサモデルにはパフォーマンス問題はあるか • BIOSのバージョンにはパフォーマンス問題はあるか • ソフトウェアで強制されたCPUの使用制限はあるか
  26. 26. スケーリング • スケーラビリティの計算は次のようにする • 1 ユーザの規模、要求のペースを見積もる • 2 ユーザ、要求ごとのCPUの使用状況を明らかにする • 既存のシステム → ユーザ数、要求頻度でモニタリング • 新規のシステム → 負荷生成ツールでシミュレート • 3 CPU リソースの使用率が 100% になったときのユーザ数、要求数を 外挿法で計算する
  27. 27. ■ CPUパフォーマンスの分析 • uptime • vmstat • mpstat • stap • time • perf • perf record • perf stat
  28. 28. uptime(1) • ロードアベレージの表示 $ uptime 20:30:31 up 10 days, 2:21, 2 users, load average: 0.00, 0.06, 0.08
  29. 29. ロードアベレージ • 実行中のスレッドと、実行待ちでキューイングされているスレッド の合計数から計算 • 1時間のロードアベレージが10なら、一時間の任意の時点を見た時に • 1個のプロセスが実行されて、9個のスレッドが実行可能な状態でCPUを 待っている • どう解釈すればよいか? • ロードアベレージがCPU数よりも多い→スレッドを処理するCPUが足りてい ない • ロードアベレージがCPU数よりも少ない→CPUに余裕がある • ただしLinuxのロードアベレージは割り込み不能状態でディスクI/O を実行しているタスクを加えているので注意
  30. 30. vmstat(8) $ vmstat 1 procs ------------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 11924 1133884 526840 8318772 0 0 6 161 157 53 11 3 86 0 0 0 0 11924 1133580 526840 8318860 0 0 0 188 361 829 1 0 99 0 0 0 0 11924 1133612 526840 8318804 0 0 0 0 345 640 1 0 99 0 0 1 0 11924 1133612 526840 8318804 0 0 0 0 4350 1376 1 1 98 0 0 0 0 11924 1133580 526840 8318804 0 0 0 0 7643 1770 1 1 99 0 0 0 0 11924 1147904 526840 8304292 0 0 0 424 6954 2083 1 1 98 0 0 0 0 11924 1155144 526840 8297656 0 0 0 0 6978 1944 1 1 98 0 0 1 0 11924 1155812 526840 8297208 0 0 0 0 5705 2728 2 1 97 0 0 0 0 11924 1155696 526840 8297140 0 0 0 92 1407 1145 1 1 99 0 0 • 仮想メモリ統計ツール • ランキューの情報も取得できる • vmstat 1 で 1 秒ごとに統計情報を表示
  31. 31. vmstat(8) • r: ランキューの長さ • us: ユーザ時間 • sy: カーネル時間 • id: アイドル時間 • wa: I/O 待ちの時間 • st: 盗まれた(STolen)時間 • 仮想環境で、他のテナントにサービスを提供するために使われた時間
  32. 32. mpstat(1) $ mpstat -P ALL 1 Linux 4.4.0-112-generic (Anemone) 02/06/18 _x86_64_ (8 CPU) 20:47:37 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 20:47:38 all 0.75 0.00 0.12 0.00 0.00 0.00 0.00 0.00 0.00 99.12 20:47:38 0 1.01 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 98.99 20:47:38 1 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00 20:47:38 2 0.99 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.01 20:47:38 3 2.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 98.00 20:47:38 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 20:47:38 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 20:47:38 6 0.99 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.01 20:47:38 7 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00 • CPU毎の統計情報を取得するツール • mpstat –p ALL 1 で 1 秒ごとにすべてのコアの統計情報を表示
  33. 33. mpstat(1) • CPU: 論理 CPU ID • %usr: ユーザ時間 • %nice: ナイス値で優先度を操作したプロセスのユーザ時間 • %sysy: カーネル時間 • %iowait: I/O待ち時間 • %irq: ハードウェア割り込みによるCPU使用時間 • %soft: ソフトウェア割り込みによるCPU使用時間 • %steal: ほかのテナントのために使われたCPU時間 • %guest:ゲスト仮想マシンのために使われたCPU時間 • %idel:アイドル時間
  34. 34. ps(1) $ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 119728 5820 ? Ss 1月27 0:03 /sbin/init splash root 2 0.0 0.0 0 0 ? S 1月27 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 1月27 0:33 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S< 1月27 0:00 [kworker/0:0H] root 7 0.0 0.0 0 0 ? S 1月27 2:28 [rcu_sched] root 8 0.0 0.0 0 0 ? S 1月27 0:00 [rcu_bh] root 9 0.0 0.0 0 0 ? S 1月27 0:00 [migration/0] root 10 0.0 0.0 0 0 ? S 1月27 0:00 [watchdog/0] root 11 0.0 0.0 0 0 ? S 1月27 0:00 [watchdog/1] • システム全体のプロセスの状態を表示する • ps aux する派と ps -ef する派が存在する • %CPU でプロセスの CPU 使用率を見れる
  35. 35. top(1) top - 20:53:53 up 10 days, 2:44, 2 users, load average: 0.26, 0.13, 0.09 Tasks: 282 total, 1 running, 280 sleeping, 0 stopped, 1 zombie %Cpu(s): 0.9 us, 0.5 sy, 0.0 ni, 98.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 16280788 total, 1095252 free, 6340152 used, 8845384 buff/cache KiB Swap: 16625660 total, 16613748 free, 11912 used. 8689552 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1047 root 20 0 555280 96928 76940 S 4.0 0.6 22:19.65 Xorg 1627 shingo-s 20 0 1601972 353892 64484 S 1.7 2.2 26:14.54 compiz 647 root -51 0 0 0 0 S 1.3 0.0 0:38.11 irq/51-DLL07BE: 1615 shingo-s 9 -11 435024 12692 9720 S 1.3 0.1 54:48.88 pulseaudio 4747 shingo-s 20 0 601376 43120 31048 S 1.3 0.3 0:41.71 gnome-terminal- 8047 shingo-s 20 0 782876 142764 41808 S 1.3 0.9 15:56.80 emacs24 21781 shingo-s 20 0 1406196 343136 88448 S 0.7 2.1 0:25.87 chrome 25753 shingo-s 20 0 41668 3744 3004 R 0.7 0.0 0:00.13 top 1522 shingo-s 20 0 206988 8636 5916 S 0.3 0.1 0:03.98 at-spi2-registr 2042 shingo-s 20 0 1348236 254948 92972 S 0.3 1.6 3:23.39 chrome 3381 shingo-s 20 0 289004 4864 4244 S 0.3 0.0 0:23.04 sd_cicero 3815 shingo-s 20 0 2140736 900076 98600 S 0.3 5.5 14:41.76 chrome • CPUを消費している実行中プロセスをモニタリング
  36. 36. time(1) • プログラムを実行して、そのユーザ時間/カーネル時間を調べる $ time cksum ~/Downloads/android-studio-ide-171.4443003-linux.zip 2459189985 773670325 /home/shingo-s/Downloads/android-studio-ide-171.4443003-linux.zip real 0m2.113s user 0m2.028s sys 0m0.084s
  37. 37. time(1) $ /usr/bin/time -v cksum ~/Downloads/android-studio-ide-171.4443003-linux.zip 2459189985 773670325 /home/shingo-s/Downloads/android-studio-ide-171.4443003-linux.zip Command being timed: "cksum /home/shingo-s/Downloads/android-studio-ide-171.4443003- linux.zip" User time (seconds): 2.05 System time (seconds): 0.06 Percent of CPU this job got: 99% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.12 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 2052 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 93 Voluntary context switches: 1 Involuntary context switches: 4 Swaps: 0 File system inputs: 0 • Linux では –v で詳細情報を取得できる
  38. 38. SystemTap • 例 • mysqld プロセスの read() レイテンシを集計する • stap –ve ‘global t, s; probe syscall.read { if (execname() == “mysqld” ) { t[tid()] = gettimeofday_ns(); } } • カーネルスタックを 100Hz でサンプリングする • stap –e ‘global s; probe timer.profile { s[backtrace() <<< 1; } probe end { foreache (I in s+) { print_stack(o) ; printf (“t%dn”, @count(s[i])); } }’
  39. 39. perf record • スタックをサンプリング • perf record –a –g –F 997 • すべてのCPUのコールスタックを997Hz でサンプリング # perf record -F 99 -a -g -- sleep 60 $ perf report --stdio (一部省略‘) # Children Self Command Shared Object Symbol # 13.97% 0.00% swapper [kernel.kallsyms] [k] 0xffffffff81051f84 | ---0xffffffff81051f84 | |--12.34%-- 0xffffffff810c5b20 | 0xffffffff810c5862 | 0xffffffff816d7e17 | | | |--5.79%-- 0xffffffff81846a96 | | |
  40. 40. FlameGraph • perf には FlameGraph を描画するツールが配布されている • 右のような図を作れる • y軸はスタックの深さ • x軸はその関数がサンプリングされた割合 • 幅が広いほどたくさん呼ばれている $ git clone https://github.com/brendangregg/FlameGraph # or download it from github $ cd FlameGraph $ sudo perf record -F 99 -a -g -- sleep 60 $ perf script | ./stackcollapse-perf.pl > out.perf-folded $ ./flamegraph.pl out.perf-folded > perf-kernel.svg
  41. 41. perf stat -e • 対象にしたプロセスが起こしたCPUイベントetcを計測 $ sudo perf stat -e instructions,cycles,L1-dcache-load-misses,LLC-load-misses,dTLB-load- misses cksum ~/Downloads/android-studio-ide-171.4443003-linux.zip 2459189985 773670325 /home/shingo-s/Downloads/android-studio-ide-171.4443003-linux.zip Performance counter stats for 'cksum /home/shingo-s/Downloads/android-studio-ide- 171.4443003-linux.zip': 7,821,626,672 instructions # 1.05 insns per cycle 7,443,696,177 cycles <not supported> L1-dcache-load-misses <not supported> LLC-load-misses <not supported> dTLB-load-misses 2.094258703 seconds time elapsed
  42. 42. ■実験 • CPUのパフォーマンスをみるにはどういう実験をすればいいか • アドホックテスト • SysBench • システムベンチマークスイート • シンプルなCPUベンチマークツールを含む
  43. 43. SysBench $ sysbench --num-threads=8 --test=cpu --cpu-max-prime=100000 run sysbench 0.4.12: multi-threaded system evaluation benchmark Running the test with following options: Number of threads: 8 Doing CPU performance benchmark Threads started! Done. Maximum prime number checked in CPU test: 100000 Test execution summary: total time: 27.6253s total number of events: 10000 total time taken by event execution: 220.9074 per-request statistics: min: 20.98ms avg: 22.09ms max: 40.14ms approx. 95 percentile: 22.19ms Threads fairness: events (avg/stddev): 1250.0000/1.41 execution time (avg/stddev): 27.6134/0.01
  44. 44. SysBench $ sysbench --num-threads=16 --test=cpu --cpu-max-prime=100000 run sysbench 0.4.12: multi-threaded system evaluation benchmark Running the test with following options: Number of threads: 16 Doing CPU performance benchmark Threads started! Done. Maximum prime number checked in CPU test: 100000 Test execution summary: total time: 27.6250s total number of events: 10000 total time taken by event execution: 441.5056 per-request statistics: min: 22.01ms avg: 44.15ms max: 130.95ms approx. 95 percentile: 54.64ms Threads fairness: events (avg/stddev): 625.0000/5.33 execution time (avg/stddev): 27.5941/0.02
  45. 45. まとめ • ツールが出す情報の意味を知っておくとパフォーマンスの分析 に役に立つ
  46. 46. おわり

×