我本以为这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
...所以获取有关该过程的信息有相当大的延迟。该过程没有详细信息,所以我不知道它是关于什么的