![systemd/cgroup 资源限制——主机之间的不同行为](https://linux22.com/image/207744/systemd%2Fcgroup%20%E8%B5%84%E6%BA%90%E9%99%90%E5%88%B6%E2%80%94%E2%80%94%E4%B8%BB%E6%9C%BA%E4%B9%8B%E9%97%B4%E7%9A%84%E4%B8%8D%E5%90%8C%E8%A1%8C%E4%B8%BA.png)
我很困惑。我有一个运行 Ubuntu 20.04 的物理服务器和一个vagrant
也运行 Ubuntu 20.04 的 (VirtualBox) 虚拟机。两者都使用hwe
5.13 内核运行,并且systemd 245 (245.4-4ubuntu3.17)
我在两者上都设置systemd.unified_cgroup_hierarchy=1
为使用cgroup-v2
.重新启动后,它们cgroup-v2
都已安装并且没有v1
,因此系统干净v2
。
第一个问题
第一个区别在于启用的默认控制器。cat /sys/fs/cgroup/cgroup.subtree_control
:
cpuset cpu io memory pids
在虚拟机上io memory pids
在物理机上
第一个问题:为什么? :) 以及如何控制默认启用哪些控制器?我尝试设置DefaultCPUAccounting=yes
但这没有帮助。并且echo "+cpu" >> ...
只是暂时的。
第二个问题
我尝试使用设置限制cgroup
。我决定使用限制 IO 带宽IOWriteBandwidthMax
并使用 进行测试dd
。
sudo systemctl set-property --runtime user-1000.slice IOWriteBandwidthMax="/home 20M"
进而:
dd status=progress if=/dev/zero of=kamil.test bs=1M count=2000
这适用于虚拟机:
2079326208 bytes (2.1 GB, 1.9 GiB) copied, 102 s, 20.4 MB/s 2000+0 records in 2000+0 records out 2097152000 bytes (2.1 GB, 2.0 GiB) copied, 102.964 s, 20.4 MB/s
但不在物理主机上:
2000+0 przeczytanych rekordów 2000+0 zapisanych rekordów skopiowane 2097152000 bajtów (2,1 GB, 2,0 GiB), 1,10876 s, 1,9 GB/s
限制设置正确systemctl cat user-1000.slice
::
# /usr/lib/systemd/system/user-.slice.d/10-defaults.conf
# SPDX-License-Identifier: LGPL-2.1+
#
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=User Slice of UID %j
Documentation=man:[email protected](5)
After=systemd-user-sessions.service
StopWhenUnneeded=yes
[Slice]
TasksMax=33%
# /run/systemd/system.control/user-1000.slice.d/50-CPUQuota.conf
# This is a drop-in unit file extension, created via "systemctl set-property"
# or an equivalent operation. Do not edit.
[Slice]
CPUQuota=
# /run/systemd/system.control/user-1000.slice.d/50-IOWriteBandwidthMax.conf
# This is a drop-in unit file extension, created via "systemctl set-property"
# or an equivalent operation. Do not edit.
[Slice]
IOWriteBandwidthMax=
IOWriteBandwidthMax=/home 20000000
为什么哦,为什么这在虚拟机上有效,而不在物理机上有效? (两个用户都有 UID 1000
,并且两个命令都在各自的主目录中运行)。我在这里迷路了,请寻求解释:)
编辑:18:20
当我添加到 时oflag=sync
,dd
限制起作用。如果没有该标志,则完整速度为 2 GB/s。我设置/home 5M
:
dd status=progress if=/dev/zero of=kamil.test bs=1M count=2000 oflag=sync
skopiowane 614465536 bajtów (614 MB, 586 MiB), 123 s, 5,0 MB/s^C
586+0 przeczytanych rekordów
586+0 zapisanych rekordów
skopiowane 614465536 bajtów (614 MB, 586 MiB), 123,062 s, 5,0 MB/s
我怀疑某种形式的缓存。当创建文件几乎是即时的时,调用sync
命令会挂起 shell——它可能会等待传输。systemd-cgtop
这次在我的切片中显示了几 MB/s。
亲切的问候