Zfs

MongoDB 和 ZFS 性能不佳:磁碟總是忙於讀取而只進行寫入

  • July 5, 2020

在 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

引用自:https://serverfault.com/questions/583688