▼ 2026年10月の記事

2026年10月12日(月)

大きなコピーが途中で急に遅くなるのはなぜか — txg.cと書き込みスロットルを読む

発表会の4K素材をhomenasにコピーしたとき、最初の数秒だけ速く、そこから一段遅くなって落ち着きました。txgを回すtxg.c、dirtyデータを数えるdsl_pool.c、書き込みを遅らせるdmu_tx.c(合わせて4,408行、公開パラメータ12個)を読むと、メモリにためておける量と、それに近づいたときに書き込みを1件ずつ眠らせる仕組みが書かれていました。txgの流れ、syncのきっかけ、締め切りの仕組み、dirtyデータの目盛り、遅延の曲線、書き込み1件が通る関所までを7枚の図にまとめます。

続きを読む »

投稿者: 宮田 | カテゴリー: パフォーマンス | 難易度: 上級

2026年10月10日(土)

fsyncは何を待っているのか — zil.cを読んで、SLOGの答え合わせをする

SLOGを足したのに何も速くならなかった件は、当時「非同期書き込みだったから」で片付けていました。ZIL本体のmodule/zfs/zil.c(4,920行、公開パラメータ8個)を読むと、書き込みのたびに変更の記録が作られ、fsyncが来なければディスクに書かれないまま捨てられていました。fsyncが返るまでの道筋、ログブロック(lwb)の7つの状態、データをログに入れるかどうかの分かれ道、fsyncの相乗りの待ち方、ZILブロックの置き場所の順番までを8枚の図にまとめます。

続きを読む »

投稿者: 宮田 | カテゴリー: パフォーマンス | 難易度: 上級

2026年10月01日(木)

日曜夜のscrubは、本当は遠慮していた — vdev_queue.cを読む

日曜21時のscrubが家族の動画配信とぶつかってカクついた件は、時間をずらして片付けたまま、なぜぶつかったのかは分かっていませんでした。OpenZFSのI/Oスケジューラmodule/zfs/vdev_queue.c(1,195行、公開パラメータ27個)を読むと、scrubはかなり慎重に通常のI/Oへ道を譲るように作られていました。9本のI/Oクラス、次のI/Oの選び方、非同期書き込みの上限の動き方、scrubの遠慮の仕組み、そしてmasterで入った「SSDはキューを通らない」変更までを図にまとめます。

続きを読む »

投稿者: 宮田 | カテゴリー: パフォーマンス | 難易度: 上級

▼ 2026年9月の記事

2026年09月29日(火)

アラートメールが本当に届くか、一度も確認していなかった

友人宅のNASでディスクが1本壊れたとき、設定していたはずのzedからの通知メールが結局届いていなかったと聞いて青ざめました。homenasのアラートも設定しただけで一度も動作確認していなかったからです。本物のディスクが壊れるのを待つ代わりに、zinjectで疑似的に故障状態を作り、監視・通知が本当に動くかを検証したときの記録です。コマンドの意味を1つずつ追いながら整理します。

続きを読む »

投稿者: 宮田 | カテゴリー: 障害対応 | 難易度: 上級

2026年09月29日(火)

arc.cを1万1千行読んで、あのL2ARCの失敗をやっと説明できた

RAM 32GBのhomenasに1TBのL2ARCを足して逆に遅くした件は、「L2ARCのヘッダがRAMを食うから」と説明してきました。ただ、それがコードのどこで起きているのかは見たことがありませんでした。OpenZFS masterのmodule/zfs/arc.c(11,841行・203関数)を通読し、ヘッダの7つの状態、arc_read()の骨格、退避と縮小の3者、2026年2月に書き直されたL2ARCのfeedまでを図にまとめます。

続きを読む »

投稿者: 宮田 | カテゴリー: パフォーマンス | 難易度: 上級

2026年09月19日(土)

「vdev幅は後から変えられない」が半分だけ嘘になっていた

RAIDZ設計の記事で「vdev幅はプール作成後に変えられない」と書きました。あれは今でも大筋では正しいのですが、OpenZFSにRAIDZ拡張(raidz expansion)という機能が入り、既存のRAIDZ vdevにディスクを1本ずつ追加できるようになっています。homenasで実際に使ってみて分かった、便利さと「思ったほど得しない」落とし穴を整理します。

続きを読む »

投稿者: 宮田 | カテゴリー: 設計 | 難易度: 上級

