Open9

Linux 5.14 memo

TenForwardTenForward

気になる make oldconfig

  • Cgroup I/O controller for assigning an I/O priority class (BLK_CGROUP_IOPRIO)
TenForwardTenForward

"kill" button for cgroup

cgroup2 のみ出現する cgroup.kill (root以外)

root@plamo7:~# lxc-start c1
root@plamo7:~# lxc-info c1
Name:           c1
State:          RUNNING
PID:            2985
IP:             10.0.3.23
Link:           vethMZ1HJe
 TX bytes:      1.51 KiB
 RX bytes:      1.90 KiB
 Total bytes:   3.41 KiB
root@plamo7:~# pstree -p 2985
init(2985)─┬─crond(3215)
           ├─getty(3324)
           ├─getty(3325)
           ├─getty(3326)
           ├─getty(3327)
           ├─getty(3328)
           ├─syslogd(3187)
           └─udhcpc(3307)
root@plamo7:~# cat /proc/2985/cgroup 
0::/lxc.payload.c1
(ここで /lxc.payload.c1/cgroup.procs も確認すべきよね)
root@plamo7:~# echo 1 > /sys/fs/cgroup/lxc.payload.c1/cgroup.kill 
root@plamo7:~# lxc-info c1
Name:           c1
State:          STOPPED
root@plamo7:~# pstree -p 2985
root@plamo7:~# 
root@plamo7:~# tail -n3 /var/lib/lxc/c1/c1.log 
lxc-start c1 20210917125301.639 INFO     error - /Plamo-src/plamo/16_virtualization/lxc/lxc-4.0.4/src/lxc/error.c:lxc_error_set_and_log:33 - Child <2985> ended on signal (9)
lxc-start c1 20210917125301.719 INFO     network - /Plamo-src/plamo/16_virtualization/lxc/lxc-4.0.4/src/lxc/network.c:lxc_delete_network_priv:3232 - Removed interface "vethMZ1HJe" from "lxcbr0"
lxc-start c1 20210917125301.761 INFO     conf - /Plamo-src/plamo/16_virtualization/lxc/lxc-4.0.4/src/lxc/conf.c:run_script_argv:340 - Executing script "/usr/share/lxcfs/lxc.reboot.hook" for container "c1", config section "lxc"
TenForwardTenForward

memo

# cat /sys/fs/cgroup/cpu/test/cpu.cfs_*_us
250000
100000
300000


Latency percentiles (usec) runtime 30 (s) (15609 total samples)
	50.0th: 8496 (7815 samples)
	75.0th: 11728 (3894 samples)
	90.0th: 14992 (2389 samples)
	95.0th: 15120 (734 samples)
	*99.0th: 19232 (624 samples)
	99.5th: 19936 (75 samples)
	99.9th: 22624 (63 samples)
	min=5, max=41572
rps: 520.30 p95 (usec) 15120 p99 (usec) 19232 p95/cputime 302.40% p99/cputime 384.64%

# cat /sys/fs/cgroup/cpu/test/cpu.cfs_*_us
0
100000
300000

Latency percentiles (usec) runtime 30 (s) (15576 total samples)
	50.0th: 8168 (7789 samples)
	75.0th: 11952 (3893 samples)
	90.0th: 14992 (2341 samples)
	95.0th: 15184 (785 samples)
	*99.0th: 23072 (613 samples)
	99.5th: 28320 (79 samples)
	99.9th: 33088 (61 samples)
	min=6, max=48128
rps: 519.20 p95 (usec) 15184 p99 (usec) 23072 p95/cputime 303.68% p99/cputime 461.44%

# cat /sys/fs/cgroup/cpu/test/cpu.cfs_*_us
0
100000
-1

Latency percentiles (usec) runtime 30 (s) (15609 total samples)
	50.0th: 8432 (7813 samples)
	75.0th: 11600 (3895 samples)
	90.0th: 14992 (2454 samples)
	95.0th: 15120 (773 samples)
	*99.0th: 18848 (520 samples)
	99.5th: 19936 (89 samples)
	99.9th: 23904 (50 samples)
	min=5, max=33263
rps: 520.30 p95 (usec) 15120 p99 (usec) 18848 p95/cputime 302.40% p99/cputime 376.96%
TenForwardTenForward

[PATCH v2] sched/fair: add burst to cgroup cpu bandwidth controller のコメント日本語訳

Currently CFS bandwidth controller assigns cpu.cfs_quota_us runtime into global pool every cpu.cfs_period_us. All unused runtime is expired.

