Dockerコンテナでのcyclictest実行結果
前回はDockerコンテナでcyclictestを動作させるところまでやってみました。
今回はcyclictestの結果をもう少し詳しく見てみます。
環境
以下の環境で試しました。
docker version Client: Version: 18.09.7 API version: 1.39 Go version: go1.10.1 Git commit: 2d0083d Built: Fri Aug 16 14:20:06 2019 OS/Arch: linux/amd64 Experimental: false Server: Engine: Version: 18.09.9 API version: 1.39 (minimum version 1.12) Go version: go1.13.4 Git commit: 9552f2b Built: Sat Nov 16 01:07:48 2019 OS/Arch: linux/amd64 Experimental: false
cyclictestについて
cyclictestは以下の図のように一定時間ごとにリアルタイムスレッドを起動して,理想とするスレッドの起動時刻と実際にスレッドが起動した時刻との差(レイテンシ)を計測するテストです。
当然レイテンシは低ければ低いほどよいと言えます。
CPU負荷の与え方
CPU負荷が高い場合にもリアルタイムスレッドが定周期実行されることを確認したいので,以下のようなスクリプトを実行しながらcyclictestを実行します。
実行するとCPU使用率がほぼ100%になります。
while true; do dd if=/dev/zero of=bigfile bs=1024000 count=1024; done & while true; do killall hackbench; sleep 5; done & while true; do ./hackbench 20; done & ( cd ltp-full-20040707; su mingo -c ./run40; ) & ping -l 100000 -q -s 10 -f v & du / & ./dortc &
cyclictestの実行
前回の記事と同じ手順でrttestコンテナを起動し,以下のコマンドを実行します。
100ms周期で1時間テストを実行し,レイテンシ3000[us]までのヒストグラムを表示します。
# cyclictest --smp --priority=99 --interval=100000 --distance=0 -l36000 -h3000
結果
以下のような結果が得られました。
T: 0 ( 31) P:99 I:100000 C: 36000 Min: 5 Act: 11 Avg: 10 Max: 3417 T: 1 ( 32) P:99 I:100000 C: 36000 Min: 7 Act: 21 Avg: 14 Max: 4488 T: 2 ( 33) P:99 I:100000 C: 36000 Min: 5 Act: 14 Avg: 14 Max: 4390 T: 3 ( 34) P:99 I:100000 C: 36000 Min: 5 Act: 11 Avg: 10 Max: 4498 # Histogram 000000 000000 000000 000000 000000 000001 000000 000000 000000 000000 000002 000000 000000 000000 000000 000003 000000 000000 000000 000000 000004 000000 000000 000000 000000 000005 000001 000000 000007 000017 000006 000058 000000 000498 000537 000007 001017 000003 004293 005340 000008 006554 000034 008831 009400 000009 009585 000258 007380 008309 000010 007967 001102 005890 005945 000011 005389 003659 003540 003257 000012 002894 007126 001574 001387 000013 001071 006705 000727 000624 000014 000442 005549 000406 000293 000015 000200 004313 000270 000208 000016 000136 003121 000205 000124 000017 000098 001697 000159 000081 000018 000053 000799 000113 000058 000019 000038 000385 000096 000033 000020 000035 000205 000076 000029 000021 000027 000176 000086 000017 000022 000018 000111 000073 000026 000023 000009 000087 000087 000011 000024 000021 000064 000102 000010 000025 000039 000058 000065 000022 ... 002996 000000 000000 000000 000000 002997 000000 000000 000000 000000 002998 000000 000000 000000 000000 002999 000000 000000 000000 000000 # Total: 000035997 000035996 000035993 000035998 # Min Latencies: 00005 00007 00005 00005 # Avg Latencies: 00010 00014 00014 00010 # Max Latencies: 03417 04488 04390 04498 # Histogram Overflows: 00003 00004 00007 00002 # Histogram Overflow at cycle number: # Thread 0: 19250 24091 34394 # Thread 1: 24091 30057 34394 34806 # Thread 2: 16096 17984 24091 28377 30057 32070 34394 # Thread 3: 19250 28377
最大レイテンシは4498[us]ですが,平均は約10[us]です。
これくらいの精度で十分な用途であればコンテナでのリアルタイムアプリケーションも使えるのではないでしょうか。
ヒストグラムを25[us]までグラフ化すると以下のようになります。
結構10us付近にまとまっています。CPU1はどうしたのか・・・