我使用 tmpfs 创建了一个 ramdisk,如下所示:
sudo mount -t tmpfs -o size=1024m tmpfs /myramdisk
Run Code Online (Sandbox Code Playgroud)
我正在研究 cgroup blkio 子系统带宽限制“read_bps_device”和“write_bps_device”,但它们似乎需要您想要限制访问的块设备的主要和次要编号。
有没有办法实现与内存中 tmpfs ramdisk 类似的带宽限制?
更新:我找到了一种迂回的方法来完成这个。我先nfs 导出ramdisk 挂载。然后 nfs 在同一台机器上通过环回挂载它。然后我使用 linux 网络流量整形来设置带宽限制。这似乎提供了我需要的东西。我正在执行一些测量以查看这种可怕的分层所带来的损失。过几天我会更新这方面的信息。
据我所知(如果我错了,请纠正我),
systemctl set-property ... CPUShares=some_value
Run Code Online (Sandbox Code Playgroud)
限制整个 cgroup 单元的 CPU 时间。如果我们想限制该单元内进程的 CPU 时间,我们可以使用
systemd-run ... nice=some_value
Run Code Online (Sandbox Code Playgroud)
我想知道进程的 nice-value 和一组进程的 CPUShares-value 的概念之间是否存在一些内在差异?我们可以限制进程的 CPUShares 或设置 cgroup 单元的 nice-value 吗?我们什么时候想做一个或另一个?
我似乎无法匹配的cgroup V2层次结构与正在运行的进程cgroup的模块iptables。我正在运行带有所有必需模块的 Linux 4.13.0:
$ grep CGROUP <kernel_config>
CONFIG_CGROUPS=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_CGROUP_WRITEBACK=y
CONFIG_CGROUP_SCHED=y
CONFIG_CGROUP_PIDS=y
# CONFIG_CGROUP_RDMA is not set
CONFIG_CGROUP_FREEZER=y
# CONFIG_CGROUP_HUGETLB is not set
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_PERF=y
# CONFIG_CGROUP_BPF is not set
# CONFIG_CGROUP_DEBUG is not set
CONFIG_SOCK_CGROUP_DATA=y
**CONFIG_NETFILTER_XT_MATCH_CGROUP=m**
CONFIG_NET_CLS_CGROUP=m
CONFIG_CGROUP_NET_PRIO=y
CONFIG_CGROUP_NET_CLASSID=y
$ lsmod | grep cgroup
xt_cgroup 16384 2
x_tables 36864 7 xt_LOG,xt_cgroup,iptable_mangle,ip_tables,iptable_filter,xt_mark,ipt_MASQUERADE
Run Code Online (Sandbox Code Playgroud)
它是一个基于 Debian 的发行版,带有 systemd-235,它挂载了以下 cgroup:
$ mount | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (rw,mode=755)
cgroup …Run Code Online (Sandbox Code Playgroud) 我的服务器经常被爬虫几乎 DOS 攻击。我还没有弄清楚究竟是什么导致了高负载。CPU、内存和磁盘 IO 未达到极限(可能是网络流量)。我的问题是,是否有人知道如何在系统中保留容量以运行 shell 会话(bash over ssh)。这可以使用 cgroups 来完成吗?现在加载值很容易达到 60,这使得输入任何命令变得困难。
我想更好地了解 cgroups,并想了解应用 cgroups 的用例。
cgroups 是对不同应用程序进行优先级排序的好方法(即,给予特定类型的应用程序更高的优先级,如 Web 服务器)?
达尔文中是否有类似于 cgroups 的类似方法,用于防止进程通过以下方式逃离其父进程的控制/监视fork()?如果是,那是什么?
对于某些背景,考虑一个进程 P、直接后代 Q 以及 Q 的后代 R:cgroups 允许 P 控制和监视 Q 和 R。如果 P 启动 Q,但 Q 生成一个进程(R 中的 r) ,如果没有类似于 cgroups 的东西,P 就无法监控 r。
一个现实世界的例子是 systemd (P) 生成 openssh 的 sshd (Q) 作为守护进程,然后生成 sshd (R) 的其他实例来处理每个打开的会话。如果没有 cgroup,systemd 将无法与每会话 sshd 进行交互。
(在 NT 环境中,cgroup 类似于Job 对象。)
打印无限制的 docker 容器的值我得到值 9223372036854771712,即 0x7FFFFFFFFFFFF000(这与 XUbuntu 主机的值相同)。我找不到一个参考,表明这是指示无限内存资源的 Docker 或 Linux 默认值。
这个价值从何而来?容器虚拟化或 Linux 发行版/位元之间有什么不同吗?
我目前正在尝试配置或多或少全新安装的 CentOS Stream (8),以将 cgroup 控制器委托给非特权用户。然而,我在这方面失败了,我已经在网上搜索了两天,但找不到有相同或类似问题的人。
我想使用 podman 运行无根容器。然而,我失败了,因为非特权用户需要拥有 cgroup control pids。然而,以下命令不会产生任何结果,表明没有可用的 cgroup 控制器:
$ cat /sys/fs/cgroup/user.slice/user-$(id -u).slice/user@$(id -u).service/cgroup.controllers
Run Code Online (Sandbox Code Playgroud)
据我了解,此命令应该在默认配置中产生如下所示的结果(请参阅docker.com):
$ cat /sys/fs/cgroup/user.slice/user-$(id -u).slice/user@$(id -u).service/cgroup.controllers
memory pids
Run Code Online (Sandbox Code Playgroud)
当然,我已经使用systemd.unified_cgroup_hierarchy=1in启用了 cgroups v2/etc/default/grub并使用grub2-mkconfig.
因此,我尝试了docker.com中描述的以下命令:
# mkdir -p /etc/systemd/system/user@.service.d
# cat > /etc/systemd/system/user@.service.d/delegate.conf << EOF
[Service]
Delegate=cpu cpuset io memory pids
EOF
# systemctl daemon-reload
Run Code Online (Sandbox Code Playgroud)
最后,我重新启动,但没有效果。对于非特权用户来说,仍然没有 cgroup 控制器。
配置:CentOS Stream (8) 最新,Systemd v239
cd /sys/fs/cgroup/devices
mkdir custom_poc
Run Code Online (Sandbox Code Playgroud)
使用 tty:
root@centos8# tty
/dev/pts/0
Run Code Online (Sandbox Code Playgroud)
获取进程STDIN:
ls -l /proc/$$/fd/{0,1,2}
lrwx------. 1 root root 64 Mar 5 11:25 /proc/2446/fd/0 -> /dev/pts/0
lrwx------. 1 root root 64 Mar 5 11:25 /proc/2446/fd/1 -> /dev/pts/0
lrwx------. 1 root root 64 Mar 5 11:25 /proc/2446/fd/2 -> /dev/pts/0
Run Code Online (Sandbox Code Playgroud)
devices.deny:检查设备的主要和次要编号:
ls -l /dev/pts/0
crw--w----. 1 vagrant tty 136, 0 Mar 5 11:28 /dev/pts/0
Run Code Online (Sandbox Code Playgroud)
拒绝访问: …