Codziennie generuję około 200 GB danych dziennika, rozmieszczonych w około 150 różnych plikach dziennika.
Mam skrypt, który przenosi pliki do tymczasowej lokalizacji i wykonuje tar-bz2 w katalogu tymczasowym.
Otrzymuję dobre wyniki, ponieważ dzienniki 200 GB są skompresowane do około 12-15 GB.
Problem polega na tym, że kompresja plików trwa wieczność. Zadanie cron jest uruchamiane codziennie o 2:30 i trwa do 17:00 - 18:00.
Czy istnieje sposób na poprawę szybkości kompresji i szybsze zakończenie pracy? Jakieś pomysły?
Nie martw się o inne procesy i wszystko, gdzie odbywa się kompresja, znajduje się na NAS , a ja mogę uruchomić zamontować NAS na dedykowanej maszynie wirtualnej i uruchomić skrypt kompresji z tego miejsca.
Oto wynik działania top w celach informacyjnych:
top - 15:53:50 up 1093 days, 6:36, 1 user, load average: 1.00, 1.05, 1.07
Tasks: 101 total, 3 running, 98 sleeping, 0 stopped, 0 zombie
Cpu(s): 25.1%us, 0.7%sy, 0.0%ni, 74.1%id, 0.0%wa, 0.0%hi, 0.1%si, 0.1%st
Mem: 8388608k total, 8334844k used, 53764k free, 9800k buffers
Swap: 12550136k total, 488k used, 12549648k free, 4936168k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7086 appmon 18 0 13256 7880 440 R 96.7 0.1 791:16.83 bzip2
7085 appmon 18 0 19452 1148 856 S 0.0 0.0 1:45.41 tar cjvf /nwk_storelogs/compressed_logs/compressed_logs_2016_30_04.tar.bz2 /nwk_storelogs/temp/ASPEN-GC-32459:nkp-aspn-1014.log /nwk_stor
30756 appmon 15 0 85952 1944 1000 S 0.0 0.0 0:00.00 sshd: appmon@pts/0
30757 appmon 15 0 64884 1816 1032 S 0.0 0.0 0:00.01 -tcsh
tar.bz2
pliku?top
dane wyjściowe pokazują, żebzip2
proces jednowątkowy wykorzystuje maksymalnie jeden rdzeń, ale używasz go w systemie czterordzeniowym (jeden proces z wykorzystaniem 100% procesora ->25.1%
czas procesora w przestrzeni użytkownika, 74% bezczynności). Tak więc przy drobnych zmianach możesz jechać 4x szybciej, chyba że coś innego stanie się wąskim gardłem. Przeczytaj uważnie odpowiedź Gillesa. Rozważ użycie procesora w tym samym polu, co dyski przechowujące dane w celu wykonania kompresji. (Możesz nawet kompresować niektóre pliki na jednym urządzeniu, inne na drugim i archiwizować później, więc oba procesory zostaną wykorzystane.)Odpowiedzi:
Pierwszym krokiem jest ustalenie, na czym polega wąskie gardło: czy jest to dyskowe we / wy, sieciowe we / wy czy procesor?
Jeśli wąskim gardłem jest dysk I / O, niewiele możesz zrobić. Upewnij się, że dyski nie obsługują wielu równoległych żądań, ponieważ może to tylko zmniejszyć wydajność.
Jeśli wąskim gardłem jest sieciowe we / wy, uruchom proces kompresji na komputerze, na którym przechowywane są pliki: uruchomienie go na maszynie z mocniejszym procesorem pomaga tylko wtedy, gdy procesor jest wąskim gardłem.
Jeśli wąskim gardłem jest procesor, pierwszą rzeczą do rozważenia jest zastosowanie szybszego algorytmu kompresji. Bzip2 niekoniecznie jest złym wyborem - jego główną słabością jest szybkość dekompresji - ale możesz użyć gzip i poświęcić trochę czasu na szybkość kompresji, lub wypróbować inne formaty, takie jak lzop lub lzma. Możesz także dostroić poziom kompresji: domyślnie bzip2 to
-9
(maksymalny rozmiar bloku, więc maksymalna kompresja, ale także najdłuższy czas kompresji); ustaw zmienną środowiskowąBZIP2
na wartość podobną-3
do wypróbowania poziomu kompresji 3. Ten wątek i ten wątek omawiają popularne algorytmy kompresji; w szczególności ten post na blogu cytowany przez derobert podaje pewne punkty odniesienia, które sugerują, żegzip -9
lubbzip2
na niskim poziomie może być dobrym kompromisem w porównaniu dobzip2 -9
. Ten inny punkt odniesieniaktóry zawiera również lzma (algorytm 7zip, więc możesz użyć7z
zamiasttar --lzma
) sugeruje tolzma
na niskim poziomie można szybciej osiągnąć stopień kompresji bzip2. Prawie każdy wybór inny niż bzip2 poprawi czas dekompresji. Należy pamiętać, że współczynnik kompresji zależy od danych, a szybkość kompresji zależy od wersji programu kompresji, sposobu jego kompilacji i procesora, na którym jest wykonywany.Inną opcją, jeśli wąskim gardłem jest procesor i masz wiele rdzeni, to równoległe kompresowanie. Można to zrobić na dwa sposoby. Jednym z algorytmów kompresji jest kompresja plików osobno (indywidualnie lub w kilku grupach) i jednoczesne
parallel
uruchamianie poleceń archiwizacji / kompresji. Może to zmniejszyć współczynnik kompresji, ale zwiększa szybkość pobierania pojedynczego pliku i działa z dowolnym narzędziem. Drugim podejściem jest użycie równoległej implementacji narzędzia do kompresji; ten wątek zawiera kilka.źródło
7z
aby nie tworzyć „stałego” archiwum lub ograniczać rozmiar „stałych” bloków, będzie on uruchamiał wiele wątków LZMA równolegle, IIRC. dane pliku dziennika są szczególnym przypadkiem kompresji, ponieważ zazwyczaj są bardzo redundantne (duże podobieństwo między wierszami). Na pewno warto badaniagzip
,bzip2
ixz
na specyficzny plików dziennika PO za, zamiast po prostu patrząc na ogólnych wzorców kompresji, aby wykluczyć wszelkie opcje. Nawet szybko sprężarki są warte rozważenia (lzop
,lz4
,snappy
).xz
. Użyjtar -J
lub--xz
nie --lzma..lzma
jest uważany za „starszy” format pliku . Wielokrotne iteracje formatów plików do kompresji LZMA to trochę zawstydzenie i coś, co powinni mieć za pierwszym razem. Ale AFAIK jest teraz w zasadzie dobry, a .xz nie zostanie zastąpiony innym formatem plików dla tego samego strumienia kompresji.Możesz zainstalować
pigz
równoległy gzip i używać tar z kompresją wielowątkową. Lubić:Gdzie
-I
jest opcja:Oczywiście, jeśli twój NAS nie ma wielu rdzeni / mocnego procesora, i tak jesteś ograniczony mocą procesora.
Szybkość dysku twardego / macierzy, na której działa maszyna wirtualna i kompresja, może również stanowić wąskie gardło.
źródło
pbzip2
lublbzip2
.Zdecydowanie najszybszym i najskuteczniejszym sposobem kompresji danych jest wygenerowanie ich mniej.
Jakie rodzaje dzienników generujesz? 200 GB dziennie wydaje się całkiem sporo (chyba że korzystasz z Google lub usługodawcy internetowego ...), weź pod uwagę, że 1 MB tekstu to około 500 stron, więc generujesz równowartość 100 milionów stron tekstu dziennie, będziesz wypełnij bibliotekę kongresową w ciągu tygodnia.
Sprawdź swoje dane dziennika, jeśli możesz je jakoś zmniejszyć i nadal uzyskać to, czego potrzebujesz z dzienników. Na przykład poprzez obniżenie poziomu dziennika lub użycie formatu dziennika terser. Lub jeśli używasz dzienników do statystyk, przetwarzaj statystyki w locie i zrzuć plik z podsumowaniem, a następnie filtruj dzienniki przed kompresją do przechowywania.
źródło
Możesz zmniejszyć stopień kompresji (pod względem zaoszczędzonej przestrzeni), aby przyspieszyć. Na początek, bzip2 jest DUŻO wolniejszy niż gzip, choć kompresuje mniejszy. Możesz także zmienić poziom kompresji bzip2, gzip lub większości programów do kompresji, aby zmienić rozmiar na szybkość.
Jeśli nie chcesz handlować rozmiarem prędkości, prawdopodobnie nadal możesz uzyskać taki sam lub mniejszy rozmiar, a jednocześnie uzyskać poprawę prędkości za pomocą kompresora korzystającego z LZMA (na przykład xz).
Jeśli szukasz, znajdziesz testy porównawcze, ale najlepszym rozwiązaniem jest przeprowadzenie testów z własnym plikiem na docelowym sprzęcie.
źródło
Jeśli jedynym wymaganiem jest to, że kompresja jest szybka , bardzo poleciłbym lz4 .
Jest stosowany w wielu miejscach, w których szybkość kompresji jest ważniejsza niż współczynnik kompresji (np. Systemy plików z przezroczystą kompresją, takie jak ZFS)
źródło