为什么 pgrep/pkill 比 ps 慢这么多?

为什么 pgrep/pkill 比 ps 慢这么多?

我本以为这pgrep会比现在快得多,ps -ef但事实恰恰相反——pgrep花费了大约 4 倍的时间。但仅限于我的笔记本电脑,例如:

$ time { ps -ef |grep foobar; }
real    0m0.027s
user    0m0.009s
sys 0m0.023s

与之比较:

$ time pgrep foobar
real    0m0.215s
user    0m0.189s
sys 0m0.021s

...以上时间代表典型运行。

语境:

这是运行 Linux 内核 5.6.19-200.fc31.x86_64 的 Intel i7 笔记本电脑

我有另一台机器(服务器)运行 5.7.9-100.fc31.x86_64,它pgrep在大约 10-12 毫秒内完成,进程数量大致相同(~260)。

只是很奇怪。

我在这台笔记本电脑上尝试了内核 5.7.11,但没有什么区别 -pgrep仍然比 ps 慢 4 倍左右。我重新启动到 5.6.19 后结果相同。控制台的结果相同。

在我的 raspberry pi-3b+(4 核)和 raspbian 上,pgrep速度大约是 ps 的两倍!

我的笔记本电脑配备 Intel i7、8-Gb、4 核,具有超线程功能,正在运行大约 270 个进程

服务器为 i5、8-Gb、4 核,运行约 265 个进程

该 pi 为 1 Gb、4 核,运行约 133 个进程

编辑:我升级到 kernel-5.9.16-100.fc32,现在pgrep只比 ps 慢 3 倍!

编辑2:更多信息。 pgrep 上的 strace 给出:

     0.000089 openat(AT_FDCWD, "/proc/29/cmdline", O_RDONLY) = 4
     0.000071 read(4, "", 2047)         = 0
     0.000052 close(4)                  = 0
     0.503431 stat("/proc/30", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
     0.012402 openat(AT_FDCWD, "/proc/30/status", O_RDONLY) = 4
     0.002080 read(4, "Name:\tmigration/4\nUmask:\t0000\nSt"..., 2048) = 967
     0.000078 close(4)                  = 0

...所以获取有关该过程的信息有相当大的延迟。该过程没有详细信息,所以我不知道它是关于什么的

相关内容