많은 수의 큰 파일을 빠르게 압축


16

매일 생성되는 약 200GB의 로그 데이터가 있으며 약 150 개의 서로 다른 로그 파일로 분산됩니다.

파일을 임시 위치로 옮기고 임시 디렉토리에서 tar-bz2를 수행하는 스크립트가 있습니다.

200GB 로그가 약 12-15GB로 압축되어 좋은 결과를 얻습니다.

문제는 파일을 압축하는 데 시간이 오래 걸린다는 것입니다. 크론 작업은 매일 오전 2:30 실행하고 5까지 계속 실행 : 00-6 : 00 오후.

압축 속도를 높이고 작업을 더 빨리 완료 할 수있는 방법이 있습니까? 어떤 아이디어?

다른 프로세스 모두에 대해 걱정하지 마십시오, 압축이 일어나는 위치는에 NAS , 그리고 전용의 NAS 마운트 실행할 수있는 VM을 하고 거기에서 압축 스크립트를 실행합니다.

다음은 참조를위한 top 의 출력입니다 .

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

2
여러 개의 CPU가 있고 여러 개의 tar 파일이 있거나 여러 개의 tar 파일로 분할 할 수있는 경우 여러 개의 압축을 실행할 수 있습니다.
Jeff Schaller

@JeffSchaller 여러 bzip2 프로세스가 다른 파일을 압축하지만 동일한 tar.bz2파일에 쓸 수 있습니까?
anu

2
NAS로 이동하기 전에 로그 파일이 로컬 디스크에서 생성됩니까? 압축 된 경우 이동하십시오. 그런 식으로 압축 할 때 네트워크를 통해 15Gb의 데이터 만 100 (이동)이 아니라 115 (100read + 15write)가 아닙니다. 또는 하나의 bzip2 프로세스에서 CPU가 바인드 된 것처럼 보이므로 여러 개의 병렬 (CPU 당 하나씩)를 실행하면 도움이 될 수 있습니다 (I / O 제한에 도달 할 때까지). 또는 더 간단한 압축을 사용하십시오 (예 : "gzip -1"). 디스크 공간을 많이 절약하지는 않지만 더 빨리 실행됩니다.
Stephen Harris

@ Sukminder 나는 이것을 시도하고 크기의 차이를 볼 것입니다. 감사.
anu

귀하의 top출력 프로그램은 단일 스레드 것을 bzip2프로세스가 하나 개의 코어에서 긁고있다,하지만 당신은 (하나 개의 프로세스가 CPU를 100 % 사용하여 -> 쿼드 코어 시스템을 실행하고 있음을 25.1%사용자 공간 CPU 시간, 74 %의 유휴). 따라서 약간의 변경만으로도 병목 현상이 발생하지 않는 한 4 배 빠르게 진행할 수 있습니다. Gilles의 답변을주의 깊게 읽으십시오. 압축을 수행하기 위해 데이터를 보유한 디스크와 동일한 상자에서 CPU를 사용하는 것이 좋습니다. (일부 상자에서 파일을 압축하고 다른 상자에서 다른 파일을 압축 한 후 보관하여 두 CPU를 모두 사용할 수도 있습니다.)
Peter Cordes

답변:


25

첫 번째 단계는 병목 현상이 무엇인지 파악하는 것입니다. 디스크 I / O, 네트워크 I / O 또는 CPU입니까?

병목 현상이 디스크 I / O이면 할 수있는 일이 많지 않습니다. 디스크가 많은 병렬 요청을 처리하지 않아야 성능이 저하 될 수 있습니다.

병목 현상이 네트워크 I / O 인 경우 파일이 저장된 시스템에서 압축 프로세스를 실행하십시오.보다 강력한 CPU가있는 시스템에서 파일을 실행하면 CPU가 병목 현상 인 경우에만 도움이됩니다.

병목 현상이 CPU 인 경우 가장 먼저 고려해야 할 것은 빠른 압축 알고리즘을 사용하는 것입니다. Bzip2가 반드시 나쁜 선택은 아니지만 압축 약점은 압축 속도이지만 gzip을 사용하여 압축 속도로 크기를 희생하거나 lzop 또는 lzma와 같은 다른 형식을 사용해 볼 수 있습니다. 압축 수준을 조정할 수도 있습니다. bzip2 기본값은 -9(최대 블록 크기, 최대 압축 및 가장 긴 압축 시간)입니다. 환경 변수를 설정할 BZIP2같은 값으로 -3압축 레벨 3 노력 이 실이 실을 일반적인 압축 알고리즘을 논의; 특히 이 블로그 게시물 derobert에 의해 인용 제안 몇 가지 벤치 마크를 제공하는 gzip -9bzip2에 비해 수준이 낮 으면 좋은 절충안 일 수 있습니다 bzip2 -9. lzma (7zip 알고리즘이므로 대신 사용할 수 있음)를 포함하는 다른 벤치 마크 는 낮은 수준에서 bzip2 압축 비율에 더 빨리 도달 할 수 있음을 나타냅니다 . bzip2 이외의 선택은 압축 해제 시간을 향상시킵니다. 압축 비율은 데이터에 따라 다르며 압축 속도는 압축 프로그램의 버전, 컴파일 방법 및 실행되는 CPU에 따라 다릅니다.7ztar --lzmalzma

