ZFS 池慢速順序讀取
我有一個關於這個問題的相關問題,但是它太複雜而且太大了,所以我決定我應該把這個問題分成 NFS 和本地問題。我也嘗試在 zfs-discuss 郵件列表上詢問這個問題,但沒有取得多大成功。
大綱:我是如何設置的以及我的期望
- 我有一個帶有 4 個磁碟的 ZFS 池。2TB RED 配置為 2 個條帶化鏡像 (RAID 10)。在 Linux 上,zfsonlinux。沒有記憶體或日誌設備。
- 跨鏡像平衡數據(對 ZFS 很重要)
- 每個磁碟可以以 147MB/秒的速度並行讀取(原始 w/dd),總吞吐量為 588MB/秒。
- 基於類似的 4TB RED 磁碟的基準,我預計每個磁碟的順序數據寫入速度約為 115MB/秒,讀取速度為 138MB/秒,重寫速度為 50MB/秒。我預計讀取或寫入速度不會低於 100MB/秒,因為現在任何磁碟都可以做到這一點。
- 我想當負載讀取或寫入順序數據時,我會看到所有 4 個磁碟上 100% 的 IO 使用率。並且磁碟將在 100% 的使用率下輸出超過 100MB/秒。
- 我認為該池將在單個磁碟上為我提供大約 2 倍的寫入、2 倍的重寫和 4 倍的讀取性能——我錯了嗎?
- 新我認為同一池上的 ext4 zvol 與 ZFS 的速度大致相同
我實際得到的
我發現池的讀取性能沒有我預期的那麼高
幾天前在游泳池上的bonnie++基準測試
版本 1.97 ------順序輸出------ --順序輸入- --隨機- 並發 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- 機器大小 K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP 伊戈爾 63G 99 99 232132 47 118787 27 336 97 257072 22 92.7 6
**bonnie++**在 zpool 中的單個 4TB RED 驅動器上
版本 1.97 ------順序輸出------ --順序輸入- --隨機- 並發 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- 機器大小 K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP 伊戈爾 63G 101 99 115288 30 49781 14 326 97 138250 13 111.6 8
據此,讀取和重寫速度基於單個 4TB RED 驅動器的結果是合適的(它們是雙倍的)。但是,我期望的讀取速度大約是 550MB/秒(是 4TB 驅動器速度的 4 倍),我至少希望大約 400MB/秒。相反,我看到大約 260MB/秒
**bonnie++**從剛才開始在游泳池上,同時收集以下資訊。和以前不太一樣,也沒什麼變化。
版本 1.97 ------順序輸出------ --順序輸入- --隨機- 並發 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- 機器大小 K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP 伊戈爾 63G 103 99 207518 43 108810 24 342 98 302350 26 256.4 18
zpool iostat在寫入期間。對我來說似乎還可以。
容量操作頻寬 pool alloc free 讀寫 讀寫 -------------------------------------------- ----- ----- ----- ----- ----- ----- 池2 1.23T 2.39T 0 1.89K 1.60K 238M 鏡子 631G 1.20T 0 979 1.60K 120M ata-WDC_WD20EFRX-68AX9N0_WD-WMC300004469 - - 0 1007 1.60K 124M ata-WDC_WD20EFRX-68EUZN0_WD-WCC4MLK57MVX - - 0 975 0 120M 鏡子 631G 1.20T 0 953 0 117M ata-WDC_WD20EFRX-68AX9N0_WD-WCC1T0429536 - - 0 1.01K 0 128M ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M0VYKFCE - - 0 953 0 117M
重寫期間的**zpool iostat 。**對我來說似乎沒問題,我想。
容量操作頻寬 pool alloc free 讀寫 讀寫 -------------------------------------------- ----- ----- ----- ----- ----- ----- 池2 1.27T 2.35T 1015 923 125M 101M 鏡子651G 1.18T 505 465 62.2M 51.8M ata-WDC_WD20EFRX-68AX9N0_WD-WMC300004469 - - 198 438 24.4M 51.7M ata-WDC_WD20EFRX-68EUZN0_WD-WCC4MLK57MVX - - 306 384 37.8M 45.1M 鏡子 651G 1.18T 510 457 63.2M 49.6M ata-WDC_WD20EFRX-68AX9N0_WD-WCC1T0429536 - - 304 371 37.8M 43.3M ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M0VYKFCE - - 206 423 25.5M 49.6M
這就是我想知道發生了什麼的地方
讀取期間的zpool iostat
容量操作頻寬 pool alloc free 讀寫 讀寫 -------------------------------------------- ----- ----- ----- ----- ----- ----- 池2 1.27T 2.35T 2.68K 32 339M 141K 鏡子 651G 1.18T 1.34K 20 169M 90.0K ata-WDC_WD20EFRX-68AX9N0_WD-WMC300004469 - - 748 9 92.5M 96.8K ata-WDC_WD20EFRX-68EUZN0_WD-WCC4MLK57MVX - - 623 10 76.8M 96.8K 鏡子 651G 1.18T 1.34K 11 170M 50.8K ata-WDC_WD20EFRX-68AX9N0_WD-WCC1T0429536 - - 774 5 95.7M 56.0K ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M0VYKFCE - - 599 6 74.0M 56.0K
iostat -x在同一讀取操作期間。請注意 IO % 不是 100%。
設備:rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sdb 0.60 0.00 661.30 6.00 83652.80 49.20 250.87 2.32 3.47 3.46 4.87 1.20 79.76 sdd 0.80 0.00 735.40 5.30 93273.20 49.20 251.98 2.60 3.51 3.51 4.15 1.20 89.04 自衛隊 0.50 0.00 656.70 3.80 83196.80 31.20 252.02 2.23 3.38 3.36 6.63 1.17 77.12 sda 0.70 0.00 738.30 3.30 93572.00 31.20 252.44 2.45 3.33 3.31 7.03 1.14 84.24
zpool 和測試數據集設置:
- atime 已關閉
- 壓縮已關閉
- ashift 為 0(自動檢測 - 我的理解是這沒問題)
- zdb 說磁碟都是 ashift=12
- 模組 - 選項 zfs zvol_threads=32 zfs_arc_max=17179869184
- 同步 = 標準
編輯 - 2015 年 10 月 30 日
我又做了一些測試
- 數據集 bonnie++ w/recordsize=1M = 226MB 寫入,392MB 讀取更好
- 數據集 dd w/record size=1M = 260MB 寫入,392MB 讀取更好
- zvol w/ext4 dd bs=1M = 128MB 寫入,107MB 讀取,為什麼這麼慢?
- 數據集 2 並行處理 = 227MB 寫入,396MB 讀取
- dd direct io 在數據集和 zvol 上沒有什麼不同
隨著記錄大小的增加,我對性能感到更加滿意。池中幾乎每個文件都超過 1MB。所以我就這樣離開它。磁碟仍然沒有得到 100% 的使用率,這讓我想知道它是否還能更快。現在我想知道為什麼 zvol 性能如此糟糕,因為這是我(輕輕地)使用的東西。
我很高興提供評論/答案中要求的任何資訊。在我的另一個問題中還發布了大量資訊:Slow copy between NFS/CIFS directory on the same server
我完全意識到我可能只是不明白某些事情,這可能根本不是問題。提前致謝。
為了清楚起見,問題是:為什麼 ZFS 池沒有我預期的那麼快?也許還有什麼問題嗎?
我設法使速度非常接近我的預期。
我正在尋找400MB/sec並管理392MB/sec。所以我說問題解決了。後來添加了一個記憶體設備,我管理了 458MB /秒的讀取(我相信記憶體)。
**1.**這最初是通過將 ZFS 數據集
recordsize
值增加到1M
zfs set recordsize=1M pool2/test
我相信這種變化只會導致更少的磁碟活動,從而更有效地進行大型同步讀取和寫入。正是我所要求的。
更改後的結果
- bonnie++ = 226MB 寫入,392MB 讀取
- dd = 260MB 寫入,392MB 讀取
- 2 個並行程序 = 227MB 寫入,396MB 讀取
**2.**添加記憶體設備(120GB SSD)後,我的管理更加出色。寫的有點慢,不知道為什麼。
Version 1.97 ------Sequential Output------ --Sequential Input- --Random- Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP igor 63G 208325 48 129343 28 458513 35 326.8 16
記憶體設備的技巧是
l2arc_noprefetch=0
在*/etc/modprobe.d/zfs.conf 中*設置。它允許 ZFS 記憶體流/順序數據。只有當你的記憶體設備比你的陣列快時才這樣做,比如我的。從我的數據集上的記錄大小更改中受益後,我認為這可能是處理較差 zvol 性能的類似方法。
我遇到過嚴格的人提到他們使用 a 獲得了良好的性能
volblocksize=64k
,所以我嘗試了一下。沒運氣。zfs create -b 64k -V 120G pool/volume
但後來我讀到 ext4(我正在測試的文件系統)支持 RAID 的選項,比如
stride
andstripe-width
,這是我以前從未使用過的。所以我使用這個站點來計算所需的設置:https : //busybox.net/~aldot/mkfs_stride.html 並再次格式化 zvol。mkfs.ext3 -b 4096 -E stride=16,stripe-width=32 /dev/zvol/pool/volume
我跑去
bonnie++
做了一個簡單的基準測試,結果非常好。不幸的是,我沒有結果,但我記得它們的寫入速度至少快了 5-6 倍。如果我再次進行基準測試,我將再次更新此答案。