Co robi grep, gdy nie uruchamia procesora?


19

Kiedy szukam dopasowania z grep, często zauważam, że kolejne wyszukiwanie zajmuje znacznie mniej czasu niż pierwsze - np. 25s vs. 2s. Oczywiście nie polega to na ponownym wykorzystaniu struktur danych z ostatniego uruchomienia - należy je zwolnić. Po uruchomieniu timepolecenia grepzauważyłem ciekawe zjawisko:

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

Gdzie idzie reszta czasu? Czy mogę coś zrobić, aby za każdym razem działało szybko? (np. zlecenie innym procesom odczytu plików przed grepich przeszukaniem).

Odpowiedzi:


34

Jest to dość często związane z pamięcią podręczną strony .

Za pierwszym razem dane muszą zostać odczytane (fizycznie) z dysku.

Za drugim razem (w przypadku niezbyt dużych plików) prawdopodobnie będzie siedział w pamięci podręcznej strony.

Możesz więc najpierw wydać polecenie typu cat (1), aby wprowadzić (niezbyt duży) plik do pamięci podręcznej strony (tj. W pamięci RAM), a następnie drugi grep (1) (lub dowolny program odczytujący plik) generalnie działałby szybciej .

(jednak dane nadal muszą zostać odczytane z dysku)

Zobacz także (czasem przydatne w aplikacjach, ale praktycznie rzadko) readahead (2) i posix_fadvise (2) i być może madvise (2) i sync (2) i fsync (2) itp.

Przeczytaj także LinuxAteMyRAM .

BTW, dlatego zaleca się, aby podczas testowania programu uruchomić go kilka razy. Również dlatego warto kupić więcej pamięci RAM (nawet jeśli nie uruchamiasz programów wykorzystujących je do swoich danych).

Jeśli chcesz dowiedzieć się więcej, przeczytaj książkę, np. Systemy operacyjne: trzy łatwe elementy


12
Tak więc TL;DRodpowiedź brzmi „[blok czeka na] We / Wy”.
mgarciaisaia

10
@PaulDraper Niezupełnie :) cat+ grepnadal potrwa dłużej niż grepsam.
chepner

3
@chepner O ile nie możesz używać wielowątkowości i używać catjako taniego pobierania z wyprzedzeniem, gdy robisz coś innego, przygotowując się na grepzainteresowanie.
hBy2Py

2
@MarkKCowan: Cudowne koty!    :-) ⁠
G-Man mówi „Przywróć Monikę”

3
@ G-Man: Możesz również zamienić dwa catszeryfy tacna ten sam efekt i większe użycie pamięci RAM: D Lub wszystkie koty z tac
Mark K Cowan

-1

W środowisku sieciowej pamięci masowej mogą wystąpić względnie znaczne opóźnienia przy pierwszym dostępie do pliku znajdującego się na „filer” oddzielnym od serwera. Po uzyskaniu dostępu do tego pliku na serwerze zostanie on buforowany lokalnie, a późniejszy dostęp do danych będzie znacznie szybszy.

Oto eksperyment polegający na obliczeniu sumy kontrolnej danych pliku - nie grep. Pierwsze wywołanie jest powolne, a kolejne szybkie.

> 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

Będę wdzięczny za komentarze do głosowania, ponieważ nie wiem, jak je interpretować. Uważam, że mój opis odpowiedzi jest prawidłowy. Być może przykład polecenia nie jest jasny? Czy nie podoba ci się to, że nie testowałem polecenia grep? (Celowo użyłem prostszego polecenia, md5sum, aby zilustrować mój punkt widzenia).
Winston Smith

1
Myślę, że powodem jest to, że twój post nie dodał żadnych nowych informacji dotyczących tego, o co prosiłem. Wiedziałem już, że nastąpiło opóźnienie, a pierwsza odpowiedź już wyjaśniła, dlaczego tak się dzieje. Ale tak, dostajam też głosowania bez wyjaśnienia. Nawet na pytania z dobrymi odpowiedziami.
Alex

Dzięki @Alex za zasugerowanie powodu. Próbowałem rozróżnić między czasem narzutu, aby przenieść dane z pamięci lokalnej do pamięci, co opisano w pierwszej odpowiedzi, a czasem narzutowym, aby przenieść dane z pamięci sieciowej na lokalny serwer. Pomyślę, czy mógłbym to dokładniej opisać lub podać lepsze przykłady poleceń.
Winston Smith

Myślę, że po przeczytaniu twojego postu, myślę, że nadal jest to narzut związany z przenoszeniem danych z dowolnego miejsca w pamięci do pamięci. Niezależnie od tego, czy jest to pamięć sieciowa, czy pamięć lokalna, nie ma znaczenia - Unix nadal postrzega to jako przenoszenie z katalogu do pamięci. ps - wygląda na to, że moje wyjaśnienie jest poprawne - mój komentarz z uzasadnieniem otrzymał poparcie.
Alex

Rozumiem, dodałem rozróżnienie, które nie jest ważne dla tego, czego szukałeś. DOBRZE. Nawiasem mówiąc, głosowałem za twoim komentarzem, więc to nie rozwiązuje pytania o powód oddania głosu. :-)
Winston Smith,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.