web-dev-qa-db-ja.com

ZFSはFreeBSDで信じられないほど遅い読み取りをします

InoDBデータベースファイルをZFSに保存してMySQLを実行しているFreeBSD10.0システムがあります。何ヶ月も順調に進んでいるように見えましたが、最近、そして一見突然、パフォーマンスが底を打ちました。 MySQLを取り巻くデバッグをしばらく行った後、ファイルシステムからデータベースファイルを読み取るだけの速度が遅いかどうかを確認することにしました。

データベースファイルが約16GBのテーブルを1つ選び、次のコマンドを実行しました。

time cat table.ibd > /dev/null

そして得た:

cat table.ibd > /dev/null 1.24s user 64.35s system 0% cpu 1:00:34.65 total

比較すると、同じシステム上のUFSにあるファイルのコピー(いくつかの変更を加えて、データベースはライブであると確信しています)は、次のようになります。

cat table.ibd > /dev/null 0.20s user 9.34s system 5% cpu 9.550 total

このシステムのデフォルト以外のZFSオプションは次のとおりです。

/boot/loader.conf:
  vfs.zfs.arc_max=17179869184

-

/etc/sysctl.conf:
  vfs.zfs.prefetch_disable=1

-

zfs get:
  recordsize 16K
  compression on
  atime off
  primarycache metadata
  zfs:zfs_nocacheflush 1

現在、このファイルシステムには12個のスナップショットがあります。 (これは過剰に思えます。削除できるものがあるかどうかを確認します。)

このプール(またはシステム上の他のプール)にはL2ARCはありません。

Primarycacheの3つの値すべてを試し、プリフェッチを再度有効にしてみましたが、いずれも大きな影響はなかったようです。

Zpoolは4つの2ディスクミラーです。

% zpool status mysqlrot
  pool: mysqlrot
state: ONLINE
  scan: scrub repaired 0 in 9h45m with 0 errors on Fri Jun 26 12:46:33 2015
config:

    NAME        STATE     READ WRITE CKSUM
    mysqlrot    ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        mfid9   ONLINE       0     0     0
        mfid10  ONLINE       0     0     0
      mirror-1  ONLINE       0     0     0
        mfid11  ONLINE       0     0     0
        mfid12  ONLINE       0     0     0
      mirror-2  ONLINE       0     0     0
        mfid13  ONLINE       0     0     0
        mfid14  ONLINE       0     0     0
      mirror-3  ONLINE       0     0     0
        mfid15  ONLINE       0     0     0
        mfid16  ONLINE       0     0     0
    spares
      mfid19    AVAIL

errors: No known data errors

奇妙な点の1つは、rawデバイスのセットアップ方法です。ストレージコントローラーはMFIコントローラーであり、各rawディスクは実際にはMFIコントローラーで1ディスクRAID0ボリュームとして構成されます。

% Sudo mfiutil show volumes
mfi0 Volumes:
  Id     Size    Level   Stripe  State   Cache   Name
 mfid0 (  185G) RAID-1      64K OPTIMAL Disabled <OS>
 mfid1 (  558G) RAID-0      64K OPTIMAL Disabled <DB0A>
 mfid2 (  558G) RAID-0      64K OPTIMAL Disabled <DB0B>
 mfid3 (  558G) RAID-0      64K OPTIMAL Disabled <DB1A>
 mfid4 (  558G) RAID-0      64K OPTIMAL Disabled <DB1B>
 mfid5 (  558G) RAID-0      64K OPTIMAL Disabled <DB2A>
 mfid6 (  558G) RAID-0      64K OPTIMAL Disabled <DB2B>
 mfid7 (  558G) RAID-0      64K OPTIMAL Disabled <DB3A>
 mfid8 (  558G) RAID-0      64K OPTIMAL Disabled <DB3B>
 mfid9 (  558G) RAID-0      64K OPTIMAL Disabled <DB4A>
