grep이 CPU를 실행하지 않을 때 무엇을합니까?


19

와 일치하는 항목을 찾을 때 grep종종 후속 검색이 첫 번째보다 훨씬 적은 시간 (예 : 25 초 대 2 초)을 발견합니다. 분명히, 그것은 마지막 실행에서 데이터 구조를 재사용하는 것이 아니라 할당이 취소 된 것이어야합니다. 에 time명령을 실행 grep하면 흥미로운 현상이 나타났습니다.

real    24m36.561s
user    1m20.080s
sys     0m7.230s

나머지 시간은 어디로 갑니까? 매번 빠르게 실행되도록 할 수있는 방법이 있습니까? (예 : 다른 프로세스가 파일을 grep검색 하기 전에 파일을 읽도록 합니다.)

답변:


34

그것은 종종 페이지 캐시 .

처음으로 디스크에서 데이터를 (물리적으로) 읽어야합니다.

두 번째로 (큰 파일은 아님) 페이지 캐시에있을 가능성이 높습니다.

따라서 먼저 cat (1) 과 같은 명령을 실행 하여 (너무 크지 않은) 파일을 페이지 캐시 (예 : RAM)로 가져온 다음 두 번째 grep (1) 을 가져올 수 있습니다. (또는 파일을 읽는 모든 프로그램)을 일반적으로 더 빠르게 실행할 수 있습니다. .

(그러나 여전히 디스크에서 데이터를 읽어야하는 경우가 있음)

readahead (2) & posix_fadvise (2) 및 아마도 madvise (2) & sync (2) & fsync (2) 등을 참조하십시오 (때로는 응용 프로그램에는 유용하지만 실제로는 거의 발생하지 않습니다) .

LinuxAteMyRAM 도 읽으십시오 .

BTW, 프로그램을 벤치마킹 할 때 여러 번 실행하는 것이 좋습니다. 또한, 더 많은 RAM을 구입하는 것이 유용 할 수 있습니다 (데이터를 위해 모든 프로그램을 사용하는 프로그램을 실행하지 않더라도).

더 이해하려면 운영 체제 : Three Easy Pieces 와 같은 책을 읽으십시오 .


12
따라서 TL;DR답은 "[block waiting for] I / O"입니다.
mgarciaisaia

10
@PaulDraper 실제로 :) cat+ grep는 여전히 grep혼자 보다 오래 걸릴 것 입니다.
chepner

3
@chepner 멀티 스레드를 수행 할 수 없다면 관심 cat있는 grep부분에 대비하여 다른 작업을하는 동안 저렴한 프리 페치로 사용할 수 있습니다 .
hBy2Py


3
@ G-Man : 동일한 효과와 더 높은 RAM 사용을 위해 두 개의 cats로 교체 할 수도 tac있습니다. D 또는 모든 고양이를 tac로
Mark K Cowan

-1

네트워크 스토리지 환경에서는 서버와 별도로 "파일러"에있는 파일에 처음 액세스 할 때 상대적으로 상당한 지연이있을 수 있습니다. 해당 파일이 서버에서 액세스되면 해당 파일은 로컬로 캐시되며 데이터에 대한 후속 액세스가 훨씬 빨라집니다.

다음은 grep이 아닌 파일 데이터의 체크섬을 계산하는 실험입니다. 첫 번째 호출은 느리고 후속 호출은 빠릅니다.

> du -Dh file_348m
348M    file_348m

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.60user 0.15system 0:03.02elapsed 25%CPU (0avgtext+0avgdata 1524maxresident)k
708144inputs+0outputs (0major+80minor)pagefaults 0swaps

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.67user 0.06system 0:00.73elapsed 99%CPU (0avgtext+0avgdata 1524maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.65user 0.07system 0:00.73elapsed 99%CPU (0avgtext+0avgdata 1524maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.66user 0.06system 0:00.73elapsed 99%CPU (0avgtext+0avgdata 1524maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps

downvote에 대한 의견을 보내 주셔서 감사합니다. 해석 방법을 모르겠습니다. 내 답변 설명이 정확하다고 생각합니다. 아마도 명령 예제가 명확하지 않습니까? 아니면 grep 명령을 벤치마킹하지 않은 것이 마음에 들지 않습니까? (내 의도를 설명하기 위해 의도적으로 더 간단한 명령 인 md5sum을 사용했습니다.)
Winston Smith

1
그 이유는 귀하의 게시물이 내가 요청한 것과 관련된 새로운 정보를 추가하지 않았기 때문이라고 생각합니다. 나는 이미 지연이 있음을 알고 있었고 첫 번째 답변은 왜 그런 일이 일어나고 있는지 설명했습니다. 그러나 네, 설명도없이 공감대를 얻습니다. 좋은 답변이있는 질문에도.
Alex

이유를 제안 해 주신 @Alex에게 감사드립니다. 로컬 스토리지에서 메모리로 데이터를 이동하는 오버 헤드 시간과 첫 번째 답변이 설명한 오버 헤드 시간과 네트워크 스토리지에서 로컬 서버로 데이터를 이동하는 오버 헤드 시간을 구별하려고했습니다. 더 명확하게 설명하거나 더 나은 명령 예제를 제공 할 수 있는지 생각합니다.
윈스턴 스미스

내 게시물을 읽은 후에도 데이터가 저장된 곳에서 메모리로 데이터를 이동하는 데 여전히 오버 헤드가 있다고 생각합니다. 네트워크 스토리지이든 로컬 스토리지이든 관계없이 Unix는 여전히 디렉토리에서 메모리로 이동하는 것으로 간주합니다. 추신-내 설명이 옳은 것 같습니다. 이유에 대한 내 의견은 공감되었습니다.
Alex

나는 당신이 찾고있는 것에 중요하지 않은 구별을 추가하고있었습니다. 확인. 그건 그렇고, 나는 당신의 의견을 찬성했습니다. 그래서 다운 투표 이유에 대한 질문을 해결하지 못합니다. :-)
Winston Smith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.