start

zfs destroyしても空き容量はすぐには増えない?

ここに16TiBのRAID-Z2プールがあるじゃろ。

$ zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
zdata  16.2T  5.63T  10.5T    34%  1.00x  ONLINE  -

$ zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
zdata            5.63T  5.02T   304K  /mnt/zdata
zdata/ROOT       5.63T  2.37T   304K  /mnt/zdata/ROOT
zdata/ROOT/data  5.63T  2.37T  5.63T  /mnt/zdata/ROOT/data

それを消したんじゃ。

$ sudo zfs destroy -R zdata/ROOT

そして再度ファイルシステムを確認すると…

$ zfs list
NAME    USED  AVAIL  REFER  MOUNTPOINT
zdata  5.61T  5.04T   288K  /mnt/zdata

なんと、空き容量が増えておらんのじゃ!

もう少し詳しく見てみる。

$ zpool iostat zdata 1
               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
zdata       8.20T  8.05T    403    161  2.35M   659K
zdata       8.20T  8.05T    445      0  1.86M      0
zdata       8.20T  8.05T    359      0  1.64M      0
zdata       8.20T  8.05T    494      0  2.65M      0
zdata       8.20T  8.05T    446      0  1.75M      0
zdata       8.20T  8.05T    309      0  1.42M      0
zdata       8.19T  8.06T    416    266  2.17M  1.62M
zdata       8.19T  8.06T    415      0  1.88M      0
zdata       8.19T  8.06T    438      0  2.47M      0
zdata       8.19T  8.06T    328      0  1.49M      0
zdata       8.19T  8.06T    379      0  1.82M      0
zdata       8.19T  8.06T    494      0  2.65M      0
zdata       8.19T  8.06T    314    158  1.46M   647K
zdata       8.18T  8.07T    349      8  1.40M  36.0K
zdata       8.18T  8.07T    549      0  2.71M      0
zdata       8.18T  8.07T    444      0  1.85M      0
zdata       8.18T  8.07T    660      0  3.09M      0
zdata       8.18T  8.07T    408      0  1.72M      0
zdata       8.18T  8.07T    310      0  1.83M      0
zdata       8.16T  8.09T    303    161  1.28M   659K
zdata       8.16T  8.09T    469      0  2.61M      0
zdata       8.16T  8.09T    350      0  1.89M      0
zdata       8.16T  8.09T    269      0  1.86M      0
zdata       8.16T  8.09T    272      0  1.72M      0
zdata       8.16T  8.09T    264      0  1.76M      0
zdata       8.15T  8.10T    196    170  1.29M   695K
^C
$ zfs list
NAME    USED  AVAIL  REFER  MOUNTPOINT
zdata  5.39T  5.27T   288K  /mnt/zdata

$ df -h
Filesystem                     Size    Used   Avail Capacity  Mounted on
zdata                          6.6T    287k    6.6T     0%    /mnt/zdata

なんか頑張って回収しとるのぉ…。この状態でファイルを作るとどうなるんじゃろ?iostatを見ながらddしてみる。

$ sudo zfs create zdata/ROOT
$ dd if=/dev/zero of=/mnt/zdata/ROOT/zero.tmp bs=8m
^C
601+0 records in
600+0 records out
5033164800 bytes transferred in 24.909500 secs (202058043 bytes/sec)

----------

