実行時間がうまく取れない場合がある
yosupo06 opened this issue · 2 comments
docker inspectで得られるstartedAt / finishedAtはちょっと(数ms)誤差があるので直接cgroupを読みに行っているが、うまくいかない場合がある 多分cgroup v1 or (cgroup v2 + crun)しか動かなくて、cgroup v2 + runcだと動かない 直るとよい
実行時間が取れないことについての詳細を書き残しておきます。
filePathV1 := "/sys/fs/cgroup/cpu/docker/" + c.containerID + "/tasks"
cgroupはv1でこのファイルは作成されていてファイルの内容も読めるのですが、ファイルの内容が常に空になっており
tasks, err := c.readCGroupTasks()
if err == nil && len(tasks) >= 2 {
if !cm.isStarted {
cm.isStarted = true
cm.start = time.Now()
}
cm.end = time.Now()
}
ここのlen(tasks) >= 2が満たされることはなくcm.startにもcm.endにも値が入らないという状況です。
使用メモリの方はファイルに値があって正常に計測できるので実行時間だけが取れません。
実行環境
ubuntu(WSL2)
VERSION="20.04 LTS (Focal Fossa)"
docker info
Client:
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc., v0.8.2)
compose: Docker Compose (Docker Inc., v2.6.0)
sbom: View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc., 0.6.0)
scan: Docker Scan (Docker Inc., v0.17.0)
Server:
Containers: 100
Running: 4
Paused: 0
Stopped: 96
Images: 31
Server Version: 20.10.16
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 212e8b6fa2f44b9c21b2798135fc6fb7c53efc16
runc version: v1.1.1-0-g52de29d
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 5.10.102.1-microsoft-standard-WSL2
Operating System: Docker Desktop
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 7.692GiB
Name: docker-desktop
ID: UL4V:B6CA:PI24:VTBG:QRUH:RRRS:TPEE:TDVS:QBV3:XZCI:PFWP:3LU6
Docker Root Dir: /var/lib/docker
Debug Mode: false
HTTP Proxy: http.docker.internal:3128
HTTPS Proxy: http.docker.internal:3128
No Proxy: hubproxy.docker.internal
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
hubproxy.docker.internal:5000
127.0.0.0/8
Live Restore Enabled: false
自分が動かそうとした環境がwsl2+DockerDesktopなんですが、
Ubuntuディストリビューションでdockerを使用しても実際にはdocker-desktopディストリビューションでプロセスが走っているみたいでPIDが異なるのが原因のように思います。
自分の環境ではWindowsマシン上でwsl --list
と打つと以下のようにインストールされているディストリビューションが表示されます。
Ubuntu (既定)
Ubuntu-22.04
docker-desktop-data
docker-desktop
Ubuntuディストリビューションにlibrary-checkerのソースを落として環境構築をしたのですが、
launch_local.shを実行してジャッジは動くのですが、ps axu
でプロセス一覧を表示してもlibrary-checker関連のプロセスが確認できません。
このときdocker-desktopディストリビューションにログインしてps axu
でプロセス一覧を表示するとlibrary-checker関連のプロセスが確認できました。
そしてdocker-desktopディストリビューション側から/sys/fs/cgroup/cpu/docker/containerID/tasks
のファイルの中を見るとPIDのリストがありました。
Ubuntuディストリビューション側からは同じファイルにアクセスできるのですが、
/sys/fs/cgroup/cpu/docker/containerID/tasks
に記載されたPIDのプロセスはUbuntuディストリビューション側では存在しません。(そもそもPID一覧が全く別物なので)
このため/sys/fs/cgroup/cpu/docker/containerID/tasks
の内容が空で表示されるのではないかと思います。
※Dockerを入れる時はたしかここを見ながらやりました
https://docs.docker.jp/desktop/windows/install.html
※関係あるかもしれない情報
https://lists.linuxfoundation.org/pipermail/containers/2017-February/037776.html
https://lists.linuxfoundation.org/pipermail/containers/2017-February/037777.html