병목 현상이 CPU이고 여러 코어가있는 경우 다른 옵션은 압축을 병렬화하는 것입니다. 두 가지 방법이 있습니다. 압축 알고리즘과 함께 작동하는 파일은 파일을 개별적으로 (또는 개별적으로 또는 몇 그룹으로) parallel압축하고 보관 / 압축 명령을 병렬로 실행하는 것입니다. 이렇게하면 압축 비율은 줄어들지 만 개별 파일의 검색 속도는 증가하고 모든 도구와 함께 작동합니다. 다른 방법은 압축 도구의 병렬 구현을 사용하는 것입니다. 이 스레드 는 여러 가지를 나열합니다.


4
"병목 현상이 디스크 I / O라면 할 수있는 일이 많지 않습니다." 압축 비율이 이미 좋기 때문에 아마도 여기에 해당하지만 일반적으로 I / O가 병목 현상 일 때 더 많은 압축률을 얻기 위해 더 많은 CPU를 사용하는 것이 좋습니다 (다른 압축 설정 또는 다른 알고리즘 사용). .. 실제로 "I"를 줄일 수는 없지만 (모든 데이터를 읽어야하기 때문에) "O"를 크게 줄일 수 있습니다. :-)
psmears

1
당신이 말할 경우 7z는 "고체"아카이브를 만들거나 "고체"블록의 크기를 제한하지, 그것은 병렬로 IIRC을 mutliple LZMA 스레드를 실행합니다. 로그 파일 데이터는 중복성이 높은 경향이 있기 때문에 압축에 대한 특별한 경우입니다 (행 간 유사성). 그것은 확실히 가치가 테스트입니다 gzip, bzip2그리고 xz다만 어떤 옵션을 배제하기 위해 일반적인 압축 벤치 마크에서 찾고보다는 영업 이익의 특정 로그 파일에. 심지어 빠른 압축기 고려 가치가있다 ( lzop, lz4, snappy).
Peter Cordes

요즘 선호되는 LZMA 압축기는 xz입니다. --lzma가 아닌 tar -J또는을 사용하십시오 --xz. .lzma"레거시"파일 형식으로 간주됩니다 . LZMA 압축을위한 여러 파일 형식의 반복은 약간 당혹스럽고 처음에는 제대로 된 것입니다. 그러나 AFAIK는 현재 기본적으로 좋으며 .xz는 동일한 압축 스트림의 다른 파일 형식으로 대체되지 않습니다.
Peter Cordes

7z는 우수한 압축 및 멀티 스레딩을 가지고 있지만 아카이브 형식 (인덱스 또는 버그가 필요합니까?) 때문에 파이프 라인 중간에 사용할 수 있다고 생각하지 않습니다-stdin stdout을 사용하지 않습니다 동시에
Xen2050

이것은 정말로 도움이되고 통찰력이있었습니다. 우리 팀은 NFS에서의 작업이 큰 병목 현상이라고 생각했습니다.
anu

16

pigz병렬 gzip을 설치 하고 다중 스레드 압축과 함께 tar를 사용할 수 있습니다 . 처럼:

tar -I pigz -cf file.tar.gz *

어디 -I옵션은 다음과 같습니다

-I, --use-compress-program PROG
  filter through PROG

물론, NAS에 여러 개의 코어 / 강력한 CPU가없는 경우 어쨌든 CPU 전력에 의해 제한됩니다.

VM과 압축이 실행중인 하드 디스크 / 어레이의 속도도 병목 현상이 발생할 수 있습니다.


1
bzip2를 사용하려면 pbzip2또는 을 사용할 수 있습니다 lbzip2.
Radovan Garabík

