grep在不运行CPU时会做什么?


19

在寻找与的匹配项时grep,我经常注意到,后续搜索所花的时间比第一次搜索少得多,例如25s与2s。显然,这不是通过重用上次运行的数据结构来实现的,而应该重新分配这些数据结构。在上运行time命令grep,我注意到了一个有趣的现象:

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

其余时间去哪里了?我能做些什么使它每次快速运行吗?(例如,在grep搜索文件之前,让另一个进程读取文件。)

Answers:


34

它通常与页面缓存有关

第一次,必须从磁盘上(物理地)读取数据。

第二次(对于不太大的文件)可能位于页面缓存中。

因此,您可以先发出类似cat(1)的命令,将(不是太大)文件放入页面缓存(即在RAM中),然后发出第二个grep(1)(或任何读取文件的程序) 。

(但是,有时仍需要从磁盘读取数据)

另请参阅(有时在您的应用程序中有用,但实际上很少)readahead(2)posix_fadvise(2)以及madvise(2)sync(2)fsync(2)等。

阅读LinuxAteMyRAM

顺便说一句,这就是为什么在对程序进行基准测试时建议多次运行它的原因。同样,这就是为什么购买更多内存可能有用的原因(即使您没有运行将所有内存用于其数据的程序)。

如果您想了解更多,请阅读《操作系统:三篇简单的书》之类的书。


12
因此,TL;DR答案是“ [块等待] I / O”。
mgarciaisaia

10
@PaulDraper不是真的:) cat+ grep仍然比grep单独花费更长的时间。
chepner

3
@chepner除非您可以cat在执行其他操作时使用多线程并将其用作廉价的预取,否则请准备grep感兴趣的内容。
hBy2Py

2
@MarkKCowan:可爱的猫!   :-)⁠
G-人说“恢复Monica的

3
@ G-Man:您也可以用替换两个,cattac获得相同的效果和更高的RAM使用率: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来说明我的观点。)
温斯顿·史密斯

1
我认为原因是,您的帖子没有添加任何与我要询问的内容有关的新信息。我已经知道会有延迟,第一个答案已经解释了为什么会发生这种情况。但是,是的,我也无缘无故投票。即使是有好的答案的问题。
亚历克斯(Alex)

感谢@Alex提出原因。我试图区分将数据从本地存储移动到内存的开销时间(第一个答案),以及将数据从网络存储移动到本地服务器的开销时间。我会考虑是否可以更清楚地描述这一点或提供更好的命令示例。
温斯顿·史密斯

我想看完您的文章后,我的想法是,将数据从存储的地方转移到内存仍然是开销。无论是来自网络存储还是来自本地存储,都没有关系-Unix仍然认为它是从目录移动到内存。ps-看来我的解释是正确的-我的评论带有反对意见。
Alex

我知道,我添加的区别对您要寻找的不重要。好。顺便说一句,我赞成你的评论,所以它不能解决反对理由的问题。:-)
温斯顿·史密斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.