2026年09月13日(日)

スナップショット整理スクリプトがレプリケーションを壊した話

友人宅へのオフサイトレプリケーションが、ある夜から突然フル転送に戻ってしまい、細い自宅アップロード回線で3日がかりになったことがあります。原因は、スナップショット整理スクリプトがincremental sendに必要な共通スナップショットを消してしまっていたことでした。フル/incremental sendの仕組み、bookmarkによる軽量な差分管理、resumable sendが実際にどう救ってくれるかを整理します。

続きを読む »

投稿者: 宮田 | カテゴリー: 設計 | 難易度: 上級

2026年09月10日(木)

レンダーキャッシュを消した直後だけタイムラインがカクつく

homenasで4K素材を編集していて、DaVinci Resolveのキャッシュを掃除した直後だけタイムラインのスクラブがカクつくことに気づきました。犯人はasync destroyのバックログと、キャッシュ/プロキシファイルの高頻度な作成・削除によるプールの空き容量断片化でした。動画編集ワークロード特有のデータセット分離、recordsize設計、async destroyとの競合を避けるチューニングを整理します。

続きを読む »

投稿者: 宮田 | カテゴリー: パフォーマンス | 難易度: 上級

2026年09月08日(火)

新しいマシンで読み込んだプールが、古いマシンに二度と戻らなくなった話

homenasを新しいハードウェアに載せ替える途中、念のため旧機でも動作確認しようとしたら、二度とインポートできなくなっていました。原因はプールのversion番号ではなく、feature flagという一方通行の仕組みでした。legacy versionとfeature flagsの違い、なぜ一度アップグレードすると戻れないのか、そして詰んだときの読み取り専用インポートによる救出手順を整理します。

続きを読む »

投稿者: 宮田 | カテゴリー: 障害対応 | 難易度: 中級

2026年09月06日(日)

PostgreSQLのIOPSが計算通り出なかった理由がrecordsizeだった話

ワークロードのIOPS要件から逆算してディスク本数を決めたはずのPostgreSQLサーバーで、実際のIOPSが計算値の何分の1も出ていなかったことがあります。犯人はrecordsizeをデフォルトの128KiBのまま放置していたことでした。読み込み増幅の仕組み、なぜ後から変更しても既存データには効かないのか、そして圧縮アルゴリズムの選び方を図解つきで整理します。

続きを読む »

投稿者: 宮田 | カテゴリー: パフォーマンス | 難易度: 中級

2026年09月04日(金)

スナップショット一括削除の直後にバックアップを繋げて原因調査に半日溶かした話

仕事の基盤チームで、古いスナップショットを一括削除する定期ジョブの直後にバックアップジョブを繋げていたら、原因不明の性能劣化に悩まされたことがあります。犯人はzfs destroy後もバックグラウンドで解放処理が続く非同期解放(async destroy)でした。仕組みとfreeingの監視方法、クローン削除を高速化するlivelist、削除運用でハマりがちな落とし穴を整理します。

続きを読む »

投稿者: 宮田 | カテゴリー: パフォーマンス | 難易度: 上級

2026年09月03日(木)

日曜夜のscrubで家族に不満を言われた話

何も考えずcronで週次scrubを日曜21時に設定していたら、家族の動画配信視聴とまともにぶつかって苦情が来たことがあります。scrubの頻度設計、resilver中の二重障害リスク、sequential resilverとの違い、そしてHDDプールでの所要時間見積もりを実務目線で整理します。

続きを読む »

投稿者: 宮田 | カテゴリー: 障害対応 | 難易度: 中級

2026年09月01日(火)

家族共有フォルダのACLをバックアップスクリプトで消した話

homenasのSamba共有で家族ごとにNFSv4 ACLを丁寧に設定していたのに、深夜のバックアップスクリプトがchmod -Rを叩いて全部リセットしていたことがあります。ZFSのACLがなぜPOSIXのモードビットと二重管理になるのか、aclmode/aclinheritでどこまで制御できるのか、そしてこの問題を統一しようとして結局カーネルに入らなかったrichaclの構想を整理します。

続きを読む »

投稿者: 宮田 | カテゴリー: 設計 | 難易度: 上級

▼ 2026年8月の記事

2026年08月30日(日)

special vdevで一度プールを飛ばした話

