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倍です。)
興味深いことに、cp
はcat
よりも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 cat
ting 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 cp
ing 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使用率を示しています。)
MFIコントローラーは昨日完全に故障しました。この遅さは、差し迫ったハードウェア障害の初期症状にすぎなかったと思います。
マシンを再起動しようとしましたか?違いはありましたか?
再起動しても問題が解決しない場合は、過度の断片化の問題が発生している可能性があります。これは、メディアの回転の最大の敵です(読み取り:HDD)。スナップショットの数が多いと、この状況が悪化する可能性があります。
問題を確認するには、次のことを試してください。
fallocate testfile.raw -l <size>
を使用して、同じサイズの新しいファイルを作成しますこれがフラグの問題であることを確認した場合は、次の手順に従ってください。
mv table.ibd table.ibd.old
)cp -a table.ibd.old table.ibd
)[〜#〜] 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
を構成します。