Dowiedziałem się:
Powodem jest to, że obecnie gzip
działa (pod względem szybkości procesora w porównaniu do prędkości wyszukiwania HD) na bardzo małych rozmiarach buforów .
Odczytuje kilka KB z pliku wejściowego, kompresuje go i opróżnia do pliku wyjściowego. Biorąc pod uwagę fakt, że wymaga to wyszukiwania dysku twardego, można wykonać tylko kilka operacji na sekundę.
Powodem, dla którego mój występ się nie skalował, jest to, że już gzip
szukałem jak szalony.
Obejrzałem to za pomocą buffer
narzędzia unix :
buffer -s 100000 -m 10000000 -p 100 < file1.json | gzip > file1.json.gz
Buforując dużo danych wejściowych przed wysłaniem ich do gzip, można znacznie zmniejszyć liczbę małych wyszukiwań. Opcje:
-s
i -m
mają określić rozmiar bufora (uważam , że jest w KB, ale nie jestem pewien)
-p 100
upewnia się, że dane są przekazywane do gzip dopiero po wypełnieniu bufora w 100%
Działając cztery z nich równolegle, mogłem uzyskać przepustowość 4 * 25 MB / s, zgodnie z oczekiwaniami.
Nadal zastanawiam się, dlaczego gzip nie pozwala na zwiększenie rozmiaru bufora - w ten sposób jest całkiem bezużyteczny, jeśli działa na wirującym dysku.
EDYCJA : Wypróbowałem jeszcze kilka zachowań programów do kompresji:
bzip2
przetwarza tylko 2 MB / s ze względu na silniejszą / bardziej intensywną kompresję procesora
lzop
wydaje się zezwalać na większe bufory: 70 MB / s na rdzeń, a 2 rdzenie mogą maksymalnie powiększyć mój HD bez nadmiernego przeszukiwania
dd
zrobić to samo?dd
można zrobić to samo z jegobs=
opcją, tak.Po przejrzeniu pierwszych pięciu wykładów w MIT OpenCourseware dla 6.172: „Inżynieria wydajności systemów oprogramowania”, uruchomiłem analizator wydajności systemu Linux „perf” na umiarkowanie dużym pliku testowym. Wynik wydaje się pokazywać przeciągnięcia rurociągu, w których jedna instrukcja musi czekać na wynik poprzedniej.
Druga ostatnia instrukcja jest kopiowana do,
%ecx
a ostatnia musi poczekać (zablokowanie potoku), aż%cx
rejestr będzie gotowy do użycia danych. To przeciągnięcie rurociągu utrzymuje pętlę zawierającą.Wynika to z bardzo niejasnego stylu programowania „oldschoolowego” C.
źródło
Wskazówka, która może zabrać go na jeszcze wyższy poziom prędkości w procesorze wielordzeniowym / hyperthreadingu:
(przy założeniu Ubuntu)
moreutils zawiera między innymi „GNU równoległy” - który ma wiele opcji pomagających w większym wykorzystaniu twojego procesora.
źródło