我正在尝试获取进程组的网络统计信息。据我所知,Linux 上的复杂网络记帐通常是使用 netfilter/iptables 的记帐基础结构完成的。
因为我想为这样的群体继承遗产cgroups将是一个很好的匹配。
我最好的想法是让 iptables 匹配classid可以使用net_cls-controller设置的。
但似乎,iptables的只能设置通过这个值--set--class。
那么:是否有一种很好的方法可以为 Linux 上的进程组获取(复杂而灵活的)网络记帐和日志记录?
我想限制每个用户对系统的使用。由于 Systemd 对 cgroups 有本机支持,我认为使用用户切片是可行的方法。
问题是:我不知道如何设置个人限制。我可以编辑 user.slice 单元文件以设置共同适用于所有用户切片的限制,但我没有看到对这些用户切片进行模板化的方法。
我可以通过创建一个 user-(uid).slice 单元文件来覆盖单个用户的这些设置,但我更愿意默认对所有用户应用限制。
是否可以设置默认限制?
编辑:经过一番探索后,我发现用户切片的单元文件是在 /run/systemd/system/ 中创建的。
[foo@bar Downloads]$ systemctl cat user-1000.slice
# /run/systemd/system/user-1000.slice
# Transient stub
# /run/systemd/system/user-1000.slice.d/50-After-systemd-logind\x2eservice.conf
[Unit]
After=systemd-logind.service
# /run/systemd/system/user-1000.slice.d/50-After-systemd-user-sessions\x2eservice.conf
[Unit]
After=systemd-user-sessions.service
# /run/systemd/system/user-1000.slice.d/50-Description.conf
[Unit]
Description=User Slice of foo
# /run/systemd/system/user-1000.slice.d/50-TasksMax.conf
[Slice]
TasksMax=infinity
Run Code Online (Sandbox Code Playgroud)
这些文件由 systemd 中的这段代码构建:https : //github.com/systemd/systemd/blob/401e33ed56f3cd3736bbab02ca6eb31aa592cf53/src/login/logind-dbus.c#L2928-L2998
这个文件的创建似乎被硬编码到 systemd 源代码中,并且不允许使用模板。
为什么 free 命令报告的内存使用量与 cgroup 的内存使用量有很大不同?
$ free -b
total used free shared buff/cache available
Mem: 2096914432 520863744 1112170496 35389440 463880192 1356828672
Swap: 2145382400 0 2145382400
$ cat /sys/fs/cgroup/memory/memory.usage_in_bytes
857239552
Run Code Online (Sandbox Code Playgroud)
cgroups 的文档说 memory.usage_in_bytes 是一个“模糊值”。我猜这只是意味着它报告的估计值接近实际值。即使这是一个估计,我认为也不应该相差这么远。
我在 VirutalBox 虚拟机中运行 Linux Mint 18.2。
我在 ubuntu 14.04 上使用 lxc 用户空间工具,我想在容器内执行一些压力测试和基准测试。我知道 free 和 htop 在容器中不能正常工作。
我在容器中使用 dd 和 bonnie++ 来强调它是 SSD 的硬盘。
现在在主机端,使用 iotop 我可以看到使用的读写 io 带宽,但在 cgroups 中我确实有不同的结果。cgroup 仅捕获一小部分服务字节,而 iotop 显示数百兆字节的带宽使用情况。
在 cgroups 中,我正在捕获此条目:/sys/fs/cgroup/lxc/disk_stress/blkio.throttle.io_service_bytes
任何想法为什么值不相等?哪一个是正确的?
以 systemd-cgls 中的层次结构为例:
\n\n\xe2\x94\x94\xe2\x94\x80user.slice\n \xe2\x94\x9c\xe2\x94\x80user-1000.slice\n \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80user@1000.service\n \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80init.scope\n \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x803262 /lib/systemd/systemd --user\n \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x803263 (sd-pam) \n \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80session-3.scope\n \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x803260 sshd: user1 [priv]\n \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x803362 sshd: user1@pts/1 \n \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x803363 -bash\n \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x803378 ssh-agent -s\n \xe2\x94\x94\xe2\x94\x80user-0.slice\n \xe2\x94\x9c\xe2\x94\x80session-1.scope\n \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x803151 sshd: root@pts/0 \n \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x803252 -bash\n \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x803625 systemd-cgls\nRun Code Online (Sandbox Code Playgroud)\n\n如果我为 user.slice 设置限制,例如 5M 内存,Memory 行会清楚地报告它:
\n\nsystemctl status user.slice\n\xe2\x97\x8f user.slice\n Loaded: loaded (/etc/systemd/system/user.slice; static; vendor preset: enabled)\n Active: active since Mon 2016-08-22 11:32:13 CEST; 52min …Run Code Online (Sandbox Code Playgroud) 我管理着几个基于 Linux 的服务器,我们正在考虑将几个 JBoss 应用程序以及几个在 Apache 上运行的网站从具有 4 个内核的 RHEL 5.5(64 位)服务器迁移到具有24核。我的主管提到了使用 cgroups 来管理新服务器上的内存/CPU 分配的可能性。我自己做了一些阅读/研究,并且对 cgroups 的目的和它们可以做什么有很好的理解。
我的问题是,运行 cgroups 有什么好处,这是管理 JBoss 应用程序的有效方法吗?
我正在从 Xen 过渡到 KVM,并将使用 Fedora 14。我计划使用 cgroups 为 VM 分配优先级。
我的问题如下:如果我将虚拟机放在不同的 cgroup 中,我是否也应该将所有其他 Domain-0(物理主机)进程放在单个 cgroup 中,然后分配较低的优先级?Xen 的类比是当 Dom0“VM”被调度时,所有的 Dom0 进程都是批量调度的,所以通过将它们全部放在同一个 cgroup 中,我将模拟这种行为。但是,由于 KVM 没有与 Xen 相同的 Dom0 IO 依赖性,我可以为 Dom0 cgroup 分配低优先级。
换句话说,所有后台 Dom0 进程(如 ntpd、yum 等)是否会与通过 cgroup 显式控制资源分配的 VM 竞争,从而导致性能下降?这里的最佳做法是什么?
我有一个 Debian 挤压内核 (linux-image-2.6.32-5-openvz-amd64),根据 Doku 应该支持 cgroups。当我查看内核配置时,确实如此(或者是否需要其他一些内核配置?)
# zgrep -i cgroup /boot/config-2.6.32-5-openvz-amd64
# CONFIG_CGROUP_SCHED is not set
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_DEVICE=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NET_CLS_CGROUP=y
Run Code Online (Sandbox Code Playgroud)
此外,根据http://wiki.debian.org/LXC,内核参数 cgroup_enable=memory 可能是必要的。我用它启动内核:
# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-2.6.32-5-openvz-amd64 root=UUID=6332fe39-7eaa-4519-b6c1-e05808284586 ro cgroup_enable=memory quiet console=ttyS0,57600n8
Run Code Online (Sandbox Code Playgroud)
但是,系统仍然没有cgroup支持!无法挂载 cgroup 文件系统,因为系统甚至不知道文件系统类型:
# mount -t cgroup none /cgroup
mount: unknown filesystem type 'cgroup'
Run Code Online (Sandbox Code Playgroud)
和:
# grep -i cgroup /proc/filesystems
#
Run Code Online (Sandbox Code Playgroud)
所以要么有错误,要么我错过了一些东西。谁能告诉我什么?是否缺少内核参数?内核配置?
我正在尝试了解 cgroups v2 是如何工作的。我这样做了:
mount -t cgroup2 none /mnt/cgroup2
Run Code Online (Sandbox Code Playgroud)
这给了我一个对象列表 /mnt/cgroup2
root@ubuntu-s-1vcpu-1gb-lon1-01:~# ls -la /mnt/cgroup2/
total 4
dr-xr-xr-x 5 root root 0 Sep 2 16:04 .
drwxr-xr-x 3 root root 4096 Sep 2 16:05 ..
-r--r--r-- 1 root root 0 Sep 2 16:04 cgroup.controllers
-rw-r--r-- 1 root root 0 Sep 2 16:04 cgroup.max.depth
-rw-r--r-- 1 root root 0 Sep 2 16:04 cgroup.max.descendants
-rw-r--r-- 1 root root 0 Sep 2 16:04 cgroup.procs
-r--r--r-- 1 root root 0 Sep 2 16:04 cgroup.stat …Run Code Online (Sandbox Code Playgroud) cgroup ×10
linux ×6
lxc ×2
systemd ×2
accounting ×1
hard-drive ×1
htop ×1
jboss ×1
linux-kernel ×1
memory-usage ×1
networking ×1