Nén tốt nhất cho ZFS gửi / recv


15

Tôi đang gửi các ảnh chụp nhanh ZFS tăng dần qua một đường T1 điểm-điểm và chúng ta đến một điểm mà các ảnh chụp nhanh có giá trị trong một ngày chỉ có thể vượt qua được trước khi bắt đầu sao lưu tiếp theo. Lệnh send / recv của chúng tôi là:

zfs send -i tank/vm@2009-10-10 tank/vm@2009-10-12 | bzip2 -c | \
ssh offsite-backup "bzcat | zfs recv -F tank/vm"

Tôi có rất nhiều chu kỳ CPU để dự phòng. Có một thuật toán nén tốt hơn hoặc phương pháp thay thế nào tôi có thể sử dụng để đẩy ít dữ liệu hơn dòng không?


1
Bạn đã xác minh nó thực sự là liên kết đó là phần chậm nhất? Có lẽ đó là đĩa đọc / ghi.
kbyrd

Vâng, tôi nhận được 80-100 MBps kết nối với hộp thông qua NFS. Kết nối mạng là 1,5 Mb / giây
Sysadminicus

3
Bạn đã thử sử dụng lzma --best chưa?
Amok

1
Như Amuck đã chỉ ra, LZMA hiện là thuật toán nén dữ liệu chung tốt nhất hiện có.
Chris S

Ví dụ: số liệu thống kê cho thấy zfs receivecó thể là thủ phạm:received 953MB stream in 36 seconds (26.5MB/sec)
poige

Câu trả lời:


2

Có vẻ như bạn đã thử tất cả các cơ chế nén tốt nhất và vẫn bị giới hạn bởi tốc độ đường truyền. Giả sử chạy một dòng nhanh hơn là điều không thể, bạn có nghĩ rằng chỉ chạy các bản sao lưu ít thường xuyên hơn để chúng có nhiều thời gian hơn để chạy không?

Nói tóm lại, có cách nào để giảm lượng dữ liệu được ghi không? Không biết ứng dụng của bạn xếp chồng rất khó để nói như thế nào, nhưng chỉ cần làm những việc như đảm bảo các ứng dụng sẽ ghi đè lên các tệp hiện có thay vì tạo các tệp mới có thể giúp ích. Và đảm bảo rằng bạn không lưu các bản sao lưu của tệp tạm thời / bộ đệm mà bạn không cần.


9

Đây là những gì tôi đã học được làm chính xác những gì bạn đang làm. Tôi đề nghị sử dụng mbuffer. Khi kiểm tra trong môi trường của tôi, nó chỉ giúp ở đầu nhận, không có nó thì việc gửi sẽ bị chậm lại trong khi nhận được bắt kịp.

Một số ví dụ: http://everycity.co.uk/alasdair/2010/07/USE-mbuffer-to-speed-up-slow-zfs-send-zfs-receive/

Trang chủ với các tùy chọn và cú pháp http://www.maier-komor.de/mbuffer.html

Lệnh gửi từ tập lệnh sao chép của tôi:

zfs send -i tank/pool@oldsnap tank/pool@newsnap | ssh -c arcfour remotehostip "mbuffer -s 128k -m 1G | zfs receive -F tank/pool"

điều này chạy mbuffer trên máy chủ từ xa như một bộ đệm nhận để việc gửi chạy càng nhanh càng tốt. Tôi chạy một dòng 20mbit và thấy rằng có mbuffer ở phía gửi cũng không giúp được gì, hộp zfs chính của tôi đang sử dụng tất cả ram như bộ đệm nên việc cung cấp 1g cho mbuffer sẽ yêu cầu tôi giảm một số kích thước bộ đệm.

Ngoài ra, và đây không thực sự là lĩnh vực chuyên môn của tôi, tôi nghĩ tốt nhất là cứ để ssh thực hiện việc nén. Trong ví dụ của bạn, tôi nghĩ rằng bạn đang sử dụng bzip và sau đó sử dụng ssh mà theo mặc định sử dụng nén, vì vậy SSH đang cố gắng nén một luồng nén. Cuối cùng tôi đã sử dụng arcfour làm mật mã vì nó ít tốn CPU nhất và điều đó rất quan trọng đối với tôi. Bạn có thể có kết quả tốt hơn với một mật mã khác, nhưng tôi chắc chắn đề nghị cho phép SSH thực hiện nén (hoặc tắt nén ssh nếu bạn thực sự muốn sử dụng thứ gì đó không hỗ trợ).

