如何查看父进程和子进程之间的cgroups资源控制继承

Rfr*_*ile 6 resource-management cgroup systemd

以 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我为 user.slice 设置限制,例如 5M 内存,Memory 行会清楚地报告它:

\n\n
systemctl 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 ago\n    Tasks: 12\n   Memory: 3.1M (limit: 5.0M)\n      CPU: 1.275s\n   CGroup: /user.slice\n...\n
Run Code Online (Sandbox Code Playgroud)\n\n

user-1000 切片应用了限制,如果我用该用户对系统施加压力,我可以看到它。但状态不报告此子切片中的限制:

\n\n
systemctl status user-1000.slice\n\xe2\x97\x8f user-1000.slice - User Slice of user1\n   Loaded: loaded (/run/systemd/transient/user-1000.slice; transient; vendor preset: enabled)\nTransient: yes\n   Active: active since Mon 2016-08-22 11:32:42 CEST; 1h 8min ago\n    Tasks: 6 (limit: 12288)\n   Memory: 856.0K\n      CPU: 521ms\n
Run Code Online (Sandbox Code Playgroud)\n\n

按照 proc 方式我可以看到 user-1000 进程属于 user 切片:

\n\n
# cat /proc/3260/cgroup \n10:memory:/user.slice/user-1000.slice\n...\n
Run Code Online (Sandbox Code Playgroud)\n\n

并直接在 /sys/ 内部检查:

\n\n
root@server1:/sys/fs/cgroup/memory/user.slice# cat memory.limit_in_bytes \n5242880\nroot@server1:/sys/fs/cgroup/memory/user.slice# cd user-1000.slice/\nroot@server1:/sys/fs/cgroup/memory/user.slice/user-1000.slice# cat memory.limit_in_bytes \n9223372036854771712\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何知道子进程/切片是否具有父 cgroup 中定义的限制?

\n