$ zpool iostat zdata 1
zdata       3.92T  12.3T    231  1.43K  1.71M   141M
zdata       3.92T  12.3T    274      0  1.48M      0
zdata       3.90T  12.3T    102  1.36K   464K   141M
zdata       3.88T  12.4T    202    720   811K  59.7M
zdata       3.88T  12.4T    548    667  2.63M  81.2M
zdata       3.88T  12.4T    117  1.75K   472K   192M
zdata       3.88T  12.4T    212    208   872K   856K
zdata       3.88T  12.4T    197  2.36K  1.06M   293M
zdata       3.88T  12.4T    203    796   827K  68.5M
zdata       3.88T  12.4T    242  1.78K   979K   225M
zdata       3.88T  12.4T    159  1.39K   647K   146M
zdata       3.88T  12.4T    134  1.51K   539K   191M
zdata       3.87T  12.4T    120  1.33K   484K   143M
zdata       3.87T  12.4T    380  1.80K  2.12M   224M
zdata       3.87T  12.4T    504    953  1.97M  83.2M
zdata       3.87T  12.4T    350  2.42K  1.37M   304M
zdata       3.86T  12.4T    674    913  3.13M  80.2M
zdata       3.86T  12.4T    338  2.50K  1.33M   314M
zdata       3.86T  12.4T   1005    606  4.41M  47.1M
zdata       3.86T  12.4T    289  2.86K  1.13M   360M
zdata       3.86T  12.4T    704    184  2.75M   749K
zdata       3.86T  12.4T    103  3.36K   415K   418M
zdata       3.86T  12.4T    867    191  3.88M   779K
zdata       3.86T  12.4T     63  3.17K   255K   396M
zdata       3.86T  12.4T    954    149  4.22M   611K
zdata       3.86T  12.4T     38  3.46K   156K   432M
zdata       3.86T  12.4T    797     66  3.11M   276K
zdata       3.86T  12.4T      0  3.07K      0   375M
zdata       3.86T  12.4T    761    532  3.47M  62.6M
zdata       3.86T  12.4T    651    263  2.54M  7.09M ★ここでddを終了
zdata       3.86T  12.4T  1.02K    182  4.55M   743K 
zdata       3.86T  12.4T  1.01K      0  4.55M      0
zdata       3.86T  12.4T  1.24K      0  5.46M      0
zdata       3.86T  12.4T  1.09K      0  4.87M      0
zdata       3.86T  12.4T  1.37K      0  5.99M      0
zdata       3.86T  12.4T  1.45K      0  6.27M      0
zdata       3.86T  12.4T  1.04K    167  4.68M   683K
^C

当然じゃが普通に動くようじゃ。dd終了後は、また領域の回収?に戻っておるの。

暫く放置したら回収?作業が終わったようじゃ。

$ zfs list
NAME    USED  AVAIL  REFER  MOUNTPOINT
zdata  90.2M  10.7T   288K  /mnt/zdata

$ df -h
Filesystem                     Size    Used   Avail Capacity  Mounted on
zdata                           10T    288k     10T     0%    /mnt/zdata

じゃがしかし!AVAILが10.7T止まりなのは何故じゃ!?や、RAID-Z2であるからして、パリティ2台分の容量を考慮すると妥当な値なんじゃが、プール作成直後は16Tになってた気がするんだがのぉ……こっちの値が不正確と言われればそれまでなんじゃが、気になる………。

FreeBSDでVirtualBoxを動かしていると巨大ファイルの転送でCannot allocate memoryが出る

FreeBSD 10.1-RELEASEな自宅ファイルサーバからMacにファイルをコピーすると「予期しないエラーが起きたため、操作を完了できません(エラーコード -50)。」が発生してコピーに失敗する現象に長らく苦しめられていた。経験的にファイルサイズが大きいほど発生確率が高く、数百MBくらいまでのファイルなら問題ないが、2GBを超えるとまずアウトっていう。鯖→Macの場合AFP(Netatalk 3.1.7)でもCIFS(Samba 4.2.5)でも発生し、鯖→Windowsの場合は言うまでもなくCIFSしか使えないが、所々詰まりながらも一応成功するといった具合。

失敗時はNetatalkのログに「Cannot allocate memory」が必ず記録されている。発生場所は大体{fork.c:913} (error:AFPDaemon): afp_read{dsi_stream.c:424} (error:DSI): dsi_stream_read_fileのどっちか。メモリたんねーと言われましても、32GB積んでるtopで見ても余裕のよっちゃんイカで数GBレベルで残ってますし…。もう全くわけがわからないよ!本格的に原因を探ろうとsshで各種情報をモニタリングしながらコピーしたら、今度はsshdまでCannot allocate memory吐いて接続切れるし……。

ドライバの不具合?NIC/L2SW由来の不具合??もしかしてケーブルが腐ってる???などなど、疑心暗鬼ロードを爆走していたが、ようやく、ついに!遂に!!原因がわかったッ!!!!

犯人はヤス何とVirtualBox VirtualBox実行中はnetgraph関連のメモリが不足しやすく?なるっぽい。ここここで同症状が報告されており、/boot/loader.confnet.graph.maxdata=65536を追加すればおkと書いてあった。

このカーネルパラメータはnetgraphのデータキューの最大確保数を表すものらしい。同様に非データ用のnet.graph.maxallocなんてのもある。それぞれ/usr/src/sys/netgraph/ng_base.cで定義されていて、コメントが若干怖いことが書いてあった。

static int maxalloc = 4096;/* limit the damage of a leak */
static int maxdata = 512;  /* limit the damage of a DoS */

下手に大きくすると問題発生時に被害が拡大しそうな雰囲気。ま、外部公開してなきゃそんなに気にしなくてもいいだろうけど。