mfid10 (  558G) RAID-0      64K OPTIMAL Disabled <DB4B>
mfid11 (  558G) RAID-0      64K OPTIMAL Disabled <DB5A>
mfid12 (  558G) RAID-0      64K OPTIMAL Disabled <DB5B>
mfid13 (  558G) RAID-0      64K OPTIMAL Disabled <DB6A>
mfid14 (  558G) RAID-0      64K OPTIMAL Disabled <DB6B>
mfid15 (  558G) RAID-0      64K OPTIMAL Disabled <DB7A>
mfid16 (  558G) RAID-0      64K OPTIMAL Disabled <DB7B>
mfid17 (  558G) RAID-0      64K OPTIMAL Disabled <DB8A>
mfid18 (  558G) RAID-0      64K OPTIMAL Disabled <DB8B>
mfid19 (  558G) RAID-0      64K OPTIMAL Disabled <SPARE0>

ログファイルやユーティリティで見つけたエラーはありません。

どこを見ればいいのか、誰かアイデアがありますか?


さまざまなデータ:

% zpool list mysqlrot
NAME       SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
mysqlrot  2.17T  1.49T   701G    68%  1.00x  ONLINE  -

15.3GBファイルのコピーto影響を受けるファイルシステム(UFSファイルシステムから):

% time Sudo cp test.file /var/lib/mysql/mysqlrot/test.file
Sudo cp test.file /var/lib/mysql/mysqlrot/test.file  0.02s user 44.23s system 1% cpu 1:06.93 total

(66.93秒です。)

同じファイルを読み取るfrom影響を受けるファイルシステム:

# time cat test.file > /dev/null
cat test.file > /dev/null  4.23s user 268.50s system 0% cpu 25:29.27 total

(これは1529.27秒です。書き込みの約23倍です。)

興味深いことに、cpcatよりもfarパフォーマンスが優れています。

% time Sudo cp /var/lib/mysql/v4netrot/test.file /dev/null
Sudo cp /var/lib/mysql/v4netrot/test.file /dev/null  0.03s user 33.63s system 0% cpu 3:05.99 total

(185.99秒)


コピー中のiostatデータto

                        extended device statistics
device     r/s    w/s    kr/s    kw/s qlen svc_t  %b
mfid0      0.0    0.6     0.0     8.8    0   0.6   0
mfid1      0.4   12.6     2.7    70.5    0   0.5   0
mfid2      1.8   12.8    10.8    70.5    0   1.6   2
mfid3      0.2   10.0     1.5    92.4    0   0.7   0
mfid4      0.0   10.4     0.0    92.4    0   0.5   0
mfid5      0.2    9.4     1.2    39.7    0   0.5   0
mfid6      0.6    9.8     3.9    39.7    0   0.6   0
mfid7      0.6    4.8     0.3    46.1    0   0.9   0
mfid8      1.8    4.8    11.4    46.1    0   0.8   0
mfid9      0.4 1327.2     2.9 26686.5    0   0.5  23
mfid10     0.8 1328.2     1.8 26686.5    0   0.5  20
mfid11     1.4 1304.8     8.4 26357.6    0   0.5  23
mfid12     1.4 1304.6     2.6 26357.6    0   0.6  31
mfid13     1.6 1120.6     3.5 26194.2    0   0.6  25
mfid14     0.4 1122.6     2.7 26194.2    0   0.5  22
mfid15     0.8 1406.6     5.5 26188.5    0   0.5  22
mfid16     1.0 1174.6     2.0 21534.3   10   4.9  74
mfid17     5.8   24.2   152.9   300.6    0   0.3   0
mfid18     4.0   23.6    76.7   300.6    0   0.3   0
mfid19     0.0    0.0     0.0     0.0    0   0.0   0

Kw/sデータは約17kから約25kの範囲であり、ドライブ間でかなり一貫していました。

iostat when catting from

                        extended device statistics
