Nén một số lượng lớn các tệp lớn nhanh


16

Tôi có khoảng 200 GB dữ liệu nhật ký được tạo hàng ngày, được phân phối trong khoảng 150 tệp nhật ký khác nhau.

Tôi có một tập lệnh di chuyển các tập tin đến một vị trí tạm thời và thực hiện tar-bz2 trên thư mục tạm thời.

Tôi nhận được kết quả tốt khi nhật ký 200 GB được nén xuống còn khoảng 12-15 GB.

Vấn đề là phải mất mãi mãi để nén các tập tin. Các cron công việc chạy tại 02:30 hàng ngày và tiếp tục chạy cho đến 5: 00-6: 00 PM.

Có cách nào để cải thiện tốc độ nén và hoàn thành công việc nhanh hơn không? Có ý kiến ​​gì không?

Đừng lo lắng về các quy trình khác và tất cả, vị trí nén xảy ra là trên một NAS và tôi có thể chạy gắn kết NAS trên một máy ảo chuyên dụng và chạy tập lệnh nén từ đó.

Đây là đầu ra của đầu để tham khảo:

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
Nếu bạn có nhiều CPU và bạn có hoặc có thể chia nó thành nhiều tệp tar, bạn có thể chạy nhiều lần nén.
Jeff Schaller

@JeffSchaller có thể nhận được nhiều quy trình bzip2 nén các tệp khác nhau nhưng ghi vào cùng một tar.bz2tệp không?
anu

2
Các tệp nhật ký được tạo trên đĩa cục bộ trước khi chuyển sang NAS? Nếu nén thì di chuyển; theo cách đó, bạn chỉ gửi 15Gb dữ liệu qua mạng chứ không phải 100 (di chuyển) rồi 115 (100read + 15write) khi nén. Ngoài ra, có vẻ như bạn có thể bị ràng buộc CPU trên một quy trình bzip2 đó, do đó, việc chạy song song (một cho mỗi CPU) có thể giúp ích (cho đến khi bạn đạt giới hạn I / O). Hoặc sử dụng nén đơn giản hơn (ví dụ: "gzip -1"). Nó sẽ không tiết kiệm nhiều dung lượng đĩa nhưng nó sẽ chạy nhanh hơn.
Stephen Harris

@Sukminder Tôi chắc chắn sẽ thử điều này và thấy sự khác biệt về kích thước. Cảm ơn.
anu

topĐầu ra của bạn cho thấy bzip2quy trình xử lý đơn luồng của bạn đạt tối đa một lõi, nhưng bạn đang chạy nó trên hệ thống lõi tứ (Một quy trình sử dụng CPU 100% -> 25.1%thời gian CPU không gian người dùng, 74% không hoạt động). Vì vậy, với những thay đổi nhỏ, bạn có thể tăng gấp 4 lần, trừ khi điều gì đó khác trở thành nút cổ chai. Đọc Gilles trả lời cẩn thận. Cân nhắc sử dụng CPU trong cùng hộp với các đĩa chứa dữ liệu để thực hiện nén. (Bạn thậm chí có thể nén một số tệp của mình trên một hộp, các tệp khác và lưu trữ sau đó, vì vậy cả hai CPU đều được sử dụng.)
Peter Cordes

Câu trả lời:


24

Bước đầu tiên là tìm ra nút thắt cổ chai là gì: đó là I / O đĩa, I / O mạng hay CPU?

Nếu nút cổ chai là I / O của đĩa, bạn không thể làm được gì nhiều. Đảm bảo rằng các đĩa không phục vụ nhiều yêu cầu song song vì điều đó chỉ có thể làm giảm hiệu suất.

Nếu nút cổ chai là I / O mạng, hãy chạy quy trình nén trên máy nơi lưu trữ các tệp: chạy trên máy có CPU mạnh hơn chỉ giúp nếu CPU là nút cổ chai.

Nếu nút cổ chai là CPU, thì điều đầu tiên cần xem xét là sử dụng thuật toán nén nhanh hơn. Bzip2 không hẳn là một lựa chọn tồi - điểm yếu chính của nó là tốc độ giải nén - nhưng bạn có thể sử dụng gzip và hy sinh một số kích thước cho tốc độ nén hoặc thử các định dạng khác như lzop hoặc lzma. Bạn cũng có thể điều chỉnh mức nén: bzip2 mặc định thành -9(kích thước khối tối đa, để nén tối đa, nhưng cũng có thời gian nén lâu nhất); đặt biến môi trường BZIP2thành một giá trị như -3để thử mức nén 3. Chuỗi nàyluồng này thảo luận về các thuật toán nén phổ biến; đặc biệt bài đăng trên blog này được trích dẫn bởi derobert đưa ra một số điểm chuẩn gợi ý rằng gzip -9hoặcbzip2với mức độ thấp có thể là một sự thỏa hiệp tốt so với bzip2 -9. Điểm chuẩn khác này cũng bao gồm lzma (thuật toán 7zip, do đó bạn có thể sử dụng 7zthay vì tar --lzma) gợi ý rằng lzmaở mức thấp có thể đạt tỷ lệ nén bzip2 nhanh hơn. Chỉ cần bất kỳ sự lựa chọn nào khác ngoài bzip2 sẽ cải thiện thời gian giải nén. Hãy nhớ rằng tỷ lệ nén phụ thuộc vào dữ liệu và tốc độ nén phụ thuộc vào phiên bản của chương trình nén, vào cách nó được biên dịch và vào CPU mà nó được thực thi.

