yosupo06/library-checker-judge

実行時間がうまく取れない場合がある

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