為什麼 cpu.cfs_quota_us 不限制 LXC 容器的 CPU 頻寬?

為什麼 cpu.cfs_quota_us 不限制 LXC 容器的 CPU 頻寬?

我想將容器限制為系統總 CPU 頻寬的 25%。
這是我的設定:

  • LXC版本1.0.2
  • 內核3.2.45
  • 一位使用者為 LXC 容器建立了 cgroup (foo)
  • 主機上有 40 個可用核心
  • 主機和容器對每個其他 cgroup 子系統都有預設值,除了:
  • /sys/fs/cgroup/cpu/lxc/foo/cpu.cfs_quota_us = 400000
  • /sys/fs/cgroup/cpu/lxc/foo/cpu.cfs_period_us = 100000
  • /sys/fs/cgroup/cpuset/lxc/foo/cpuset.cpus = 0-15

我使用以下公式計算了配額:

(# of cpus available to container) * (cpu.cfs_period_us) * (.25) so 16 * 100000 * .25 = 400000

我在容器內部和外部同時運行了基本的stress-ng,以衡量每秒允許內部和外部的操作次數,結果與使用配額「-1」運行基本相同,也就是說沒有配額。

外跑:

$ ./stress-ng  --cpu-load 50 -c 40 --timeout 20s --metrics-brief
stress-ng: info: [25649] dispatching hogs: 40 cpu  
stress-ng: info: [25649] successful run completed in 20.44s  
stress-ng: info: [25649] stressor      bogo ops real time  usr time  sys time   bogo ops/s   bogo ops/s  
stress-ng: info: [25649]                          (secs)    (secs)    (secs)   (real time) (usr+sys time)  
stress-ng: info: [25649] cpu              37348     20.18    380.56      0.58      1850.85        97.99  

內跑:

$ ./stress-ng --cpu-load 100 -c 16 --timeout 20s --metrics-brief  
stress-ng: info: [34256] dispatching hogs: 16 cpu  
stress-ng: info: [34256] successful run completed in 20.10s  
stress-ng: info: [34256] stressor      bogo ops real time  usr time  sys time   bogo ops/s   bogo ops/s  
stress-ng: info: [34256]                          (secs)    (secs)    (secs)   (real time) (usr+sys time)  
stress-ng: info: [34256] cpu              24147     20.03    205.20      0.17      1205.67       117.58  

根據操作,我得到了 39%。為什麼會出現這種情況?不應該被限制嗎cpu.cfs_quota_us

我在這裡先向您的幫助表示感謝。

答案1

想發布這個問題的答案,以防其他人看到類似的令人困惑的結果。看起來我有兩個問題:

  • 需要使用主機上的 cpu 數,而不是 cgroups cpuset 中的可用 CPU 數來估計 CPU 頻寬:

    (# of cpus on the host) * (cpu.cfs_period_us) * (.25) so 40 * 100000 * .25 = 1000000

  • 我在容器內運行的stress-ng使用/lxc/foo cgroup的cpu和cpuset控制器,而在容器外部運行的stress-ng使用/system/sshd.service cgroup

為了更好地模擬我的現實世界應用程序,我應該透過使用指定要使用的控制器執行程式:

$ cgexec -g cpuset:/lxc/foo -g cpu:/lxc/foo ./stress-ng --cpu-load 100 -c 48 --times --timeout 10s --metrics-brief  
stress-ng: info: [6252] dispatching hogs: 48 cpu  
stress-ng: info: [6252] successful run completed in 10.36s  
stress-ng: info: [6252] stressor      bogo ops real time  usr time  sys time   bogo ops/s   bogo ops/s  
stress-ng: info: [6252]                          (secs)    (secs)    (secs)   (real time) (usr+sys time)  
stress-ng: info: [6252] cpu              11152     10.09    102.83      0.12      1105.60       108.32  
stress-ng: info: [6252] for a 10.36s run time:  
stress-ng: info: [6252]     414.46s available CPU time  
stress-ng: info: [6252]     102.85s user time   ( 24.82%)  
stress-ng: info: [6252]       0.12s system time (  0.03%)  
stress-ng: info: [6252]     102.97s total time  ( 24.84%)  

相關內容