나는 이것이 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
거의 동일한 수의 프로세스(~260)로 약 10-12ms 내에 완료됩니다.
그냥 이상해요.
나는 이 노트북에서 커널 5.7.11을 사용해 보았지만 아무런 차이가 없었습니다. pgrep
여전히 ps보다 약 4배 느립니다. 동일한 결과로 5.6.19로 재부팅했습니다. 콘솔 결과는 동일합니다.
내 라즈베리 파이-3b+(4코어) 및 Raspbian에서 pgrep
속도는 ps보다 약 두 배 빠릅니다!
내 노트북에는 Intel i7, 8-Gb, 하이퍼 스레딩이 포함된 4코어가 있고 약 270개의 프로세스가 실행되고 있습니다.
서버는 i5, 8-Gb, 4코어이며 약 265개의 프로세스를 실행합니다.
파이는 1Gb, 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
...그래서 프로세스에 대한 정보를 얻는 데 상당한 지연이 발생하고 있습니다. 자세한 과정이 나와있지 않아서 무슨 내용인지는 모르겠지만