GOOGLE ADS

Dienstag, 12. April 2022

Wie verwende ich das Perf-Tool mit Docker, auf dem Stress-ng ausgeführt wird?

Ich verwende das Stress-ng-Docker-Image von https://hub.docker.com/r/polinux/stress-ng/dockerfile, um mein System zu belasten. Ich möchte das Perf-Tool verwenden, um Metriken zu überwachen.

perf stat -- stress-ng --cpu 2 --timeout 10führt stress-ng 10 Sekunden lang aus und gibt Leistungsmetriken zurück. Ich habe versucht, dasselbe mit dem Docker-Image zu tun, indem ich perf stat -- docker run -ti --rm polinux/stress-ng --cpu 2 --timeout 10. Dies gibt Metriken zurück, aber nicht die Metriken von stress-ng.

Die Ausgabe, die ich bei der Verwendung von 'perf stat' auf stress-ng erhalten habe:

Performance counter stats for 'stress-ng --cpu 2 --timeout 10':
19975.863889 task-clock (msec) # 1.992 CPUs utilized
2,057 context-switches # 0.103 K/sec
7 cpu-migrations # 0.000 K/sec
8,783 page-faults # 0.440 K/sec
52,568,560,651 cycles # 2.632 GHz
89,424,109,426 instructions # 1.70 insn per cycle
17,496,929,762 branches # 875.904 M/sec
97,910,697 branch-misses # 0.56% of all branches
10.025825765 seconds time elapsed

Die Ausgabe, die ich bei der Verwendung des Perf-Tools für das Docker-Image erhalten habe:

Performance counter stats for 'docker run -ti --rm polinux/stress-ng --cpu 2 --timeout 10':
154.613610 task-clock (msec) # 0.014 CPUs utilized
858 context-switches # 0.006 M/sec
113 cpu-migrations # 0.731 K/sec
4,989 page-faults # 0.032 M/sec
252,242,504 cycles # 1.631 GHz
375,927,959 instructions # 1.49 insn per cycle
84,847,109 branches # 548.769 M/sec
1,127,634 branch-misses # 1.33% of all branches
10.704752134 seconds time elapsed

Kann mir bitte jemand helfen, wie ich Stress-ng-Metriken bekomme, wenn sie mit Docker ausgeführt werden?


Lösung des Problems

Fortsetzung von Kommentaren von @osgx,

Wie hier erwähnt, überwacht der Befehl standardmäßig perf statnicht nur alle Threads des zu überwachenden Prozesses, sondern auch seine untergeordneten Prozesse und Threads.

Das Problem in dieser Situation besteht darin, dass Sie durch Ausführen perf statund Überwachen des docker run stress-ngBefehls nicht den eigentlichen stress-ngProzess überwachen. Es ist wichtig zu beachten, dass die Prozesse, die als Teil des Containers ausgeführt werden, tatsächlich nicht vom dockerClient gestartet werden, sondern vom docker-containerd-shimProzess (der ein untergeordneter Prozess des dockerdProzesses ist).

Wenn Sie den Docker-Befehl ausführen, um stress-ngihn innerhalb des Containers auszuführen, und den Prozessbaum beobachten, wird dies offensichtlich.

docker run -ti --name=stress-ng --rm polinux/stress-ng --cpu 2 --timeout 100
ps -elf | grep docker
0 S ubuntu 26379 114001 0 80 0 - 119787 futex_ 12:33 pts/3 00:00:00 docker run -ti --name=stress-ng --rm polinux/stress-ng --cpu 2 --timeout 10000
4 S root 26431 118477 0 80 0 - 2227 - 12:33? 00:00:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/72a8c2787390669ff4eeae6f343ab4f9f60434f39aae66b1a778e78b7e5e45d8 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
0 S ubuntu 26610 26592 0 80 0 - 3236 pipe_w 12:34 pts/6 00:00:00 grep --color=auto docker
4 S root 118453 1 3 80 0 - 283916 - May02? 01:01:57 /usr/bin/dockerd -H fd://
4 S root 118477 118453 4 80 0 - 457853 - May02? 01:14:36 docker-containerd --config /var/run/docker/containerd/containerd.toml
----------------------------------------------------------------------
ps -elf | grep stress-ng
0 S ubuntu 26379 114001 0 80 0 - 119787 futex_ 12:33 pts/3 00:00:00 docker run -ti --name=stress-ng --rm polinux/stress-ng --cpu 2 --timeout 10000
4 S root 26455 26431 0 80 0 - 16621 - 12:33 pts/0 00:00:00 /usr/bin/stress-ng --cpu 2 --timeout 10000
1 R root 26517 26455 99 80 0 - 16781 - 12:33 pts/0 00:01:08 /usr/bin/stress-ng --cpu 2 --timeout 10000
1 R root 26518 26455 99 80 0 - 16781 - 12:33 pts/0 00:01:08 /usr/bin/stress-ng --cpu 2 --timeout 10000
0 S ubuntu 26645 26592 0 80 0 - 3236 pipe_w 12:35 pts/6 00:00:00 grep --color=auto stress-ng

Die PPID des ersten stress-ngProzesses ist 26431, was nicht der docker runBefehl, sondern eigentlich der docker-containerd-shimProzess ist. Die Überwachung des docker runBefehls wird niemals korrekte Werte wiedergeben, da der dockerClient vollständig vom Prozess des Startens der stress-ngBefehle losgelöst ist.


  • Eine Möglichkeit, dieses Problem zu umgehen, wäre, den perf statBefehl an die PIDs der stress-ng-Prozesse anzuhängen, die von der Docker-Laufzeit gestartet werden.


zB, wie im obigen Fall, sobald der docker runBefehl gestartet wurde, können Sie sofort damit beginnen -

perf stat -p 26455,26517,26518
Performance counter stats for process id '26455,26517,26518':
148171.516145 task-clock (msec) # 1.939 CPUs utilized
49 context-switches # 0.000 K/sec
0 cpu-migrations # 0.000 K/sec
67 page-faults # 0.000 K/sec

Sie können den --timeoutetwas erhöhen, damit der Befehl länger läuft, da Sie jetzt mit dem Start perf statbeginnen stress-ng. Außerdem müssen Sie einen kleinen Bruchteil der verlorenen anfänglichen Messzeit berücksichtigen.


  • Die andere Möglichkeit wäre, perf statinnerhalb des Docker-Containers zu laufen, so etwas wie eine docker run perf stat..., aber dafür müssten Sie damit beginnen, privilegesIhren Container bereitzustellen, da der perf_event_openSystemaufruf standardmäßig in docker. Diese Antwort können Sie hier lesen.

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...