ついでにdmesgLimiting open port RST response from 208 to 200 packets/sec.なるログも出ていたので、/etc/sysctl.confに以下を追加。

net.inet.icmp.icmplim=2000

肝心のloader.confも一応。

net.graph.maxdata=65536
net.graph.maxalloc=65536

上記設定で1~6GBほどのファイルを100GB分くらいコピーしてみたら、何の問題もなく完了した。普通に動くって素晴らしい。

IRSTはダイナミックディスク非対応だったり?

システムドライブがダイナミックディスクの場合、Intel(R) Rapid Storage TechnologyのSSDキャッシュ機能が使えない予感。確かな文献がないため、環境依存なのかそういう仕様なのかは不明だが、少なくとも自分の環境では“ソリッドステートドライブを使用して高速化”のメニューが出てこなかった。

 ソリッドステートドライブを使用して高速化

ベーシックディスクに戻すと出現するので、きっとそういうモンなんだろう。

ちなみに、ダイナミックディスク→ベーシックディスクの非破壊変換は、TestDiskを使うと比較的簡単かつ安全に出来る。“安全”とは言っても、一歩間違うとWindowsが起動しなくなるばかりか最悪データの消失に繋がりかねない。細心の注意と自己責任で以てよろ。良い子のみんなは業務用PCなんかで挑戦しちゃダメだぞ★。ぼくはかいしゃのぱそこんでためしてきどうしなくなってちょうあせったよ。

IRSTの効果はというと、体感レベルで結構効いてる感じ。キャッシュ有りの環境になれた後でキャッシュを切って試してみると、ものすごーく遅い。正直、効果の面でも運用の面(データの保全は大丈夫なのかとか?)でも懐疑的だったけど杞憂ですた。自分より遥かに頭の良い人達が開発してるんだから疑うほうが失礼か。

このIRSTで地味に凄いのが、キャッシュのON/OFFをOSの再起動なしで出来るという所。稼働中のシステムHDDにSSDをくっつけた仮想ボリュームを作り、元のHDDとオンラインで丸ごと差し替えるとか中々狂ってる。ZFSみたいにファイルシステムレベルでキャッシュ機能を持ってたり、非システムディスクならともかく、デバイスレベルで丸ごと差し替えですよ?人間で言ったら生きたまま心臓を交換するようなもんですよ?IntelもWindowsもすげーと言わざるをえない。

RAID-Z再構築中に更にHDDが脱落してプールがUNAVAILになったでござる(°ω°)

ところで俺のRAID-Zを見てくれ。こいつをどう思う?

[Decomo@Freyja ~]$ zpool status 
  pool: zdata
 state: UNAVAIL
status: One or more devices are faulted in response to IO failures.
action: Make sure the affected devices are connected, then run 'zpool clear'.
   see: http://illumos.org/msg/ZFS-8000-HC
  scan: resilvered 121G in 2h0m with 13047163 errors on Thu Sep 24 23:26:28 2015
config:

	NAME                       STATE     READ WRITE CKSUM
	zdata                      UNAVAIL     96     0     0
	  raidz1-0                 UNAVAIL    194     0     0
	    11774477246658925336   REMOVED      0     0     0  was /dev/ada0p1
	    ada1p1                 ONLINE       0     0     0
	    replacing-2            UNAVAIL      0     0     0
	      3139585788591315191  UNAVAIL      0     0     0  was /dev/gpt/data0-1a
	      ada2p1.nop           ONLINE       0     0     0
	  raidz1-1                 ONLINE       0     0     0
	    ada5p1                 ONLINE       0     0     0  block size: 512B configured, 4096B native
	    ada3p1                 ONLINE       0     0     0  block size: 512B configured, 4096B native
	    ada4p1                 ONLINE       0     0     0  block size: 512B configured, 4096B native
	logs
	  mirror-2                 ONLINE       0     0     0
	    ada10p4                ONLINE       0     0     0
	    ada15p4                ONLINE       0     0     0
	cache
	  ada10p5                  ONLINE       0     0     0

errors: 13047165 data errors, use '-v' for a list

すごく・・・UNAVAILです・・・。

RAID-Zを使い始めて早4年、遂にうちにも訪れてしまった、この恐怖の現象「RAIDリビルド中のHDD死亡お替わり」が。いつの間にかデグレってた事は何度かあったけど、UNAVAILは初めて見たよ……。幸いにもada0は脱落しただけで死んではおらず、SATAケーブル&電源抜き差しで無事復活というかresilveringなう(๑˃̵ᴗ˂̵)وなんですけども。心臓に悪いったらありゃしない。