Điều thực sự thú vị là việc sử dụng mbuffer khi gửi và nhận trên localhost cũng giúp tăng tốc mọi thứ:

zfs send tank/pool@snapshot | mbuffer -s 128k -m 4G -o - | zfs receive -F tank2/pool

Tôi thấy rằng 4g cho chuyển localhost dường như là sweetspot đối với tôi. Nó chỉ cho thấy rằng gửi / nhận zfs không thực sự thích độ trễ hoặc bất kỳ tạm dừng nào khác trong luồng để hoạt động tốt nhất.

Chỉ cần kinh nghiệm của tôi, hy vọng điều này sẽ giúp. Tôi đã mất một lúc để tìm ra tất cả điều này.


1
Cảm ơn rất nhiều cho bài viết này. Nhìn vào zfs gửi kỹ hơn tôi rất nhanh có cảm giác rằng nó có hành vi xấu (hay còn gọi là "thiết kế") khi gửi đến mục tiêu bị ràng buộc độ trễ. Sau khoảng một chục kết quả nói rằng zfs không bao giờ có thể đổ lỗi cho bất cứ điều gì. Tôi rất biết ơn bạn đã dành thời gian để xem xét nó và đăng kết quả của bạn.
Florian Heigl

2

Đây là một câu trả lời cho câu hỏi cụ thể của bạn:

Bạn có thể thử rzip , nhưng nó hoạt động theo những cách khác một chút so với nén / bzip / gzip:

rzip hy vọng có thể đọc toàn bộ tập tin, vì vậy nó không thể chạy trong một đường ống dẫn. Điều này sẽ làm tăng đáng kể yêu cầu lưu trữ cục bộ của bạn và bạn sẽ không thể chạy bản sao lưu và gửi bản sao lưu qua dây trong một ống duy nhất. Điều đó nói rằng, các tệp kết quả, ít nhất là theo thử nghiệm này , nhỏ hơn một chút.

Nếu hạn chế tài nguyên của bạn là đường ống của bạn, dù sao đi nữa, bạn sẽ chạy các bản sao lưu 24x7 vì vậy bạn sẽ cần phải sao chép liên tục các ảnh chụp nhanh và hy vọng bạn sẽ tiếp tục.

Lệnh mới của bạn sẽ là:

remotedir=/big/filesystem/on/remote/machine/
while 
  snaploc=/some/big/filesystem/
  now=$(date +%s)
  snap=snapshot.$now.zfssnap
  test -f $snaploc/$snap
do
  sleep 1
done

zfs send -i tank/vm@2009-10-10 tank/vm@2009-10-12 > $snaploc/$snap &&
rzip $snaploc/$snap &&
ssh offsite-backup "
        cat > $remotedir/$snap.rzip && 
        rzip -d $remotedir/$snap.rzip && 
        zfs recv -F tank/vm < $remotedir/$snap &&
        rm $remotedir/$snap " < $snaploc/$snap &&
rm $snaploc/$snap

Bạn sẽ muốn sửa lỗi tốt hơn và bạn sẽ muốn xem xét sử dụng một cái gì đó như rsync để chuyển các tệp nén để nếu việc chuyển thất bại ở giữa, bạn có thể chọn nơi bạn rời đi.


2

Mọi thứ đã thay đổi trong những năm kể từ khi câu hỏi này được đăng:

1: ZFS hiện hỗ trợ sao chép nén, chỉ cần thêm cờ -c vào lệnh gửi zfs và chặn những gì được nén trên đĩa sẽ vẫn được nén khi chúng đi qua ống đến đầu kia. Vẫn có thể có nhiều nén hơn, vì nén mặc định trong ZFS là lz4

2: Máy nén tốt nhất để sử dụng trong trường hợp này là zstd (ZSt Chuẩn), giờ đây nó có chế độ 'thích nghi' sẽ thay đổi mức nén (giữa các mức 19+ được hỗ trợ, cộng với các mức zstd-speed tốc độ cao mới) dựa trên tốc độ của liên kết giữa zfs gửi và zfs recv. Nó nén càng nhiều càng tốt trong khi giữ cho hàng đợi dữ liệu chờ ra khỏi đường ống đến mức tối thiểu. Nếu liên kết của bạn nhanh, nó sẽ không lãng phí thời gian để nén dữ liệu nhiều hơn và nếu liên kết của bạn chậm, nó sẽ tiếp tục hoạt động để nén dữ liệu nhiều hơn và cuối cùng bạn sẽ tiết kiệm thời gian. Nó cũng hỗ trợ nén theo luồng, vì vậy tôi có thể tận dụng nhiều lõi, mà gzip và bzip không có, bên ngoài các phiên bản đặc biệt như pigzip.


