yosupo06/library-checker-judge

実行時間を安定させる

yosupo06 opened this issue · 0 comments

(そもそもGCEで動いているし限界はあるんだけど…)実行時間のブレを減らせると嬉しそう

とりあえずコンテナがCPUをできる限り専有できると良さそう

調べた限り

  • nice値をいい感じにする
  • isolcpusを使う
  • cgroupを巧みに扱う

という選択肢が見つかった とりあえずcgroupについて調べた、以下のように動きそう?

環境: 2023/01/24時点のGCEのubuntu 22.04のデフォルトイメージ cgroup v2を使っている

  1. 新しくcgroupを作り、cpuset.cpus.partitionを設定する
mkdir /sys/fs/cgroup/test.slice/
echo '0,1' > /sys/fs/cgroup/test.slice/cpuset.cpus
echo 'root' > /sys/fs/cgroup/test.slice/cpuset.cpus.partition

どうやらrootよりisolatedのほうが良さそうっぽいが、まだ使えなそう https://lore.kernel.org/linux-rt-users/20211112163707.GA315388@lothringen/T/

この設定をした時点で、test.sliceがcpu 0,1 (= physical core 0)を専有、兄弟のcgroup (= すべてのプロセス)がcpu 0,1以外を使えなくなる という認識

  1. dockerのコンテナをこのcgroup以下につくる
stress --cpu 3 --timeout 1m # cpu 2,3のみを使う
docker run --rm -it --cgroup-parent=test.slice makocchi/alpine-stress --cpu 3 --timeout 1m # cpu 0,1のみを使う

なお--cpuset=0,1を引数に足すとdocker: Error response from daemon: Requested CPUs are not available - requested 0,1, available: 2-3と怒られる ワンチャンdockerのバグかも