Một tùy chọn khác nếu nút cổ chai là CPU và bạn có nhiều lõi là song song việc nén. Có hai cách để làm điều đó. Một thuật toán hoạt động với bất kỳ thuật toán nén nào là nén các tệp riêng biệt (riêng lẻ hoặc trong một vài nhóm) và sử dụng parallelđể chạy các lệnh lưu trữ / nén song song. Điều này có thể làm giảm tỷ lệ nén nhưng tăng tốc độ truy xuất tệp riêng lẻ và hoạt động với bất kỳ công cụ nào. Cách tiếp cận khác là sử dụng một công cụ nén song song; chủ đề này liệt kê một số.


4
"Nếu nút cổ chai là I / O của đĩa, bạn không thể làm được gì nhiều." Điều đó có thể đúng ở đây, vì tỷ lệ nén đã tốt, nhưng nói chung khi I / O là nút cổ chai, có thể đáng để xem xét sử dụng nhiều CPU hơn để có tỷ lệ nén tốt hơn (sử dụng các cài đặt nén khác nhau hoặc thuật toán khác nhau). .. bạn thực sự không thể giảm "Tôi" (vì bạn cần đọc tất cả dữ liệu) nhưng đôi khi bạn có thể giảm đáng kể "O" :-)
psmears

1
Nếu bạn yêu cầu 7zkhông tạo một kho lưu trữ "rắn" hoặc giới hạn kích thước của các khối "rắn", nó sẽ chạy các luồng LZMA đột biến song song, IIRC. dữ liệu tệp nhật ký là trường hợp đặc biệt để nén, bởi vì nó có xu hướng rất dư thừa (rất nhiều điểm tương đồng giữa các dòng). Đó chắc chắn là giá trị thử nghiệm gzip, bzip2xztrên các tập tin log cụ thể của OP, thay vì chỉ nhìn vào các tiêu chuẩn nén tổng quát để loại trừ bất kỳ tùy chọn. Ngay cả máy nén nhanh là đáng xem xét ( lzop, lz4, snappy).
Peter Cordes

Các máy nén LZMA ưa thích những ngày này là xz. Sử dụng tar -Jhoặc --xz, không --lzma. .lzmađược coi là một định dạng tập tin "di sản" . Việc lặp lại nhiều định dạng tệp để nén LZMA là một chút bối rối, và điều gì đó đáng lẽ họ phải có ngay lần đầu tiên. Nhưng AFAIK về cơ bản là tốt bây giờ và .xz sẽ không bị thay thế bởi một định dạng tệp khác cho cùng một luồng nén.
Peter Cordes

7z có khả năng nén và đa luồng tuyệt vời, nhưng do định dạng lưu trữ (cần một chỉ mục hoặc có thể có lỗi?) Tôi không nghĩ rằng nó có thể được sử dụng ở giữa một đường ống - nó sẽ không sử dụng stdin stdout cùng một lúc
Xen2050

Điều này thực sự hữu ích và sâu sắc. Nhóm của tôi cho rằng hoạt động của NFS là một nút cổ chai lớn.
anu

16

Bạn có thể cài đặt pigz, gzip song song và sử dụng tar với nén đa luồng. Như:

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

Trường hợp -Itùy chọn là:

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

Tất nhiên, nếu NAS của bạn không có nhiều lõi / CPU mạnh, thì dù sao bạn cũng bị giới hạn bởi sức mạnh của CPU.

Tốc độ của đĩa cứng / mảng mà VM và nén đang chạy cũng có thể là một nút cổ chai.


1
Và nếu bạn muốn sử dụng bzip2, bạn có thể sử dụng pbzip2hoặc lbzip2.
Radovan Garabík

2
Đây là câu trả lời tốt nhất của bạn. Nhưng trước tiên, hãy đảm bảo rằng bước đầu tiên của bạn là đến một vị trí trên cùng hệ thống tệp với các tệp gốc. Mặt khác, "di chuyển" của bạn thực sự là một byte-copy-then-xóa. Trên cùng một hệ thống tập tin, di chuyển là sự sắp xếp lại các liên kết hệ thống tập tin. Đó là những đơn đặt hàng có cường độ nhanh hơn. Đối với các logfile của tôi có hàng trăm Gigabyte lớn, pigz đã tạo ra sự khác biệt. Bạn có thể cho nó biết có bao nhiêu luồng song song để chạy. Miễn là cpu của bạn có nhiều lõi, tôi sẽ không mất nhiều thời gian để điều tra. Bạn có thể muốn pigz trong bất kỳ sự kiện nào; bạn có thể nhận được tăng tốc của bạn ngay lập tức.
Mike S