それにしても、SATAコネクタの信頼性の低さはどうにかならないかなー。コンシューマ向けのHDD×7台でRAID組んでるのがそもそもの間違いではあるし、信頼性求めるならSAS使えって話でもあるけどさ、流石に家庭でSASはやり過ぎっつーかオーバースペックも良いとこでしょ。そんな金もないし。このあたりのイレギュラーさを差し引いても、SATAコネクタは緩み易過ぎると個人的には思う。もうちょっとガッチリとはまって欲しいもんだ。

とか何とか言ってるそばから、またada0が脱落してるし……。

無事リビルド完了(念のために言っておくと作業自体は随分前に終わってる。)

面白いログが取れたので記念ぱぴこ。

[Decomo@Freyja ~]$ zpool status zdata
  pool: zdata
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
	continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Sat Sep 26 13:42:23 2015
        4.51T scanned out of 14.7T at 376M/s, 7h51m to go
        968G resilvered, 30.78% done
config:

	NAME                       STATE     READ WRITE CKSUM
	zdata                      DEGRADED     0     0     0
	  raidz1-0                 DEGRADED     0     0     0
	    ada12p1                ONLINE       0     0     0  (resilvering)
	    ada1p1                 ONLINE       0     0     0
	    replacing-2            DEGRADED     0     0  370K
	      3139585788591315191  UNAVAIL      0     0     0  was /dev/gpt/data0-1a
	      ada2p1               ONLINE       0     0     0  (resilvering)
	  raidz1-1                 ONLINE       0     0     0
	    ada5p1                 ONLINE       0     0     0  block size: 512B configured, 4096B native
	    ada3p1                 ONLINE       0     0     0  block size: 512B configured, 4096B native
	    ada4p1                 ONLINE       0     0     0  block size: 512B configured, 4096B native
	logs
	  mirror-2                 ONLINE       0     0     0
	    ada14p4                ONLINE       0     0     0
	    ada15p4                ONLINE       0     0     0
	cache
	  ada14p5                  ONLINE       0     0     0

errors: 4503902 data errors, use '-v' for a list

RAID-Zを構成するHDDが2台同時にリビルドされてた。流石ZFS、なかなか器用なことをしてくれる。これもブロック単位でチェックサムを持ってるお陰なのかしら?

FreeBSDの環境そのままにCPU代えたらIllegal instructionでまくり

ASRock C2750D4Iは8コアAtom C2750搭載でSATAポートが12個もある、正にファイルサーバにうってつけのマザボである。Mini-ITXながら通常サイズのDDR3 DIMMが4本刺さり、やろうと思えば16GBモジュール×4で64GBものメモリが積めるのも素晴らしい。これまた大食漢のZFSにおあつらえ向きの仕様で、加えてIPMIでリモートで電源ON/OFFやBIOSがいじれたりして、刺さる人には刺さりまくりの素敵ママンだ。流石は変態紳士ASRock。

発売当初から目は付けていたものの、4万後半という値段に手が出せないまま円安と増税の影響で更に値上がりし、もう買えない…と諦めかけていたその時!偶然、JMC DirectでB級品が35000円弱で売られているのを見つけてしまったので光速でポッチッチ。

家鯖のFreeBSD 10.1-RELEASE環境はそのままに、早速Z77A-GD65 + Xeon E3-1260Lと入れ替えてみたところ、難なく動いた。

……と思ったのも束の間、portsで入れたソフトが軒並みIllegal instructionで落ちまくる!CPUTYPE?=nativeでコンパイルしたバイナリなので、Avotonじゃ実行できない命令が生成されてるんだろう。SandyBridgeからのグレードダウンとはいえ、同時期のCPUで実行できないほどのアグレッシブなコードを吐くclang先輩マジぱねっす。C2750用にビルドし直そうとしても、これまた軒並みIllegal instructionで落ちまくり。ツールチェイン、お前らもか……。たかがgmakeですら超最適化してくれるclang先輩マジ(ry

怪しそうなportsを片っ端からリビルドしたり、gdbで落ちてるライブラリを探ったり、どうしても分からん時はpackagesに逃げたりして何とか再構築できた。最適化ビルドも考えものだな…。少なくともカーネルを再構築する時は、無難な最適化オプションにしないと泣きを見そう……。そのためのCPUTYPE?なんだろうし(?付きの方はカーネル構築時には適用されないらしい)。

  • start.txt
  • 最終更新: 2022-07-27 15:26
  • by Decomo