device      r/s   w/s    kr/s    kw/s qlen svc_t  %b
mfid0       0.0   0.0     0.0     0.0    0   0.0   0
mfid1       0.4  17.2    11.4    63.4    0   0.5   0
mfid2       0.0  17.0     0.0    63.4    0   0.4   0
mfid3       0.0  14.0     0.0    56.4    0   0.4   0
mfid4       0.4  13.6     0.2    56.4    0   0.4   0
mfid5       0.8   9.6     4.8    37.3    0   0.8   0
mfid6       0.0   9.8     0.0    37.3    0   0.4   0
mfid7       0.2   3.8    17.2    11.9    0   0.6   0
mfid8       0.2   3.8     1.4    11.9    0   0.5   0
mfid9    1208.8   0.0  6831.4     0.0    0   0.1  11
mfid10    129.4   0.0   780.7     0.0    0   0.2   2
mfid11    906.4   0.0  5858.5     0.0    0   0.1  10
mfid12    600.5   0.0  2673.0     0.0    0   0.1   5
mfid13    136.2   0.0   803.9     0.0    0   0.2   3
mfid14    316.1   0.0  1895.3     0.0    0   0.1   4
mfid15    243.6   0.0  1414.5     0.0    0   0.1   2
mfid16    129.0   0.0   768.8     0.0    0   0.2   2
mfid17      3.8  25.8    29.8   274.1    0   0.2   0
mfid18      6.0  25.6    96.6   274.1    0   0.2   0
mfid19      0.0   0.0     0.0     0.0    0   0.0   0

kr/sの数値は非常に一貫性がありませんでしたが、これらは代表的な数値です。

iostat while cping from(to/dev/null):

                        extended device statistics
device     r/s   w/s    kr/s    kw/s qlen svc_t  %b
mfid0      0.0   0.0     0.0     0.0    0   0.0   0
mfid1     21.0  66.6   107.6  2351.7    0   0.9   6
mfid2     17.6  66.8   106.8  2351.7    0   1.0   6
mfid3     17.6  39.0   116.9  2111.3    0   1.1   6
mfid4     18.8  39.6    99.8  2111.3    0   1.3   7
mfid5     23.2  62.4   172.2  2076.1    0   1.1   7
mfid6     23.0  62.0   130.0  2076.1    0   1.4   9
mfid7     16.2  62.6   112.6  2125.3    0   1.0   6
mfid8     17.4  63.0   107.6  2125.3    0   0.7   4
mfid9    237.5  44.6  5140.6   807.0    0   3.1  22
mfid10   263.7  43.6  5530.5   807.0    0   1.5  14
mfid11   252.7  55.8  5297.6   802.4    0   2.6  20
mfid12   298.1  55.6  5361.9   802.4    0   2.5  21
mfid13   275.3  46.2  5116.4   801.4    0   2.8  22
mfid14   252.9  42.4  5107.7   801.4    2   3.1  21
mfid15   270.9  43.8  4546.5   943.7    0   1.2  12
mfid16   257.7  44.0  5642.5   943.7    0   2.5  19
mfid17     7.8  23.0    73.1   244.9    0   0.3   0
mfid18     0.8  24.2    44.4   244.9    0   0.2   0
mfid19     0.0   0.0     0.0     0.0    0   0.0   0

CPUバウンドではないようです。 topは、影響を受けるファイルシステムから/dev/nullへのcpが1つのコア(48のうち)の約18%を消費し、残りのコアが95%以上のアイドル状態を示していることを示しています。