「余っているNVMeをspecial vdevにすればHDDプールが速くなる」— 自宅のhomenasで実際にこれをやって、単一障害でプール自体を失いかけたことがあります。special vdevはL2ARC/SLOGと違い、失えばプール全体を道連れにする本番のメタデータ格納先です。冗長性の鉄則、容量見積もり、そして「後から外せると思っていたら外せなかった」問題を、実際の失敗談ベースで書きます。

続きを読む »

投稿者: 宮田 | カテゴリー: 設計 | 難易度: 上級

2026年08月17日(月)

SLOGを足したのに何も速くならなかった話、と後で気づいた本当の危険

自宅のhomenasでNFS共有を少し速くしたくて余っていたコンシューマ向けNVMeをSLOGにしたら、体感速度がまったく変わりませんでした。理由は単純で、そのとき動いていたのはほぼ非同期書き込みだったからです。もっと怖かったのは後から知ったPLP(電源損失保護)の話でした。ZILとSLOGの役割分担、SLOGが効く条件、そして「PLPなしSSDをSLOGにする」という最も危険な落とし穴を整理します。

続きを読む »

投稿者: 宮田 | カテゴリー: パフォーマンス | 難易度: 中級

2026年08月17日(月)

dedupを切り忘れたVMストアが返ってこなくなった話

検証のつもりでdedup=onにしたVMストアをそのまま忘れて本番投入し、半年後に容量整理でzfs destroyを叩いたら丸一日プールが返ってこなくなったことがあります。DDT(dedupテーブル)がRAMから溢れた瞬間に何が起きるのか、事前にどう見積もればよいのか、そして多くの場合dedupより先に検討すべき代替手段を整理します。

続きを読む »

投稿者: 宮田 | カテゴリー: 設計 | 難易度: 上級

2026年08月10日(月)

ashiftを間違えたまま2年運用していた

初代homenasは512eディスクの自動判定ミスでashift=9のまま組んでしまい、気づいたのは2年後でした。RAIDZ1/2/3の選択、vdev幅、ashift — この3つはプール作成の瞬間に固定され、後からディスク1本足すような気軽さでは直せません。resilverリスクとashiftの不可変性という実務上の制約から整理します。

続きを読む »

投稿者: 宮田 | カテゴリー: 設計 | 難易度: 中級

2026年08月09日(日)

オフサイトバックアップに平文を送っていた話

友人宅のNASへオフサイトバックアップを組んだとき、zfs sendに-wを付け忘れていたことに数ヶ月気づきませんでした。暗号化データセットは既定の送信方法だと送信元でいったん復号されるため、平文がネットワーク越しに流れていたことになります。ZFSネイティブ暗号化の鍵管理と性能コスト、そしてこのraw sendの落とし穴を整理します。

続きを読む »

投稿者: 宮田 | カテゴリー: 設計 | 難易度: 上級

2026年08月07日(金)

L2ARCを足したら逆に遅くなった

homenasにRAM32GBのまま1TBのL2ARCを足したら、体感速度が足す前より悪化したことがあります。原因は、L2ARCの各エントリのヘッダ情報がARC(RAM)側に間借りしているという構造でした。ARCとL2ARCの関係、この見落としがちな制約、実務での判断フローを整理します。

続きを読む »

投稿者: 宮田 | カテゴリー: パフォーマンス | 難易度: 中級

2026年08月06日(木)

容量は足りているのに遅い、というやつ

以前、新しいVM基盤の容量見積もりだけ済ませて本番投入し、稼働後に「遅い」と言われて青ざめたことがあります。原因は単純で、IOPS要件を誰も聞いていませんでした。この記事では、ワークロードのIOPS要件からZFSのvdevトポロジーを逆算する実務プロセスを、具体的な数値と自宅VMでの検証ログとともに解説します。

続きを読む »

投稿者: 宮田 | カテゴリー: パフォーマンス | 難易度: 中級

2026年08月05日(水)

深夜にディスクが1本死んだときの手順

初めて本番でディスク故障のアラートを受けたのは深夜2時でした。幸いミラー構成で、パニックになる必要はなかったのですが、当時の自分はzpool statusの読み方に自信が持てず、無駄に時間を溶かしました。zpool offlineからzpool replaceによる復旧、resilver完了確認までを実機のコマンド出力で追います。

続きを読む »

投稿者: 宮田 | カテゴリー: 障害対応 | 難易度: 中級