Tôi hoàn toàn mới với ZFS, vì vậy, khi bắt đầu tôi nghĩ tôi đã thực hiện một số điểm chuẩn đơn giản trên đó để cảm nhận về cách hoạt động của nó. Tôi muốn đẩy các giới hạn về hiệu suất của nó vì vậy tôi đã cung cấp một phiên bản Amazon EC2 i2.8xlarge
(gần $ 7 / giờ, thời gian thực sự là tiền!). Trường hợp này có 8 ổ SSD 800 GB.
Tôi đã fio
tự mình kiểm tra ổ SSD và nhận được kết quả đầu ra sau đây (được cắt bớt):
$ sudo fio --name randwrite --ioengine=libaio --iodepth=2 --rw=randwrite --bs=4k --size=400G --numjobs=8 --runtime=300 --group_reporting --direct=1 --filename=/dev/xvdb
[trimmed]
write: io=67178MB, bw=229299KB/s, iops=57324, runt=300004msec
[trimmed]
IOK 57K cho ghi ngẫu nhiên 4K. Đáng kính trọng.
Sau đó, tôi đã tạo ra một khối lượng ZFS kéo dài tất cả 8. Lúc đầu, tôi có một raidz1
vdev với tất cả 8 ổ SSD trong đó, nhưng tôi đã đọc về lý do điều này không tốt cho hiệu suất, vì vậy tôi đã kết thúc với bốn mirror
vdev, như vậy:
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi
$ sudo zpool list -v
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
testpool 2.91T 284K 2.91T - 0% 0% 1.00x ONLINE -
mirror 744G 112K 744G - 0% 0%
xvdb - - - - - -
xvdc - - - - - -
mirror 744G 60K 744G - 0% 0%
xvdd - - - - - -
xvde - - - - - -
mirror 744G 0 744G - 0% 0%
xvdf - - - - - -
xvdg - - - - - -
mirror 744G 112K 744G - 0% 0%
xvdh - - - - - -
xvdi - - - - - -
Tôi đặt recordsize thành 4K và chạy thử nghiệm của mình:
$ sudo zfs set recordsize=4k testpool
$ sudo fio --name randwrite --ioengine=libaio --iodepth=2 --rw=randwrite --bs=4k --size=400G --numjobs=8 --runtime=300 --group_reporting --filename=/testpool/testfile --fallocate=none
[trimmed]
write: io=61500MB, bw=209919KB/s, iops=52479, runt=300001msec
slat (usec): min=13, max=155081, avg=145.24, stdev=901.21
clat (usec): min=3, max=155089, avg=154.37, stdev=930.54
lat (usec): min=35, max=155149, avg=300.91, stdev=1333.81
[trimmed]
Tôi chỉ nhận được 52K IOPS trên nhóm ZFS này. Điều đó thực sự tồi tệ hơn một ổ SSD.
Tôi không hiểu những gì tôi đang làm sai ở đây. Tôi đã cấu hình ZFS không chính xác, hay đây là một thử nghiệm kém về hiệu suất ZFS?
Lưu ý Tôi đang sử dụng hình ảnh CentOS 7 HVM 64 bit chính thức, mặc dù tôi đã nâng cấp lên kernel 4.4.5 elrepo:
$ uname -a
Linux ip-172-31-43-196.ec2.internal 4.4.5-1.el7.elrepo.x86_64 #1 SMP Thu Mar 10 11:45:51 EST 2016 x86_64 x86_64 x86_64 GNU/Linux
Tôi đã cài đặt ZFS từ repo zfs được liệt kê ở đây . Tôi có phiên bản 0.6.5.5 của zfs
gói.
CẬP NHẬT : Đề xuất của Per @ ewwhite tôi đã thử ashift=12
và ashift=13
:
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=12 -f
và
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=13 -f
Không ai trong số này làm cho bất kỳ sự khác biệt. Từ những gì tôi hiểu, các bit ZFS mới nhất đủ thông minh để xác định SSD 4K và sử dụng các giá trị mặc định hợp lý.
Tôi đã thông báo tuy nhiên việc sử dụng CPU là tăng vọt. @Tim đề xuất điều này nhưng tôi đã loại bỏ nó tuy nhiên tôi nghĩ rằng tôi đã không xem CPU đủ lâu để nhận thấy. Có một cái gì đó giống như 30 lõi CPU trong trường hợp này và việc sử dụng CPU đang tăng lên đến 80%. Quá trình đói? z_wr_iss
, rất nhiều trường hợp của nó.
Tôi xác nhận nén là tắt, vì vậy nó không phải là công cụ nén.
Tôi không sử dụng raidz, vì vậy nó không nên là tính toán tương đương.
Tôi đã làm một perf top
và nó cho thấy phần lớn thời gian kernel chi tiêu trong _raw_spin_unlock_irqrestore
năm z_wr_int_4
và osq_lock
trong z_wr_iss
.
Bây giờ tôi tin rằng có một thành phần CPU cho nút cổ chai hiệu năng này, mặc dù tôi không thể tìm ra nó có thể là gì.
CẬP NHẬT 2 : Đề xuất của Per @ewwhite và những người khác rằng đó là bản chất ảo hóa của môi trường này tạo ra sự không chắc chắn về hiệu suất, tôi đã sử dụng fio
để ghi điểm 4K ngẫu nhiên trải rộng trên bốn ổ SSD trong môi trường. Mỗi ổ SSD tự cung cấp ~ 55K IOPS, vì vậy tôi mong đợi ở đâu đó khoảng 240K IO trên bốn trong số chúng. Đó là ít nhiều những gì tôi nhận được:
$ sudo fio --name randwrite --ioengine=libaio --iodepth=8 --rw=randwrite --bs=4k --size=398G --numjobs=8 --runtime=300 --group_reporting --filename=/dev/xvdb:/dev/xvdc:/dev/xvdd:/dev/xvde
randwrite: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=8
...
randwrite: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=8
fio-2.1.5
Starting 8 processes
[trimmed]
write: io=288550MB, bw=984860KB/s, iops=246215, runt=300017msec
slat (usec): min=1, max=24609, avg=30.27, stdev=566.55
clat (usec): min=3, max=2443.8K, avg=227.05, stdev=1834.40
lat (usec): min=27, max=2443.8K, avg=257.62, stdev=1917.54
[trimmed]
Điều này cho thấy rõ môi trường, được ảo hóa mặc dù có thể, có thể duy trì IOPS cao hơn nhiều so với những gì tôi đang thấy. Một cái gì đó về cách ZFS được thực hiện là giữ cho nó không đạt tốc độ tối đa. Tôi chỉ không thể hiểu đó là gì.