1

Tôi cho rằng bạn chỉ đơn giản là không thể tăng băng thông thô của trang web của mình ...

Bạn có thể thấy lợi ích từ việc không sử dụng nén trên máy chủ.

Nếu bạn sử dụng một cái gì đó như trình tối ưu hóa wan, nó sẽ có thể tối ưu hóa việc truyền tải tốt hơn nhiều nếu bạn không nén tệp trước khi gửi, tức là bạn làm chính xác những gì bạn đang làm nhưng loại bỏ bzip2 khỏi đường ống. Sau một vài lần sao lưu của bạn, trình tối ưu hóa wan sẽ lưu vào bộ nhớ cache một phần rất lớn những thứ nó thấy trong quá trình chuyển và bạn sẽ thấy những cải thiện lớn về tốc độ truyền.

Nếu bạn đang ở trên một giới hạn, bạn thể thấy một sự cải thiện tương tự bằng cách sử dụng rsync và đồng bộ hóa ảnh chụp nhanh không nén , tức là:

zfs send -i tank/vm@2009-10-10 tank/vm@2009-10-12 > /path/to/snapshotdir/snapshotfile
rsync /path/to/snapshotdir/snapshotfile offsite-backup:/remote/path/to/snapshotfile
ssh offsite-backup 'zfs recv -F tank/vm < /remote/path/to/snapshotfile'

Điều này sẽ nhanh hơn vì rsync sẽ chỉ chuyển sự khác biệt giữa ảnh chụp nhanh của ngày hôm qua và hôm nay. Tùy thuộc vào cách quá trình chụp nhanh hoạt động, vẫn có thể có nhiều dư thừa giữa hai bên ngay cả khi chúng không thực sự là cùng một tệp.

Các wan ưu là của xa cách nhiều khả năng khắc phục vấn đề này (tốt, metro ethernet là hầu hết các con đường có khả năng giải quyết vấn đề này, nhưng chúng tôi sẽ rời khỏi đó tắt bảng). Rsync chỉ là một cú đánh điên cuồng trong bóng tối đáng để thử nghiệm (cục bộ; rsync sẽ cho bạn biết nó đã tiết kiệm được bao nhiêu thời gian trên một bản sao thẳng) trên dữ liệu cục bộ của bạn trước khi viết séc lớn cho sợi hoặc cài đặt dưới lòng sông.


1

Cho những gì nó có giá trị. Tôi sẽ không gửi trực tiếp | nén | giải nén | việc nhận này có thể dẫn đến các sự cố ở cuối nhận nếu đường truyền bị ngắt và các nhóm của bạn sẽ ngoại tuyến trong một thời gian dài trong quá trình nhận. Chúng tôi gửi đến một tệp cục bộ sau đó gzip ảnh chụp nhanh và chuyển bằng rsync (với lòng sông), sau đó chúng tôi nhận được từ tệp. Lòng sông không tối ưu hóa lưu lượng NHƯNG nếu có vấn đề với việc chuyển giao và nó cần phải được khởi động lại, tốc độ lòng sông được gửi lại.

Chúng tôi đã xem xét việc không nén ảnh chụp nhanh tăng dần, sử dụng nén Rupync và không sử dụng bất kỳ nén nào ngoài lòng sông. Thật khó để nói cái nào là tốt nhất nhưng khi chúng ta chuyển arch archogog từ orory bằng nén rsync, tốc độ truyền tải gấp khoảng hai lần so với các tệp đơn giản và lòng sông (với RSync).

Nếu bạn có lòng sông thì hãy sử dụng rsync chứ không phải ssh vì lòng sông hiểu rsync và sẽ cố gắng tối ưu hóa nó và sẽ thêm dữ liệu vào bộ đệm (xem ở trên, khởi động lại chuyển).


1

Kinh nghiệm của tôi zfs sendlà khá bùng nổ mặc dù nhanh hơn nhiều (trung bình) so với bước nén sau. Bản sao lưu của tôi chèn bộ đệm đáng kể sau zfs sendvà nhiều hơn sau gzip:

