tshell_blog

ソフトウェアと車輪がついた乗り物のはなし

Dockerコンテナでのcyclictest実行結果

前回はDockerコンテナでcyclictestを動作させるところまでやってみました。

tshell.hatenablog.com

今回は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は以下の図のように一定時間ごとにリアルタイムスレッドを起動して,理想とするスレッドの起動時刻と実際にスレッドが起動した時刻との差(レイテンシ)を計測するテストです。

f:id:tshell:20200211221903p:plain

当然レイテンシは低ければ低いほどよいと言えます。

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]までグラフ化すると以下のようになります。

f:id:tshell:20200211222737p:plain

結構10us付近にまとまっています。CPU1はどうしたのか・・・