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 10
fü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 stat
nicht 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 stat
und Überwachen des docker run stress-ng
Befehls nicht den eigentlichen stress-ng
Prozess überwachen. Es ist wichtig zu beachten, dass die Prozesse, die als Teil des Containers ausgeführt werden, tatsächlich nicht vom docker
Client gestartet werden, sondern vom docker-containerd-shim
Prozess (der ein untergeordneter Prozess des dockerd
Prozesses ist).
Wenn Sie den Docker-Befehl ausführen, um stress-ng
ihn 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-ng
Prozesses ist 26431, was nicht der docker run
Befehl, sondern eigentlich der docker-containerd-shim
Prozess ist. Die Überwachung des docker run
Befehls wird niemals korrekte Werte wiedergeben, da der docker
Client vollständig vom Prozess des Startens der stress-ng
Befehle losgelöst ist.
- Eine Möglichkeit, dieses Problem zu umgehen, wäre, den
perf stat
Befehl an die PIDs der stress-ng-Prozesse anzuhängen, die von der Docker-Laufzeit gestartet werden.
zB, wie im obigen Fall, sobald der docker run
Befehl 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 --timeout
etwas erhöhen, damit der Befehl länger läuft, da Sie jetzt mit dem Start perf stat
beginnen stress-ng
. Außerdem müssen Sie einen kleinen Bruchteil der verlorenen anfänglichen Messzeit berücksichtigen.
- Die andere Möglichkeit wäre,
perf stat
innerhalb des Docker-Containers zu laufen, so etwas wie einedocker run perf stat...
, aber dafür müssten Sie damit beginnen,privileges
Ihren Container bereitzustellen, da derperf_event_open
Systemaufruf standardmäßig indocker
. Diese Antwort können Sie hier lesen.
Keine Kommentare:
Kommentar veröffentlichen