Grep làm gì khi nó không chạy CPU?


19

Khi tìm kiếm kết grepquả trùng khớp , tôi thường nhận thấy rằng lần tìm kiếm tiếp theo mất ít thời gian hơn đáng kể so với lần đầu tiên - ví dụ 25 giây so với 2 giây. Rõ ràng, không phải bằng cách sử dụng lại các cấu trúc dữ liệu từ lần chạy cuối cùng của nó-- những cấu trúc đó đã bị loại bỏ. Chạy một timelệnh trên grep, tôi nhận thấy một hiện tượng thú vị:

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

Phần còn lại của thời gian đi đâu? Có điều gì tôi có thể làm để làm cho nó chạy nhanh mỗi lần không? (ví dụ: có một quá trình khác đọc các tệp, trước khi greptìm kiếm chúng.)

Câu trả lời:


34

Nó thường khá liên quan đến bộ đệm trang .

Lần đầu tiên, dữ liệu phải được đọc (vật lý) từ đĩa.

Lần thứ hai (đối với các tệp không quá lớn) có khả năng nó sẽ nằm trong bộ đệm của trang.

Vì vậy, trước tiên bạn có thể đưa ra một lệnh như cat (1) để đưa tệp (không quá lớn) vào bộ đệm trang (tức là trong RAM), sau đó một grep thứ hai (1) (hoặc bất kỳ chương trình nào đọc tệp) thường chạy nhanh hơn .

(tuy nhiên, dữ liệu vẫn cần được đọc từ đĩa vào một lúc nào đó)

Xem thêm (đôi khi hữu ích trong các chương trình ứng dụng của bạn, nhưng thực tế hiếm khi) readahead (2) & posix_fadvise (2) và có lẽ madvise (2) & sync (2) & fsync (2), v.v ....

Đọc thêm LinuxAteMyRAM .

BTW, đây là lý do tại sao nó được khuyến nghị, khi điểm chuẩn một chương trình, để chạy nó nhiều lần. Ngoài ra, đây là lý do tại sao có thể hữu ích để mua thêm RAM (ngay cả khi bạn không chạy các chương trình sử dụng tất cả dữ liệu đó cho dữ liệu của họ).

Nếu bạn muốn hiểu thêm, hãy đọc một số cuốn sách như, ví dụ như Hệ điều hành: Ba mảnh dễ dàng


12
Vì vậy, TL;DRcâu trả lời là "[khối chờ] I / O".
mgarciaisaia

10
@PaulDraper Không thực sự :) cat+ grepvẫn sẽ mất nhiều thời gian hơn grepmột mình.
chepner

3
@chepner Trừ khi bạn có thể đa luồng và sử dụng catnhư một chương trình tìm nạp trước giá rẻ trong khi bạn đang làm một việc khác, để chuẩn bị cho sự grepquan tâm.
hBy2Py

2
@MarkKCowan: Những chú mèo đáng yêu!    :-)
G-Man nói 'Phục hồi Monica'

3
@ G-Man: Bạn cũng có thể thay thế hai trong số những cats với taccho tác dụng tương tự và sử dụng RAM cao hơn: D Hoặc tất cả những con mèo với tac
Đánh K Cowan

-1

Trong môi trường lưu trữ mạng, cũng có thể có độ trễ tương đối đáng kể khi bạn truy cập lần đầu vào một tệp nằm trên "trình quay" tách biệt với máy chủ. Khi tệp đó đã được truy cập trên máy chủ, nó sẽ được lưu trữ cục bộ và việc truy cập dữ liệu tiếp theo sẽ nhanh hơn nhiều.

Đây là một thử nghiệm chỉ tính toán tổng kiểm tra dữ liệu tệp - không phải grep. Yêu cầu đầu tiên là chậm, và những lần tiếp theo là nhanh chóng.

> 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

Tôi đánh giá cao ý kiến ​​cho downvote, vì tôi không biết làm thế nào để giải thích chúng. Tôi tin rằng mô tả câu trả lời của tôi là chính xác. Có lẽ ví dụ lệnh không rõ ràng? Hoặc bạn không thích rằng tôi đã không điểm chuẩn lệnh grep? (Tôi cố tình sử dụng một lệnh đơn giản hơn, md5sum, để cố gắng minh họa quan điểm của mình.)
Winston Smith

1
Tôi nghĩ lý do là, bài viết của bạn không thêm bất kỳ thông tin mới nào liên quan đến những gì tôi đang hỏi. Tôi đã biết có một sự chậm trễ, và câu trả lời đầu tiên đã đưa ra lời giải thích tại sao nó lại xảy ra. Nhưng vâng, tôi nhận được downvote mà không cần giải thích quá. Ngay cả trên các câu hỏi với câu trả lời tốt.
Alex

Cảm ơn @Alex đã gợi ý một lý do. Tôi đã cố gắng phân biệt thời gian trên không để di chuyển dữ liệu từ bộ nhớ cục bộ sang bộ nhớ, câu trả lời đầu tiên được mô tả và thời gian trên không để di chuyển dữ liệu từ bộ nhớ mạng sang máy chủ cục bộ. Tôi sẽ nghĩ nếu tôi có thể mô tả điều này rõ ràng hơn hoặc cung cấp các ví dụ lệnh tốt hơn.
Winston Smith

Tôi đoán sau khi đọc bài viết của bạn, tôi nghĩ, nó vẫn là chi phí di chuyển dữ liệu từ bất cứ nơi nào nó được lưu trữ, vào bộ nhớ. Cho dù đó là từ lưu trữ mạng hay từ lưu trữ cục bộ, không thành vấn đề-- Unix vẫn xem nó là việc chuyển từ thư mục sang bộ nhớ. ps-- có vẻ như lời giải thích của tôi là đúng-- nhận xét của tôi với lý do có một upvote.
Alex

Tôi thấy, tôi đã thêm một sự khác biệt không quan trọng với những gì bạn đang tìm kiếm. ĐƯỢC. Nhân tiện, tôi đã đánh giá cao nhận xét của bạn, vì vậy nó không giải quyết được câu hỏi về lý do hạ cấp. :-)
Winston Smith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.