2
이것이 최선의 대답입니다. 그러나 먼저, 첫 번째 이동은 원본 파일과 동일한 파일 시스템에있는 위치로 이동해야합니다. 그렇지 않으면 "이동"은 실제로 바이트 복사 후 삭제입니다. 동일한 파일 시스템에서 이동은 파일 시스템 링크의 재 배열입니다. 훨씬 빠릅니다. 수백 기가 바이트 크기의 로그 파일에 대해 pigz는 모든 차이를 만들었습니다. 실행할 병렬 스레드 수를 알려줄 수 있습니다. CPU에 여러 개의 코어가있는 한 조사하는 데 많은 시간을 소비하지 않습니다. 어떤 경우에도 pigz를 원할 것입니다. 당신은 즉시 속도를 얻을 수 있습니다.
Mike S

일단 돈을 벌면 시스템을 더 자세히 조사하려면 htop 및 iostat 출력을보고 시스템 성능을 관찰하십시오. 그러나 다시 한 번 더 이상 pigz없이 큰 파일을 압축하려고하지 않습니다. 현대식 멀티 코어 시스템에서는 사용하지 않는 것이 바보입니다. 그것은 바로 그러한 승리입니다.
Mike S

7

지금까지 데이터를 압축하는 가장 빠르고 효과적인 방법은 데이터를 적게 생성하는 것입니다.

어떤 종류의 로그를 생성하고 있습니까? 매일 200GB의 소리가 많이 들립니다 (Google 또는 일부 ISP가 아닌 한 ...) 1MB의 텍스트는 약 500 페이지이므로 하루에 1 억 페이지의 텍스트를 생성한다는 것을 고려하십시오. 일주일에 의회 도서관을 채우십시오.

로그 데이터를 어떻게 든 줄일 수 있고 로그에서 필요한 것을 얻을 수 있으면 로그 데이터를 살펴보십시오. 예를 들어, 로그 레벨을 낮추거나 terser 로그 형식을 사용합니다. 또는 통계에 로그를 사용하는 경우 즉시 통계를 처리하고 요약이 포함 된 파일을 덤프 한 다음 저장을 위해 압축하기 전에 로그를 필터링하십시오.


1
이것은 흥미로운 철학적 솔루션입니다. 대부분의 삶의 문제의 해결책은 문제가 전혀없는 것을 피하는 것입니다. 그것은 제안을 면밀히 검토하고이를 달성하기 위해 통과해야하는 100 명의 사람과 1000의 승인이 있다는 것을 깨달을 때까지입니다.
anu

1
@anu 질문에 대한 컨텍스트가 없으므로 아무 것도 가정하지 않았습니다. 그리고 당신은 어디서 1000 번의 승인을 받았는지 말해 줄 수 있습니까? 나에게 그것은 당신이 방금 만든 것처럼 보입니다.
Emily L.

나는 이것을 공표 할 것이다. 이것은 종종 간과되지만 한 번 눈에 띄는 삶의 많은 문제에 대한 탁월한 해결책입니다.
jrw32982는 Monica

1
글쎄 .. 이제는 더 이상 일하지 않기 때문에 이것이 Apple의 문제라는 것을 알 수 있습니다. 보다 구체적으로 온라인 앱 스토어에 서비스를 제공하는 서비스 스택에서 ... 그래, 1000 개의 승인은 1000 개의 마이크로 서비스를 가지고 있으며 각각은 압축해야하고 로그를 변경해야 할 로그를 생성하기 때문에 거의 현실입니다. 로깅 레벨 등 ... 어쨌든 ... 우리는이 내부 btw에 대한 솔루션을 알아 냈습니다. 이것은 다른 마이크로 서비스로 오프로드되는 병렬 gzip과 거의 같습니다.
anu

3

압축 공간을 절약하기 위해 압축 량을 줄일 수 있습니다 (저장 공간 측면에서). 우선 bzip2는 압축이 작지만 gzip보다 훨씬 느립니다. bzip2, gzip 또는 대부분의 압축 프로그램의 압축 수준을 속도에 맞게 크기를 변경할 수 있습니다.

속도의 크기를 바꾸고 싶지 않다면 LZMA (예 : xz)를 사용하는 압축기를 사용하여 속도를 향상 시키면서도 같은 크기 또는 작은 크기를 얻을 수 있습니다.

검색하면 벤치 마크를 찾을 수 있지만 가장 좋은 방법은 대상 하드웨어의 자체 파일로 일부 테스트를 수행하는 것입니다.


3

압축이 빠르다 는 것이 유일한 요구 사항이라면 lz4를 적극 권장 합니다.

압축 속도보다 압축 속도가 더 중요한 많은 장소에서 사용됩니다 (예 : ZFS와 같이 투명한 압축 파일 시스템)


전에는 들어 본 적이 없으며 xz와 같이 실제로 사용하는 모든 위치에 이미 설치되어있는 프로그램이 있습니까?
Xen2050
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.