last pid: 12474;  load averages:  1.65,  1.26,  1.14                                                                                                                                        up 39+05:42:19  14:29:08
147 processes: 1 running, 146 sleeping
CPU 0:   0.0% user,  0.0% Nice,  1.6% system,  0.0% interrupt, 98.4% idle
CPU 1:   0.0% user,  0.0% Nice,  1.2% system,  0.0% interrupt, 98.8% idle
CPU 2:   0.4% user,  0.0% Nice,  0.8% system,  0.0% interrupt, 98.8% idle
CPU 3:   0.0% user,  0.0% Nice,  1.2% system,  0.0% interrupt, 98.8% idle
CPU 4:   0.0% user,  0.0% Nice,  2.3% system,  0.0% interrupt, 97.7% idle
CPU 5:   0.0% user,  0.0% Nice,  0.4% system,  0.0% interrupt, 99.6% idle
CPU 6:   0.0% user,  0.0% Nice,  1.2% system,  0.0% interrupt, 98.8% idle
CPU 7:   0.0% user,  0.0% Nice,  2.7% system,  0.0% interrupt, 97.3% idle
CPU 8:   0.4% user,  0.0% Nice,  1.9% system,  0.0% interrupt, 97.7% idle
CPU 9:   0.0% user,  0.0% Nice,  2.3% system,  0.0% interrupt, 97.7% idle
CPU 10:  0.4% user,  0.0% Nice,  1.9% system,  1.2% interrupt, 96.5% idle
CPU 11:  0.0% user,  0.0% Nice,  3.9% system,  0.0% interrupt, 96.1% idle
CPU 12:  0.0% user,  0.0% Nice,  1.6% system,  0.8% interrupt, 97.7% idle
CPU 13:  0.0% user,  0.0% Nice,  2.7% system,  0.0% interrupt, 97.3% idle
CPU 14:  0.0% user,  0.0% Nice,  1.6% system,  0.0% interrupt, 98.4% idle
CPU 15:  0.4% user,  0.0% Nice,  1.2% system,  0.0% interrupt, 98.4% idle
CPU 16:  0.0% user,  0.0% Nice,  1.6% system,  0.0% interrupt, 98.4% idle
CPU 17:  0.4% user,  0.0% Nice,  3.1% system,  0.0% interrupt, 96.5% idle
CPU 18:  0.0% user,  0.0% Nice,  0.4% system,  0.0% interrupt, 99.6% idle
CPU 19:  0.8% user,  0.0% Nice,  0.8% system,  0.0% interrupt, 98.4% idle
CPU 20:  0.0% user,  0.0% Nice,  2.7% system,  0.0% interrupt, 97.3% idle
CPU 21:  0.4% user,  0.0% Nice,  1.9% system,  0.0% interrupt, 97.7% idle
CPU 22:  0.0% user,  0.0% Nice,  2.3% system,  0.0% interrupt, 97.7% idle
CPU 23:  0.4% user,  0.0% Nice,  1.2% system,  0.0% interrupt, 98.4% idle
CPU 24:  0.0% user,  0.0% Nice,  1.2% system,  0.0% interrupt, 98.8% idle
CPU 25:  0.8% user,  0.0% Nice,  0.8% system,  0.0% interrupt, 98.4% idle
CPU 26:  0.4% user,  0.0% Nice,  0.8% system,  0.0% interrupt, 98.8% idle
CPU 27:  0.0% user,  0.0% Nice,  4.7% system,  0.0% interrupt, 95.3% idle
CPU 28:  0.0% user,  0.0% Nice,  0.8% system,  0.0% interrupt, 99.2% idle
CPU 29:  0.4% user,  0.0% Nice,  0.8% system,  0.0% interrupt, 98.8% idle
CPU 30:  0.0% user,  0.0% Nice,  2.7% system,  0.0% interrupt, 97.3% idle
CPU 31:  0.0% user,  0.0% Nice,  1.2% system,  0.0% interrupt, 98.8% idle
CPU 32:  0.0% user,  0.0% Nice,  0.8% system,  0.0% interrupt, 99.2% idle
CPU 33:  0.0% user,  0.0% Nice,  3.5% system,  0.0% interrupt, 96.5% idle
CPU 34:  0.0% user,  0.0% Nice,  0.4% system,  0.0% interrupt, 99.6% idle
CPU 35:  0.0% user,  0.0% Nice,  0.4% system,  0.0% interrupt, 99.6% idle
CPU 36:  1.2% user,  0.0% Nice,  1.6% system,  0.0% interrupt, 97.3% idle
CPU 37:  0.0% user,  0.0% Nice,  0.0% system,  0.0% interrupt,  100% idle
CPU 38:  0.4% user,  0.0% Nice,  1.2% system,  0.4% interrupt, 98.1% idle
CPU 39:  0.0% user,  0.0% Nice,  0.0% system,  0.0% interrupt,  100% idle
CPU 40:  0.0% user,  0.0% Nice,  1.9% system,  0.0% interrupt, 98.1% idle
CPU 41:  0.0% user,  0.0% Nice,  1.2% system,  0.0% interrupt, 98.8% idle
CPU 42:  0.4% user,  0.0% Nice,  1.9% system,  0.0% interrupt, 97.7% idle
CPU 43:  0.0% user,  0.0% Nice,  4.7% system,  0.0% interrupt, 95.3% idle
CPU 44:  0.0% user,  0.0% Nice,  2.3% system,  0.0% interrupt, 97.7% idle
CPU 45:  0.4% user,  0.0% Nice,  2.7% system,  0.0% interrupt, 96.9% idle
CPU 46:  0.4% user,  0.0% Nice,  3.5% system,  0.0% interrupt, 96.1% idle
CPU 47:  0.4% user,  0.0% Nice,  1.6% system,  0.0% interrupt, 98.1% idle
Mem: 82G Active, 23G Inact, 15G Wired, 3340K Cache, 1655M Buf, 4858M Free
ARC: 12G Total, 527M MFU, 11G MRU, 4375K Anon, 377M Header, 89M Other
Swap: 4096M Total, 12M Used, 4084M Free

  PID USERNAME     PRI Nice   SIZE    RES STATE   C   TIME    WCPU COMMAND