zfs send $SNAP | mbuffer $QUIET -m 100M | gzip | mbuffer -q -m 20M | gpg ... > file

Trong trường hợp của tôi, thiết bị đầu ra là USB (không phải mạng) được kết nối, nhưng bộ đệm rất quan trọng vì một lý do tương tự: Thời gian sao lưu tổng thể nhanh hơn khi ổ USB được giữ bận 100%. Bạn có thể không gửi ít byte hơn (như bạn yêu cầu) nhưng bạn vẫn có thể hoàn thành sớm hơn. Bộ đệm giữ cho bước nén giới hạn CPU không bị ràng buộc IO.


1

Tôi sử dụng pbzip2 mọi lúc (song song bzip2) khi gửi qua mạng WAN. Vì nó là luồng nên bạn có thể chỉ định số lượng luồng sẽ sử dụng với tùy chọn -p. Trước tiên hãy cài đặt pbzip2 trên cả máy chủ gửi và nhận, hướng dẫn cài đặt có tại http://compression.ca/pbzip2/ .

zfs send -i tank/vm@2009-10-10 tank/vm@2009-10-12 | pbzip2 -c | \
ssh offsite-backup "pbzip2 -dc | zfs recv -F tank/vm"

Chìa khóa chính là tạo ảnh chụp nhanh theo các khoảng thời gian thường xuyên (~ 10 phút) để làm cho kích thước ảnh chụp của bạn nhỏ hơn sau đó gửi từng ảnh chụp nhanh. ssh sẽ không tiếp tục từ luồng ảnh chụp nhanh bị hỏng, vì vậy nếu bạn có một ảnh chụp nhanh lớn để gửi, hãy chuyển luồng sang pbzip2 sau đó phân chia thành các đoạn có kích thước có thể quản lý, sau đó chia nhỏ tệp rsync để nhận máy chủ, sau đó chuyển sang zfs recv các tệp pbzip2 được nối.

zfs send -i tank/vm@2009-10-10 tank/vm@2009-10-12 | pbzip2 -c | \
split -b 500M - /somedir/snap-inc-10-to-12.pbzip2--

điều này sẽ tạo ra các tệp có tên trong khối 500MB:

/somedir/snap-inc-10-to-12.pbzip2--aa
/somedir/snap-inc-10-to-12.pbzip2--ab
/somedir/snap-inc-10-to-12.pbzip2--ac
...

rsync để nhận máy chủ nhiều lần (bạn có thể rsync ngay cả trước khi zfs gửi hoàn tất hoặc ngay khi bạn thấy một đoạn hoàn chỉnh 500 MB), nhấn ctrl + c bất cứ lúc nào để hủy:

while [[ true ]]; do rsync -avP /somedir/snap-inc-10-to-12.pbzip2--* offsite-backup:/somedir ; sleep 1; done;

zfs nhận được:

cat /somedir/snap-inc-10-to-12.pbzip2--* | pbzip2 -dc | zfs recv -Fv tank/vm

Người dùng đã đề cập: Đối với những gì nó có giá trị. Tôi sẽ không gửi trực tiếp | nén | giải nén | việc nhận này có thể dẫn đến các sự cố ở cuối nhận nếu đường truyền bị ngắt và các nhóm của bạn sẽ ngoại tuyến trong một thời gian dài trong quá trình nhận. - Tôi đã gặp sự cố trước đây với các phiên bản zfs cũ hơn <28 trong máy chủ nhận nếu việc gửi / recv đang diễn ra bị gián đoạn do rớt mạng nhưng không đến mức các nhóm bị vi phạm. Nó thật thú vị. Chỉ gửi lại ảnh chụp nhanh nếu "zfs recv" đã thoát trong phần cuối nhận. Giết "zfs recv" bằng tay nếu cần. zfs send / recv hiện đã được cải thiện rất nhiều trong FreeBSD hoặc Linux.


0

Bạn có thể chọn một mật mã nhanh hơn cho ssh có thể là blowfish-cbc, cũng thử các công tắc -123456789

-1 (or --fast) to -9 (or -best)

1
Từ trang man unix: Các bí danh --fast và --best chủ yếu để tương thích với GNU gzip. Đặc biệt, --fast không làm cho mọi thứ nhanh hơn đáng kể. Và --best chỉ chọn hành vi mặc định.
Sysadminicus