現在、CFS bandwidth コントローラーは cpu.cfs_quota_us 実行時間を cpu.cfs_period_us ごとにグローバルプールに割り当てます。使われなかった実行時間は失効します。

Since commit de53fd7aedb1 ("sched/fair: Fix low cpu usage with high throttling by removing expiration of cpu-local slices") slice assigned to cpu does not expire. This allows to serve tiny bursts (upto 1ms), but this runtime pool is cpu-bound and not transferred between cpus.

コミット de53fd7aedb1 ("sched/fair: Fix low cpu usage with high throttling by removing expiration of cpu-local slices") 以来、CPU に割り当てたスライスは失効しません。これにより、小さなバースト(最大 1ms)を提供できますが、この実行時間のプールは CPU 固定であり、CPU 間では転送されません。

Setup for interactive workload with irregular cpu consumption have to set quota according to relatively short spikes of cpu usage. This eliminates possibility of control for average cpu usage. Increasing period and quota proportionally for getting bigger runtime chunks is not an option because if even bigger spike deplete global pool then execution will stuck until end of period and next refill.

不規則な CPU 消費の双方向(interactive)なワークロードは、CPU 消費の比較的短いスパイクに対してクォータを設定する必要があります。これは、平均的な CPU 消費に対するコントロールできなくなります。より大きな実行時間のチャンクを取得するために、間隔(period)とクォータを増やすことは選択肢ではありません。なぜなら、より大きなスパイクがグローバルなプールを枯渇させるような場合、間隔(period)の終了と次の間隔(refill)まで実行が停止するからです。

This patch adds limited accumulation of unused runtime from past periods. Accumulated runtime does not expire. It stays in global pool and could be used by any cpu. Average cpu usage stays limited with quota / period, but spiky workload could use more cpu power for a short period of time.

このパッチは、過去の間隔(period)から未使用の実行時間を限定的に蓄積する機能を追加します。蓄積された実行時間は失効しません。この実行時間はグローバルプールに留まり、どの CPU でも使えます。平均的な CPU 消費は間隔(period)ごとのクォータで資源されたままですが、スパイクするようなワークロードは短い時間間隔でより多くの CPU パワーを使える可能性があります。

Size of pool for burst runtime is set in attribute cpu.cfs_burst_us. Default is 0, which reflects current behavior.

バースト実行時間のプールのサイズは cpu.cfs_burst_us 属性で設定します。デフォルトは 0 であり、これは元の動作と一致します。

Statistics for used bust runtime is shown in cpu.stat as "burst_time".

使用したバーストランタイムの統計は cpu.stat に "burst_time" で表示されます。

Example setup:

設定例:

cpu.cfs_period_us = 100000
cpu.cfs_quota_us = 200000
cpu.cfs_burst_us = 300000

Average cpu usage stays limited with 2 cpus (quota / period), but cgroup could accumulate runtime (burst) and for 100ms could utilize up to 5 cpus (quota / period + burst / 100ms), or 3 cpus for 300ms, an so on.

平均的なCPU使用量は2CPU(quota / period)に制限されたままですが、cgroupはランタイム(バースト)を蓄積し、100msで最大5CPU(quota / period + burst / 100ms)、300msで3CPU、といったように使用できる可能性があります。

For example, in this cgroup sample workload with bursts:

例えば、このcgroupのサンプルワークロードでは、バーストを使用しています。

fio --name=test --ioengine=cpuio --time_based=1 --runtime=600 \
	   --cpuload=10 --cpuchunks=100000 --numjobs=5

has 50% average cpu usage without throttling. Without enabling bursts same command can utilize only 25% cpu and 25% time will be throttled.

は、スロットルなしで平均50%のCPU使用率です。バーストを有効にしない場合、同じコマンドで25%のcpuしか使用できず、25%の時間がスロットルされることになります。

Implementation is simple. All logic is in __refill_cfs_bandwidth_runtime(). Burst pool is kept in common pool thus runtime distribution is unchanged. The rest changes are interface for cgroup and cgroup2.

実装は簡単です。すべてのロジックは __refill_cfs_bandwidth_runtime() の中にあります。バーストプールは共通プールに保持されるため、ランタイムの分配は変更されません。残りの変更は、cgroup と cgroup2 のインターフェイスです。

For cgroup2 burst is set as third number in attribute cpu.max: cpu.max = $QUOTA $PERIOD $BURST

cgroup2 では、バーストは cpu.max 属性の 3 番目の数値として設定されます: cpu.max = $QUOTA $PERIOD $BURTS

At changing setup cgroup gets full charge of runtime and burst runtime.

この設定変更により、cgroupはランタイムとバーストランタイムをフルチャージするようになります。