12461 root          31    0 12268K  2552K zio->i 30   0:07  18.16% cp
 3151 mysql         24    0 92309M 92073M uwait   3  22:06   7.47% mysqld{mysqld}
 3151 mysql         22    0 92309M 92073M select 33  15:30   4.79% mysqld{mysqld}
 3151 mysql         20    0 92309M 92073M uwait  46 895:41   0.49% mysqld{mysqld}
12175 wfaulk        20    0 23864K  6404K CPU25  25   0:03   0.29% top
 6074 root          20    0 84348K 40372K kqread 25   0:11   0.20% vc-aggregator{vc-aggregator}

(残りのプロセスは0.00%のCPU使用率を示しています。)

2
wfaulk

MFIコントローラーは昨日完全に故障しました。この遅さは、差し迫ったハードウェア障害の初期症状にすぎなかったと思います。

1
wfaulk

マシンを再起動しようとしましたか?違いはありましたか?

再起動しても問題が解決しない場合は、過度の断片化の問題が発生している可能性があります。これは、メディアの回転の最大の敵です(読み取り:HDD)。スナップショットの数が多いと、この状況が悪化する可能性があります。

問題を確認するには、次のことを試してください。

  1. コマンドfallocate testfile.raw -l <size>を使用して、同じサイズの新しいファイルを作成します
  2. 新しく割り当てられたファイルを読み取ってみてください。読み取りが速い場合は、古いファイルの断片化が原因である可能性があります。

これがフラグの問題であることを確認した場合は、次の手順に従ってください。

  1. mySQLを停止します
  2. table.ibdファイルのバックアップを取る
  3. 名前をtable.ibd.oldに変更します(mv table.ibd table.ibd.old
  4. 前のファイル名にコピーします(cp -a table.ibd.old table.ibd
  5. mySQLを再起動します

[〜#〜] edit [〜#〜] iostatの更新後

Iostat番号をありがとうございます。

約67秒で15GBのファイルをZFSアレイに移動しました。これは、ディスクあたり223 MB/sまたは55MB/sの取り込み速度を意味します(ミラーリングされたものを除く)。一方、あなたのiostatはそれについて報告しているようです(約25 MB/s)ので、私はその不一致を約2:1の圧縮率に起因すると考えています。

OK、これは良いです。しかし、読んでいる間に奇妙なことが起こります...

catの結果を破棄する(catはデフォルトで非常に小さなバッファーを使用し、プリフェッチャーを無効にすると、cpよりもはるかに遅くなります)、cpコマンド速度を落とす方法です。約1530秒で15GBのファイルをコピーしました。これは、抽出速度がわずか10MB /秒であることを意味します。そして、それはすでに圧縮の利点を考慮に入れています。一方、iostatの数値は、ディスクあたり5 MB/sを超える読み取りを示しており、アレイあたり合計で約40 MB/sになります。 2:1の圧縮率を考慮に入れると、80 MB/sを超える転送速度が得られるはずです。これは、読み取りの可能性が約1/8であることを意味します。

問題は、なぜですか?転送中にCPUが限界に達したようです。影響を受けるファイルの読み取り中にtopおよびdstatセッションを実行できますか?可能であれば、CPUごとの負荷を表示するようにtopを構成します。

1
shodanshok