我需要在 Ubuntu RT Linux 上运行实时应用程序,并且正在阅读有关使 Linux 充当 RT 系统的方法,我学到了两种方法来做到这一点
CONFIG_RT_GROUP_SCHED内核中的启用标志。我已经尝试过第一种方法为 Ubuntu 安装 RT Linux 补丁
然而,除了uname -r表明#1 SMP PREEMPT RT我没有其他证据证明它实际上是一个 RT 系统,因此想尝试第二种方法。CONFIG_RT_GROUP_SCHED在内核中启用标志并查看其性能。
我读到我们可以通过以下命令确认内核是否已经具有该标志:
# zcat /proc/config.gz | grep RT_GROUP
CONFIG_RT_GROUP_SCHED=y
Run Code Online (Sandbox Code Playgroud)
但是,我的系统在 proc 中甚至没有 config.gz 文件,所以我相信我的内核没有启用此功能。我对 Linux 内核比较陌生,所以这可能很天真,但如何在内核中启用它?
我想使用 Linux 控制组 (cgroups) 来限制多个进程的 CPU 和 RAM 使用。如果进程是Process 1且Process 2带有子进程Process 2 Sub,这是否是正确的、最小的命令语法:
sudo systemd-run --scope -p MemoryHigh=200M Process\ 1
-p MemoryHigh=200M Process\ 2
-p MemoryHigh=200M Process\ 2\ Sub
-p MemoryMax=250M Process\ 1
-p MemoryMax=250M Process\ 2
-p MemoryMax=250M Process\ 2\ Sub
-p CPUQuota=10% Process\ 1
-p CPUQuota=10% Process\ 2
-p CPUQuota=10% Process\ 2\ Sub
Run Code Online (Sandbox Code Playgroud)
我不确定正确的进程 ID(完整路径?进程名称?)、选项的“链接”、区分大小写、转义空格、子进程(此处:)是否Process 2 Sub自动包含在施加的限制中或需要单独控制,以及是否需要在每次启动相关进程时运行此命令,或者设置是否永久。谢谢!
基本上,通常用于通知文件系统更改的 inotify 在 cgroup 虚拟文件系统中不起作用。
本质上,我想要一种在 cgroup 中的进程死亡或分叉时获得类似于 inotify 的通知的方法。我尝试将 inotify 附加到taskscgroup 文件系统内的虚拟文件,但是当进程自行分叉时,只有当 usespace 工具实际手动写入它以影响 cgroup 时,它才会执行任何操作。
我在安装了 libcgroup 的Ubuntu 14和SUSE Linux Enterprise Server 11 (x86_64)上使用 root 执行了以下操作:
cgcreate -t ngam:home -a ngam:home -g cpuset:/nadav2ndCpuSet
cgset -r cpuset.cpus=1 nadav2ndCpuSet
之后,如果你 cat /sys/fs/cgroup/cpuset/nadav2ndCpuSet/cpuset.cpus,你会得到: 1
这很好!因为它应该工作。
然后,从用户ngam,我运行了以下 cmd:
cgexec -g cpuset:nadav2ndCpuSet ~/whileLoop
其中whileLoop只是一个简单的程序,它在循环中运行,执行 sqrt。
之后,我收到以下错误消息:
cgroup 更改组失败
为什么会发生?谢谢!
我测试了这些查询。第一个查询的值是第二个查询的一半:
sum(container_memory_working_set_bytes{image!="",name=~"^k8s_.*",pod=~"$pod"}) by (pod)
和
sum (container_memory_working_set_bytes{pod=~"$pod"}) by (pod)
为什么写作的image! = "", name = ~ "^ k8s_. *"价值会减半?
现在 Ubuntu 22.04 已经发布了,我在我们的一位 jenkins-workers 上进行了全新安装来测试它,但我无法让 docker ssh-agent 正常工作。它无法再识别它是否在容器内运行,因此每当启动使用 docker 的作业时,我都可以在控制台中看到“Jenkins-worker-X 似乎没有在容器内运行”,然后管道失败。
我从之前就知道jenkins使用cgroup信息来检测它是否在容器中运行,因此例如cat /proc/self/cgroup在容器中执行应该会产生以 结尾的行列表/docker/<container-id>,然后Jenkins使用该列表来检测容器。但是,一旦我安装了 Ubuntu 22.04,cgroup 信息就不再包含 ,这/docker/<container-id>会导致 jenkins 代理认为它在裸机上运行。
即使执行官方镜像也有同样的问题,即docker run jenkins/ssh-agent:jdk11最后docker exec <container-id> cat /proc/self/cgroup会得到一个在我的机器上没有容器哈希的列表。
我该如何解决这个问题?从 Ubuntu 21.10 到 22.04 是否发生了某些变化导致了此问题?是否需要一些额外的配置?
我正在运行最新的 Ubuntu 22.04 (5.15.0-27-generic)、Docker 版本 20.10.12、内部版本 20.10.12-0ubuntu4。
任何帮助,将不胜感激!
编辑:我现在意识到,如果将所有软件包升级到最新版本(并使用最新的 jenkins/ssh-agent 映像),21.10 中也会发生同样的情况,因此原因可能出在升级的软件包之一中
我正在尝试使用cgroup blkio控制器来控制 I/O 带宽。
Cgroup已经设置并挂载成功,即调用 grep cgroup /proc/mounts
返回:
....
cgroup /sys/fs/cgroup/blkio cgroup rw,relatime,blkio 0 0
...
Run Code Online (Sandbox Code Playgroud)
然后我在blkio文件夹中创建一个新文件夹并写入文件blkio.throttle.read_bps_device,如下所示:
1. mkdir user1; cd user1
2. echo "8:5 10485760" > blkio.throtlle.read_bps_device
----> echo: write error: Invalid argument
Run Code Online (Sandbox Code Playgroud)
我的设备主要:次要编号在使用df -h和ls -l /dev/sda5用于存储设备时是正确的。
而且我仍然可以写入不需要设备主要:次要编号的文件,例如blkio.weight(但会引发相同的错误blkio.weigth_device)
知道为什么我收到那个错误吗?
我在 Shell 中测试文件是否为空。
test -s /sys/fs/cgroup/systemd/docker/d4e311735706485e748513bad611070e223cba76fdf4c72a1102d14b653da750/tasks
它返回false,我使用时发现它的大小为0 ls -lh,但是当我使用时cat,我可以在这个文件中得到4071,这意味着该文件不为空。我想可能这个文件太小了,我在我的主目录中创建了一个文件,然后向它回显 4071,我发现它的大小不是 0。/sys/fs/cgroup 中的文件是否特殊?
我尝试使用以下命令挂载内存 cgroup:
sudo mount -t cgroup none /sys/fs/cgroup/memory -o memory
我收到错误:
mount: /sys/fs/cgroup/memory: wrong fs type, bad option, bad superblock on none, missing codepage or helper program, or other error.
我启用了所有 cgroup 内核配置选项,并且可以毫无问题地挂载 cpu、cpuset 和设备 cgroup。
我缺少什么?
操作系统: Raspberry Pi OS Lite(64位)
内核版本: 5.10.95
我希望命令行工具在打开特定文件进行写入时失败。
有没有办法可以修改命令行工具的环境(可能通过 cgroups),以便命令/进程(例如)“权限被拒绝”?
chmod a-w file不起作用。该过程似乎unlink()然后重新创建该文件。
我知道我可以使用 来观看进程的系统调用strace。但是有没有办法改变一些调用,以便该过程得到不同的结果?
cgroups ×10
linux ×4
cadvisor ×1
docker ×1
file ×1
inotify ×1
io ×1
jenkins ×1
kubernetes ×1
linux-kernel ×1
mount ×1
prometheus ×1
raspberry-pi ×1
real-time ×1
resources ×1
shell ×1
syntax ×1
system-calls ×1
systemd ×1
terminal ×1
ubuntu ×1