2011年にZFSを使い始めてから早4年、小規模なファイルサーバ運用ではまず困る事がないくらいにはZFSの扱いには慣れたが、未だ解決できていない問題が1つある。 システムが応答しなくなるほど、ZFSへのアクセスが遅くなる現象である。
ハッキリとした発生条件は未だ掴めていないが、概ね以下の条件を満たすと発生する。
問題の状態になると、ターミナルで入力が困難になるほどシステムの応答性が低下する。記憶があいまいだが、ロードアベレージ的には特に問題ない値だったハズ。
尚、プールの種類に関係なく発生するっぽい……といっても、ミラーとRAID-ZとRAID-Z+0でしか使った事はないが、何れでも発生している。途中マシン&HDDが変わったり、OSもFreeBSD 8.2→9.0→9.2と更新してるので、特定のハード&ソフトが関係する問題でもないと思われる。まぁ、FreeBSDのZFS実装がタコい可能性もないとは言い切れないが、本家以外のZFSでは老舗の部類に入る実装で、流石にそれはないだろう。
何となくだけど、断片化の線が怪しいんじゃないかなと。というのも、先だって遭遇したプールでは800GB中360GBが未使用だったから空き容量が原因とは考えにくい。ただし、以前、空き容量が100GBを割った事があり、FSの状態としてはそこそこ劣化していると考えられる。また、激遅ゾーン?を抜けるとまた普通の速度に戻るので、書き込もうとしてる領域の状態が悪いとダメっぽい気がする。
で、先日、ようやっと原因究明の糸口になりそうなデータが取れた。
この症状が発生している時は、書き込みしているにもかかわらず、なぜか物凄い読み込みが発生している。以下、zpool iostatのログ。
capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 501 48 62.6M 210K mirror 491G 357G 501 48 62.6M 210K ada3p4 - - 238 10 29.7M 210K ada1p4 - - 263 7 32.9M 166K ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 451 25 56.4M 111K mirror 491G 357G 451 25 56.4M 111K ada3p4 - - 237 4 29.7M 111K ada1p4 - - 213 0 26.7M 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 289 0 36.0M 0 mirror 491G 357G 289 0 36.0M 0 ada3p4 - - 133 0 16.6M 0 ada1p4 - - 155 13 19.4M 154K ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 273 0 33.9M 0 mirror 491G 357G 273 0 33.9M 0 ada3p4 - - 135 0 17.0M 0 ada1p4 - - 137 0 16.9M 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 375 48 45.7M 313K mirror 491G 357G 375 48 45.7M 313K ada3p4 - - 185 18 22.5M 313K ada1p4 - - 189 13 23.2M 475K ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 321 0 39.8M 0 mirror 491G 357G 321 0 39.8M 0 ada3p4 - - 160 0 19.8M 0 ada1p4 - - 161 0 19.9M 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 423 25 53.0M 317K mirror 491G 357G 423 25 53.0M 317K ada3p4 - - 205 8 25.7M 317K ada1p4 - - 217 4 27.2M 158K ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 432 12 53.9M 158K mirror 491G 357G 432 12 53.9M 158K ada3p4 - - 223 4 28.0M 158K ada1p4 - - 208 8 25.9M 317K ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 204 0 25.0M 0 mirror 491G 357G 204 0 25.0M 0 ada3p4 - - 103 0 12.8M 0 ada1p4 - - 100 0 12.3M 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 370 25 45.7M 317K mirror 491G 357G 370 25 45.7M 317K ada3p4 - - 176 12 21.7M 333K ada1p4 - - 194 10 24.0M 321K ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 380 46 47.2M 305K mirror 491G 357G 380 46 47.2M 305K ada3p4 - - 209 6 25.9M 305K ada1p4 - - 170 63 21.3M 7.07M ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 199 119 24.4M 7.07M mirror 491G 357G 199 119 24.4M 7.07M ada3p4 - - 96 63 11.7M 7.07M ada1p4 - - 102 1 12.8M 23.8K ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 334 0 40.9M 0 mirror 491G 357G 334 0 40.9M 0 ada3p4 - - 148 0 18.1M 0 ada1p4 - - 186 0 22.8M 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 401 9 49.7M 39.6K mirror 491G 357G 401 9 49.7M 39.6K ada3p4 - - 190 2 23.3M 39.6K ada1p4 - - 211 2 26.4M 47.5K ---------- ----- ----- ----- ----- ----- -----
正常な時はこんな感じ。
capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 0 402 0 32.3M mirror 491G 357G 0 402 0 32.3M ada3p4 - - 0 324 0 32.3M ada1p4 - - 0 323 0 32.3M ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 0 0 0 0 mirror 491G 357G 0 0 0 0 ada3p4 - - 0 0 0 0 ada1p4 - - 0 0 0 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 0 195 0 24.3M mirror 491G 357G 0 195 0 24.3M ada3p4 - - 0 195 0 24.3M ada1p4 - - 0 195 0 24.3M ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 0 212 0 8.56M mirror 491G 357G 0 212 0 8.56M ada3p4 - - 0 116 0 8.57M ada1p4 - - 0 120 0 8.57M ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 0 0 0 0 mirror 491G 357G 0 0 0 0 ada3p4 - - 0 0 0 0 ada1p4 - - 0 0 0 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 0 0 0 0 mirror 491G 357G 0 0 0 0 ada3p4 - - 0 0 0 0 ada1p4 - - 0 0 0 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 0 402 0 32.3M mirror 491G 357G 0 402 0 32.3M ada3p4 - - 0 317 0 32.3M ada1p4 - - 0 318 0 32.3M ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 0 0 0 0 mirror 491G 357G 0 0 0 0 ada3p4 - - 0 0 0 0 ada1p4 - - 0 0 0 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 0 0 0 0 mirror 491G 357G 0 0 0 0 ada3p4 - - 0 0 0 0 ada1p4 - - 0 0 0 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 0 405 0 32.3M mirror 491G 357G 0 405 0 32.3M ada3p4 - - 0 323 0 32.3M ada1p4 - - 0 323 0 32.3M ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 0 0 0 0 mirror 491G 357G 0 0 0 0 ada3p4 - - 0 0 0 0 ada1p4 - - 0 0 0 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 0 0 0 0 mirror 491G 357G 0 0 0 0 ada3p4 - - 0 0 0 0 ada1p4 - - 0 0 0 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 0 402 0 32.3M mirror 491G 357G 0 402 0 32.3M ada3p4 - - 0 320 0 32.3M ada1p4 - - 0 322 0 32.3M ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 111 128 13.9M 16.0M mirror 491G 357G 111 128 13.9M 16.0M ada3p4 - - 50 128 6.31M 16.0M ada1p4 - - 61 128 7.56M 16.0M ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 0 0 0 0 mirror 491G 357G 0 0 0 0 ada3p4 - - 0 0 0 0 ada1p4 - - 0 0 0 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 491G 357G 0 385 0 17.1M mirror 491G 357G 0 385 0 17.1M ada3p4 - - 0 203 0 17.1M ada1p4 - - 0 203 0 17.1M ---------- ----- ----- ----- ----- ----- -----
どちらもdd if=/dev/zero of=~/tempした時のiostatだが、問題の方は何故かフルスピードで読み込みが走っている。コマンドを間違えたなんて事は勿論、同時並行で別の読み込みプロセスが走ってるという事もない。読み込んだデータはどこに行っているのか……。
ちなみに、ddしつつ読み込みを行い正常な時はこんな感じ。読み込みと書き込みが仲良く同居してる感じですな。
capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 474G 374G 346 41 43.3M 2.19M mirror 474G 374G 346 41 43.3M 2.19M ada3p4 - - 167 21 20.9M 2.19M ada1p4 - - 179 48 22.4M 4.68M ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 474G 374G 125 165 15.7M 3.03M mirror 474G 374G 125 165 15.7M 3.03M ada3p4 - - 52 55 6.56M 3.05M ada1p4 - - 73 30 9.16M 562K ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 474G 374G 139 0 17.3M 0 mirror 474G 374G 139 0 17.3M 0 ada3p4 - - 71 0 8.76M 0 ada1p4 - - 68 0 8.54M 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 474G 374G 249 101 29.4M 3.31M mirror 474G 374G 249 101 29.4M 3.31M ada3p4 - - 139 35 16.3M 3.31M ada1p4 - - 109 36 13.0M 3.35M ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 474G 374G 115 199 12.7M 1.44M mirror 474G 374G 115 199 12.7M 1.44M ada3p4 - - 70 51 8.07M 1.45M ada1p4 - - 45 49 4.61M 1.42M ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 474G 374G 206 0 25.1M 0 mirror 474G 374G 206 0 25.1M 0 ada3p4 - - 113 0 13.8M 0 ada1p4 - - 93 0 11.4M 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 474G 374G 275 260 34.3M 3.81M mirror 474G 374G 275 260 34.3M 3.81M ada3p4 - - 153 93 19.0M 3.81M ada1p4 - - 121 87 15.2M 3.81M ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 474G 374G 258 0 31.7M 0 mirror 474G 374G 258 0 31.7M 0 ada3p4 - - 123 3 15.1M 15.8K ada1p4 - - 134 3 16.6M 15.8K ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 474G 374G 269 0 32.9M 0 mirror 474G 374G 269 0 32.9M 0 ada3p4 - - 132 0 15.9M 0 ada1p4 - - 136 0 17.1M 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 474G 374G 402 100 50.4M 2.41M mirror 474G 374G 402 100 50.4M 2.41M ada3p4 - - 189 24 23.6M 2.41M ada1p4 - - 213 24 26.7M 2.41M ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 474G 374G 372 124 46.5M 535K mirror 474G 374G 372 124 46.5M 535K ada3p4 - - 182 28 22.8M 550K ada1p4 - - 190 28 23.7M 550K ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 474G 374G 339 0 42.4M 0 mirror 474G 374G 339 0 42.4M 0 ada3p4 - - 163 0 20.4M 0 ada1p4 - - 176 0 22.0M 0 ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 474G 374G 387 55 48.4M 1.66M mirror 474G 374G 387 55 48.4M 1.66M ada3p4 - - 203 16 25.5M 1.66M ada1p4 - - 183 18 22.9M 1.68M ---------- ----- ----- ----- ----- ----- ----- capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ----- zhome 474G 374G 234 130 29.3M 558K mirror 474G 374G 234 130 29.3M 558K ada3p4 - - 111 35 14.0M 574K ada1p4 - - 122 33 15.3M 550K ---------- ----- ----- ----- ----- ----- -----
断片化実験してみりゃいいんだろうけど、問題の性質上、仮想マシンではダメだろうし、かといって個人の趣味では実環境を揃えるのもなかなか大変だし(とか言いつつ、実はパーツは揃ってたりするが面倒&時間がなくて実験出来てない…)
何でこんな事が起きるのか、偉い人教えて下さい……。