1
vì vậy nó không có tác dụng trong trường hợp của bạn Mật mã thì sao?
Istvan

Tôi đã rất may mắn với việc nén LZMA, nhưng có thể là liên kết của bạn quá chậm.
Amok

0

Bạn sẽ cần phải kiểm tra với dữ liệu của bạn. Chỉ cần gửi nó vào một tập tin và nén nó với mỗi phương thức.

Đối với chúng tôi, gzip đã tạo ra một sự khác biệt lớn và chúng tôi chạy mọi thứ thông qua đó, nhưng thậm chí không có sự khác biệt 1% giữa gzip và bzip hoặc 7z.

Nếu bạn đang ở trên một chiếc T1 chậm, bạn sẽ cần lưu trữ nó vào một tập tin và đồng bộ hóa nó.

Đối với những người (không phải bạn), những người bị giới hạn bởi CPU nhiều hơn một chút so với băng thông, như lstvan đã nói một mật mã khác như arcfour128 tăng tốc mọi thứ. Chúng tôi sử dụng nội bộ khi di chuyển mọi thứ xung quanh.


0

Thử nghiệm bật tính năng khấu trừ cho zfs gửi với -D. Tiết kiệm phụ thuộc vào số lượng trùng lặp trong dữ liệu của bạn, tất nhiên.


Vì anh ta đang sử dụng phương tiện -idự phòng "gia tăng", nên không có nhiều hy vọng -Dsẽ mang lại điều gì.
poige

@poige phụ thuộc vào dữ liệu của họ trông như thế nào. Nếu họ tạo ra nhiều dữ liệu có các khối trùng lặp, đó là một chiến thắng lớn. Tôi không thấy làm thế nào - tôi sẽ làm cho nó ít nhiều có khả năng có các khối trùng lặp. Nếu bạn thường tạo dữ liệu có nhiều sự trùng lặp, có lẽ bạn sẽ tạo ra nhiều sự trùng lặp bên trong mỗi ngày, vì vậy - tôi không giúp đỡ hay làm tổn thương.
James Moore

Vâng, nếu bạn có nhiều bản sao, bất kỳ nén nào cũng sẽ chăm sóc nó.
poige

@poige Họ phải đo dựa trên dữ liệu thực tế của họ. Bạn chắc chắn có thể có các bộ dữ liệu nén rất tệ và khấu trừ thực sự tốt. Ví dụ, nhiều bản sao của cùng một phần trích dẫn tệp video nén thực sự tốt và nén ở cấp hệ thống tệp có thể tệ hơn vô dụng.
James Moore

À, trường hợp này - vâng
poige

-1

Thuật toán nén "tốt nhất" phụ thuộc vào loại dữ liệu bạn có - nếu bạn đang đẩy nén bộ sưu tập MP3 có thể sẽ làm chậm quá trình, trong khi văn bản / tệp dữ liệu có thể được nén đáng kể gzip -9.

Bao nhiêu dữ liệu bạn đang đẩy mỗi ngày?


-1

Bạn đã xem xét điều chỉnh ngăn xếp TCP / IP của mình để bộ đệm TCP và kích thước cửa sổ lớn hơn một chút chưa? bạn có thể sử dụng nddcông cụ trên Solaris cho việc này hoặc sysctlcông cụ trên Linux / BSD / Mac OSX. Trên Solaris, bạn đang tìm kiếm /dev/tcp tcp_max_buf/dev/tcp tcp_cwnd_maxcác giá trị, và trên Linux sysctl, bạn đang tìm kiếm net.ipv4.tcp_mem, net.ipv4.tcp_rmemnet.ipv4.tcp.wmemcác giá trị.

Ngoài ra, các liên kết này có thể là một số trợ giúp bổ sung:

Điều chỉnh hiệu suất Solaris TCP

Có một tập hợp các liên kết ở dưới cùng của trang đó sẽ giải thích cách làm tương tự cho Linux / BSD / OSX.


1
1. Đây là một câu hỏi 5 năm tuổi bạn đang đào lên. 2. Anh ấy không nói rằng liên kết đã không được sử dụng đúng mức và hỏi về nén, mà bạn không tham khảo. 3. Hầu hết các hệ điều hành tự động điều chỉnh kích thước cửa sổ những ngày này. Thông tin bạn liên kết đến đã cũ 3 năm trước khi tác giả đăng nó.
Chris S
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.