|
問題
我最近安裝了一個(gè)新磁盤并在其上創(chuàng)建了一個(gè)zpool: /# zpool create morez /dev/sdb
使用它一段時(shí)間后,我注意到它很慢: /morez# fio --name rw --rw rw --size 10G read: IOPS=19.6k, BW=76.6MiB/s (80.3MB/s)(5120MiB/66834msec) write: IOPS=19.6k, BW=76.6MiB/s (80.3MB/s)(5120MiB/66834msec) 此測(cè)試與我的實(shí)際用例非常相似.我正在從磁盤讀取中等數(shù)量(~10k)的圖像(每個(gè)~2 MiB).當(dāng)磁盤大部分為空時(shí),它們都被立即寫入,因此我不認(rèn)為它們會(huì)被分割. 為了比較,我測(cè)試了ext4: /# gdisk /dev/sdb ... /# mkfs.ext4 -f /dev/sdb1 && mount /dev/sdb1 /mnt && cd /mnt /mnt# fio --name rw --rw rw --size 10G read: IOPS=48.3k, BW=189MiB/s (198MB/s)(5120MiB/27135msec) write: IOPS=48.3k, BW=189MiB/s (198MB/s)(5120MiB/27135msec) 和btrfs: /# mkfs.btrfs -f /dev/sdb1 && mount /dev/sdb1 /mnt && cd /mnt /mnt# fio --name rw --rw rw --size 10G read: IOPS=51.3k, BW=201MiB/s (210MB/s)(5120MiB/25528msec) write: IOPS=51.3k, BW=201MiB/s (210MB/s)(5120MiB/25528msec) 可能導(dǎo)致ZFS性能問題的原因是什么?如何讓它更快? 嘗試解決方案失敗 我還嘗試顯式設(shè)置zpool的扇區(qū)大小,因?yàn)槲业拇疟P(Seagate ST1000DM003)使用4096字節(jié)的物理扇區(qū): /# zpool create -o ashift=12 morez /dev/sdb
這沒有改善性能: /morez# fio --name rw --rw rw --size 10G read: IOPS=21.3k, BW=83.2MiB/s (87.2MB/s)(5120MiB/61573msec) write: IOPS=21.3k, BW=83.2MiB/s (87.2MB/s)(5120MiB/61573msec) 意見 奇怪的是,使用zvol有很好的表現(xiàn): /# zfs create -V 20G morez/vol /# fio --name rw --filename /dev/zvol/morez/vol --rw rw --size 10G read: IOPS=52.7k, BW=206MiB/s (216MB/s)(5120MiB/24852msec) write: IOPS=52.7k, BW=206MiB/s (216MB/s)(5120MiB/24852msec) 為什么這只影響ZFS文件系統(tǒng)而不影響zvols? btrfs的擴(kuò)展測(cè)試 在評(píng)論中,有人認(rèn)為差異可能是由于緩存造成的.經(jīng)過進(jìn)一步測(cè)試,我不相信是這種情況.我將btrfs測(cè)試的大小增加到遠(yuǎn)高于我的計(jì)算機(jī)的內(nèi)存量,其性能仍遠(yuǎn)遠(yuǎn)高于ZFS: /# mkfs.btrfs -f /dev/sdb1 && mount /dev/sdb1 /mnt && cd /mnt /mnt# $fio --name rw --rw rw --size 500G --runtime 3600 --time_based --ramp_time 900 read: IOPS=41.9k, BW=164MiB/s (172MB/s)(576GiB/3600003msec) write: IOPS=41.9k, BW=164MiB/s (172MB/s)(576GiB/3600003msec) 系統(tǒng)信息 軟件 > Arch Linux,內(nèi)核版本4.11.6 硬件 >正在測(cè)試的驅(qū)動(dòng)器:Seagate ST1000DM003,連接到6Gb / s SATA端口 ZFS信息 以下是運(yùn)行fio之前ZFS屬性的樣子.這些只是使用默認(rèn)設(shè)置創(chuàng)建zpool的結(jié)果. # zpool get all morez NAME PROPERTY VALUE SOURCE morez size 928G - morez capacity 0% - morez altroot - default morez health ONLINE - morez guid [removed] default morez version - default morez bootfs - default morez delegation on default morez autoreplace off default morez cachefile - default morez failmode wait default morez listsnapshots off default morez autoexpand off default morez dedupditto 0 default morez dedupratio 1.00x - morez free 928G - morez allocated 276K - morez readonly off - morez ashift 0 default morez comment - default morez expandsize - - morez freeing 0 default morez fragmentation 0% - morez leaked 0 default morez feature@async_destroy enabled local morez feature@empty_bpobj enabled local morez feature@lz4_compress active local morez feature@spacemap_histogram active local morez feature@enabled_txg active local morez feature@hole_birth active local morez feature@extensible_dataset enabled local morez feature@embedded_data active local morez feature@bookmarks enabled local morez feature@filesystem_limits enabled local morez feature@large_blocks enabled local # zfs get all morez NAME PROPERTY VALUE SOURCE morez type filesystem - morez creation Thu Jun 29 19:34 2017 - morez used 240K - morez available 899G - morez referenced 96K - morez compressratio 1.00x - morez mounted yes - morez quota none default morez reservation none default morez recordsize 128K default morez mountpoint /morez default morez sharenfs off default morez checksum on default morez compression off default morez atime on default morez devices on default morez exec on default morez setuid on default morez readonly off default morez zoned off default morez snapdir hidden default morez aclinherit restricted default morez canmount on default morez xattr on default morez copies 1 default morez version 5 - morez utf8only off - morez normalization none - morez casesensitivity sensitive - morez vscan off default morez nbmand off default morez sharesmb off default morez refquota none default morez refreservation none default morez primarycache all default morez secondarycache all default morez usedbysnapshots 0 - morez usedbydataset 96K - morez usedbychildren 144K - morez usedbyrefreservation 0 - morez logbias latency default morez dedup off default morez mlslabel none default morez sync standard default morez refcompressratio 1.00x - morez written 96K - morez logicalused 72.5K - morez logicalreferenced 40K - morez filesystem_limit none default morez snapshot_limit none default morez filesystem_count none default morez snapshot_count none default morez snapdev hidden default morez acltype off default morez context none default morez fscontext none default morez defcontext none default morez rootcontext none default morez relatime off default morez redundant_metadata all default morez overlay off default |
|
|