我有一个有缺陷的程序,即使在空闲时也使用 100% CPU。由于目前修复它并不实际,我想将其限制为能够使用不超过 10% 的 CPU。然而,无论我做什么,该进程总是会 100% 占用一个 CPU。
我在Arch Wiki上找到了说明,告诉我创建一个包含以下内容的文件:
# cpulimit.slice
[Slice]
CPUQuota=10%
Run Code Online (Sandbox Code Playgroud)
显然我可以使用这些限制启动 shell,如下所示:
systemd-run --slice=cpulimit.slice --uid=myuser --shell
Run Code Online (Sandbox Code Playgroud)
这似乎有效,输入 sudo 密码后,我得到一个 shell,因此我运行一个简单的测试,该测试将使用 100% CPU,我可以使用 Ctrl+C 停止:
while true; do true; done
Run Code Online (Sandbox Code Playgroud)
我预计它使用的 CPU 不会超过 10%,因为它在切片内运行,但它始终使用 100% CPU!
我究竟做错了什么?
我看到一些文件/目录即使是 root 用户也无法访问:
find: ‘/run/user/1000/gvfs’: Permission denied
.
所以我更深入地跑了ls -l
;下面是输出。
/run/user/125# ll
ls: cannot access 'gvfs': Permission denied
total 4
drwx------ 12 gdm gdm 340 Sep 3 10:20 ./
drwxr-xr-x 4 root root 80 Sep 3 10:19 ../
srw-rw-rw- 1 gdm gdm 0 Sep 3 10:19 bus=
drwx------ 3 gdm gdm 60 Sep 3 10:19 dbus-1/
drwx------ 2 gdm gdm 60 Sep 3 10:19 dconf/
drwx--x--x 2 gdm gdm 60 Sep 3 10:19 gdm/
prw-rw-r-- 1 gdm gdm …
Run Code Online (Sandbox Code Playgroud) 在安装 Linux 时,我只提到了一个文件系统(/dev/sda1 -> ext4 -> / )。但是对于 dev、run、proc、sys - Linux 正在创建额外的 FS,这可以从mount
.
$ mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,noexec,relatime,size=12138104k,nr_inodes=3034526,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,noexec,relatime,size=2433824k,mode=755)
/dev/sda4 on / type ext4 (rw,relatime,errors=remount-ro)
...
Run Code Online (Sandbox Code Playgroud)
我知道 /proc 是一个虚拟文件系统,位于内存中,而不是在任何 HDD/SSD 上。有人可以解释一下 /dev、/run 和 /sys 的情况吗?它们是否存在于硬盘上(如果存在的话,如果可以有意义地追踪的话,其位置在哪里)。
基于已经问过的问题 -为什么 /dev 和 /run 的 inode 编号与 / 的 inode 编号相同?
systemd-run ×3
filesystems ×2
cgroups ×1
cpulimit ×1
ext4 ×1
linux ×1
ls ×1
mount ×1
proc ×1
systemd ×1