Khi bạn đang làm việc, hãy nhìn vào đầu ra htop và iuler của bạn và quan sát hiệu suất hệ thống của bạn, nếu bạn muốn điều tra thêm về hệ thống của mình. Nhưng một lần nữa, tôi sẽ không còn cố gắng và nén các tệp lớn mà không có pigz. Trên một hệ thống đa lõi hiện đại, thật ngớ ngẩn khi không sử dụng nó. Đó là một chiến thắng ngay lập tức - bạn sẽ thấy.
Mike S

5

Cho đến nay, cách nén dữ liệu nhanh nhất và hiệu quả nhất là tạo ra ít dữ liệu hơn.

Những loại nhật ký bạn đang tạo ra? 200 GB mỗi ngày nghe có vẻ khá nhiều (trừ khi bạn là google hoặc một số ISP ...), hãy xem xét rằng 1 MB văn bản có khoảng 500 trang, vì vậy bạn sẽ tạo ra tương đương 100 triệu trang văn bản mỗi ngày, bạn sẽ điền vào thư viện quốc hội trong một tuần.

Xem qua dữ liệu nhật ký của bạn nếu bạn có thể giảm nó bằng cách nào đó và vẫn nhận được những gì bạn cần từ nhật ký. Ví dụ: bằng cách giảm mức độ nhật ký hoặc sử dụng định dạng nhật ký terser. Hoặc nếu bạn đang sử dụng nhật ký để thống kê, hãy xử lý số liệu thống kê nhanh chóng và kết xuất một tệp có tóm tắt và sau đó lọc nhật ký trước khi nén để lưu trữ.


Đây là một giải pháp triết học thú vị. Giải pháp của hầu hết các vấn đề trong cuộc sống là tránh hoàn toàn vấn đề. Đó là cho đến khi một người kiểm tra chặt chẽ đề nghị và nhận ra rằng có 100 người và 1000 phê duyệt mà người ta phải trải qua để đạt được điều này.
anu

1
@anu Không có ngữ cảnh cho câu hỏi được đưa ra nên tôi giả sử không có. Và bạn có thể vui lòng cho tôi biết bạn đã nhận được 1000 số phê duyệt từ đâu không? Đối với tôi có vẻ như bạn vừa làm điều đó lên.
Emily L.

Tôi sẽ nâng cao điều này. Đây là giải pháp thường bị bỏ qua, nhưng một khi được chú ý, nổi bật cho nhiều vấn đề của cuộc sống.
jrw32982

Chà .. bây giờ tôi không còn làm việc ở đó nữa, tôi ít nhất có thể tiết lộ rằng đây là một vấn đề tại Apple. Cụ thể hơn trên ngăn xếp dịch vụ phục vụ cửa hàng ứng dụng trực tuyến ... vì vậy, có 1000 sự chấp thuận gần như là thực tế bởi vì họ có 1000 dịch vụ siêu nhỏ và mỗi dịch vụ đều tạo ra các bản ghi cần được nén và sẽ phải đăng nhập để thay đổi mức ghi nhật ký, v.v ... Dù sao đi nữa ... chúng tôi đã tìm ra một giải pháp cho btw đường phố này .. tương đối giống với gzip song song được giảm tải cho các dịch vụ siêu nhỏ khác.
anu

3

Nếu yêu cầu duy nhất là nén nhanh , tôi khuyên bạn nên sử dụng lz4 rất cao.

Nó được sử dụng ở nhiều nơi mà tốc độ nén quan trọng hơn tỷ lệ nén (ví dụ: các hệ thống tệp có nén trong suốt như ZFS)


Chưa bao giờ nghe về nó trước đây, có một chương trình có khả năng đã được cài đặt thực tế ở mọi nơi sử dụng nó, như xz không?
Xen2050

2

Bạn có thể giảm lượng nén (về không gian được lưu) để làm cho nó nhanh hơn. Để bắt đầu, bzip2 chậm hơn so với gzip, mặc dù nó nén nhỏ hơn. Bạn cũng có thể thay đổi mức độ nén của bzip2, gzip hoặc hầu hết các chương trình nén để đổi kích thước cho tốc độ.

Nếu bạn không sẵn sàng giao dịch kích thước tốc độ, bạn vẫn có thể có cùng kích thước hoặc nhỏ hơn trong khi vẫn cải thiện tốc độ bằng máy nén sử dụng LZMA (ví dụ xz).

Bạn sẽ tìm thấy điểm chuẩn nếu bạn tìm kiếm, nhưng đặt cược tốt nhất của bạn là thực hiện một số thử nghiệm với tệp của riêng bạn trên phần cứng mục tiêu của bạn.

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.