MongoDB 和 ZFS 性能不佳:磁碟總是忙於讀取而只進行寫入
在 ZFSonlinux 上使用 MongoDB(我相信它是映射數據庫)時,我遇到了巨大的性能問題。
我們的 Mongodb 幾乎只有寫入。在沒有 ZFS 的副本上,當應用程序每 30 秒寫入一次數據庫時,磁碟完全忙於大約 5 秒的峰值,並且兩者之間沒有磁碟活動,因此我將其作為基線行為進行比較。
在具有 ZFS 的副本上,磁碟一直都很忙**,**副本掙扎著跟上 MongoDB 主數據庫的最新狀態。我在所有副本上都啟用了 lz4 壓縮,並且節省的空間很大,所以應該有更少的數據打到磁碟
所以在這些 ZFS 伺服器上,我首先設置了預設記錄大小 = 128k。然後我在重新同步 Mongo 數據之前擦除了數據並設置了 recordsize=8k。然後我再次擦拭並嘗試recordsize = 1k。我也試過沒有校驗和的recordsize=8k
儘管如此,它並沒有解決任何問題,磁碟始終保持 100% 忙碌。只有一次在記錄大小 = 8k 的伺服器上,磁碟比任何非 ZFS 副本都忙得多,但是在嘗試不同的設置並再次嘗試記錄大小 = 8k 後,磁碟為 100%,我看不到以前的良好行為,並且在任何其他副本上也看不到它。
此外,應該幾乎只有寫入,但看到在不同設置下的所有副本上,磁碟完全忙於 75% 的讀取和只有 25% 的寫入
(注意,我相信 MongoDB 是映射數據庫。有人告訴我在 AIO 模式下嘗試 MongoDB,但我沒有找到如何設置它,並且在另一台執行 MySQL InnoDB 的伺服器上我意識到 ZFSonLinux 無論如何都不支持 AIO。)
我的伺服器是 CentOS 6.5 核心 2.6.32-431.5.1.el6.x86_64。spl-0.6.2-1.el6.x86_64 zfs-0.6.2-1.el6.x86_64
#PROD 13:44:55 root@rum-mongo-backup-1:~: zfs list NAME USED AVAIL REFER MOUNTPOINT zfs 216G 1.56T 32K /zfs zfs/mongo_data-rum_a 49.5G 1.56T 49.5G /zfs/mongo_data-rum_a zfs/mongo_data-rum_old 166G 1.56T 166G /zfs/mongo_data-rum_old #PROD 13:45:20 root@rum-mongo-backup-1:~: zfs list -t snapshot no datasets available #PROD 13:45:29 root@rum-mongo-backup-1:~: zfs list -o atime,devices,compression,copies,dedup,mountpoint,recordsize,casesensitivity,xattr,checksum ATIME DEVICES COMPRESS COPIES DEDUP MOUNTPOINT RECSIZE CASE XATTR CHECKSUM off on lz4 1 off /zfs 128K sensitive sa off off on lz4 1 off /zfs/mongo_data-rum_a 8K sensitive sa off off on lz4 1 off /zfs/mongo_data-rum_old 8K sensitive sa off
那裡會發生什麼?我應該怎麼看才能弄清楚 ZFS 在做什麼或哪個設置設置不當?
EDIT1:
硬體:這些是租用的伺服器,Xeon 1230 或 1240 上的 8 個 vcore,16 或 32GB RAM,
zfs_arc_max=2147483648
使用 HP 硬體 RAID1。所以 ZFS zpool 在 /dev/sda2 上,並不知道有底層 RAID1。即使是 ZFS 的次優設置,我仍然不明白為什麼磁碟在讀取時阻塞,而 DB 只寫入。我理解很多原因,我們不需要在這裡再次公開,這很糟糕,……對於 ZFS,我很快就會有一個 JBOD/NORAID 伺服器,我可以用 ZFS 自己的 RAID1 進行相同的測試在 sda2 分區上實現,使用 /、/boot 和交換分區使用 mdadm 執行軟體 RAID1。
這可能聽起來有點瘋狂,但我支持另一個受益於 ZFS 捲管理屬性的應用程序,但在本機 ZFS 文件系統上表現不佳。
我的解決方案?!?
XFS 在ZFS zvols之上。
為什麼?!?
因為 XFS 性能良好並且消除了我在使用原生 ZFS 時遇到的特定於應用程序的問題。ZFS zvols 允許我精簡配置卷、添加壓縮、啟用快照並有效利用儲存池。對我的應用程序更重要的是,zvol 的 ARC 記憶體減少了磁碟上的 I/O 負載。
看看你是否可以按照這個輸出:
# zpool status pool: vol0 state: ONLINE scan: scrub repaired 0 in 0h3m with 0 errors on Sun Mar 2 12:09:15 2014 config: NAME STATE READ WRITE CKSUM vol0 ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 scsi-SATA_OWC_Mercury_AccOW140128AS1243223 ONLINE 0 0 0 scsi-SATA_OWC_Mercury_AccOW140128AS1243264 ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 scsi-SATA_OWC_Mercury_AccOW140128AS1243226 ONLINE 0 0 0 scsi-SATA_OWC_Mercury_AccOW140128AS1243185 ONLINE 0 0 0
ZFS zvol,通過以下方式創建:(
zfs create -o volblocksize=128K -s -V 800G vol0/pprovol
請注意,啟用了自動快照)# zfs get all vol0/pprovol NAME PROPERTY VALUE SOURCE vol0/pprovol type volume - vol0/pprovol creation Wed Feb 12 14:40 2014 - vol0/pprovol used 273G - vol0/pprovol available 155G - vol0/pprovol referenced 146G - vol0/pprovol compressratio 3.68x - vol0/pprovol reservation none default vol0/pprovol volsize 900G local vol0/pprovol volblocksize 128K - vol0/pprovol checksum on default vol0/pprovol compression lz4 inherited from vol0 vol0/pprovol readonly off default vol0/pprovol copies 1 default vol0/pprovol refreservation none default vol0/pprovol primarycache all default vol0/pprovol secondarycache all default vol0/pprovol usedbysnapshots 127G - vol0/pprovol usedbydataset 146G - vol0/pprovol usedbychildren 0 - vol0/pprovol usedbyrefreservation 0 - vol0/pprovol logbias latency default vol0/pprovol dedup off default vol0/pprovol mlslabel none default vol0/pprovol sync standard default vol0/pprovol refcompressratio 4.20x - vol0/pprovol written 219M - vol0/pprovol snapdev hidden default vol0/pprovol com.sun:auto-snapshot true local
ZFS zvol 塊設備的屬性。900GB 卷(磁碟上的實際大小為 143GB):
# fdisk -l /dev/zd0 Disk /dev/zd0: 966.4 GB, 966367641600 bytes 3 heads, 18 sectors/track, 34952533 cylinders Units = cylinders of 54 * 512 = 27648 bytes Sector size (logical/physical): 512 bytes / 131072 bytes I/O size (minimum/optimal): 131072 bytes / 131072 bytes Disk identifier: 0x48811e83 Device Boot Start End Blocks Id System /dev/zd0p1 38 34952534 943717376 83 Linux
ZFS 塊設備上的 XFS 資訊:
# xfs_info /dev/zd0p1 meta-data=/dev/zd0p1 isize=256 agcount=32, agsize=7372768 blks = sectsz=4096 attr=2, projid32bit=0 data = bsize=4096 blocks=235928576, imaxpct=25 = sunit=32 swidth=32 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=65536, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
XFS 掛載選項:
# mount /dev/zd0p1 on /ppro type xfs (rw,noatime,logbufs=8,logbsize=256k,nobarrier)
注意:在某些情況下,我也在 HP Smart Array 硬體 RAID 之上執行此操作。
池創建如下所示:
zpool create -o ashift=12 -f vol1 wwn-0x600508b1001ce908732af63b45a75a6b
結果看起來像:
# zpool status -v pool: vol1 state: ONLINE scan: scrub repaired 0 in 0h14m with 0 errors on Wed Feb 26 05:53:51 2014 config: NAME STATE READ WRITE CKSUM vol1 ONLINE 0 0 0 wwn-0x600508b1001ce908732af63b45a75a6b ONLINE 0 0 0