ハクソク

世界を動かす技術を、日本語で。

OpenBSD: PFキューが4 Gbpsの壁を突破

概要

OpenBSDのPFパケットフィルタでHFSCトラフィックシェーピングの帯域幅上限が32ビット制限から64ビットに拡張
10G以上の高速ネットワークインターフェースに対応
pftop(1)の表示バグも修正
既存設定はそのまま利用可能
パッチは2026年3月20日までにコミット予定

OpenBSD PFのHFSC帯域幅制限の64ビット化

  • OpenBSDのPFパケットフィルタは、HFSCトラフィックシェーピングをサポート
  • これまでstruct hfsc_scの内部32ビット制限により、帯域幅指定が約4.29Gbpsで上限
  • 10G、25G、100Gなどの高速NIC普及により、この制限が問題化
  • 10G以上を設定すると、値がサイレントにラップアラウンドし、予測不能なスケジューリング挙動に
  • 新パッチにより、カーネルのHFSCスケジューラ内部の帯域幅フィールドが64ビット整数に拡張
  • この変更で現行・将来の高速インターフェースに十分対応可能

pftop(1)の表示バグ修正

  • 旧仕様では4Gbps超の帯域幅が**pftop(1)**で正しく表示されないバグ
  • 今回のパッチで正しい帯域幅表示が可能に

実際のユーザー影響

  • PFキューの帯域幅設定が、10G100Gなどの現代的なインターフェースで正しく機能
  • 設定例:
    • queue rootq on em0 bandwidth 10G
    • queue defq parent rootq bandwidth 8G default
  • 最大999Gまでサポート、将来的な拡張性も確保
  • 4G未満の既存設定はそのまま利用可能、変更不要

今後の展望とコミット予定

  • -currentスナップショットのテストOpenBSD Foundationへの寄付が推奨
  • 技術メーリングリスト「PF Queue bandwidth now 64bit for >4Gbps queues」スレッドで議論
  • パッチは2026年3月20日(金)までにコミット予定

Hackerたちの意見

pfって、実際に4Gbps以上の速度でシェイプできるの?
7.9からは、シェーピング(つまり、帯域幅制限)がもう4 Gbpsで頭打ちにならなくなったよ。PFは常に4 Gbpsを超えて処理・転送できてたから、そんな帯域を扱えるハードウェアさえあれば問題ない。話題にしてた制限は、トラフィックをシェイプするためにキューを使う場合に特有のものだったんだ。OpenBSD/PFの一般的なネットワークパフォーマンスについて聞いてるなら、ここ数年でやっと許容範囲に達してきたよ。低スペックのハードウェアでも、2.5 GbEインターフェースを簡単に飽和させられるからね。
今や安いコンシューマハードウェアでも2.5Gポートが搭載されてる時代なのに、この数字は妙に低く感じるね。つまり、現在データセンターや10G以上のポートを扱うところでOpenBSDを使ってる人はほとんどいないってこと?それともフィルタリングの問題なのかな?10年前にはデータセンター以外でこんな速度は珍しかったから、問題があるのは驚かないけど、ここ数年で誰もこの問題を早く解決しようとしなかったのは意外だな。
確か、OpenBSDプロジェクトではパフォーマンスは優先事項じゃなくて、セキュリティが一番大事なんだよね(それに、理解しやすくてメンテしやすいコードみたいな関連する品質も)。数年前にフォローしてた時のFreeBSDは、ipfwや独自のPFフォークのパフォーマンスが良かったよ(OpenBSDのとは完全互換じゃないけど)。
> つまり、現在データセンターや10G以上のポートを扱うところでOpenBSDを使ってる人はほとんどいないってこと?これは帯域制限にだけ影響するみたいだね。10G以上でOpenBSDをトラフィックシェイパとして使うのはかなりニッチだと思うし、もし使ったとしても、キューの制限は4Gよりずっと少なくなるんじゃないかな。
もう一つの可能性は、10GEのアップリンクがある時点ではシェイピングがそれほど重要じゃなくなるってこと。512kbitのリンクがあった頃は、VOIPを優先するのが重要だったし、128/512kbitみたいな非対称リンクでは小さいパケット(ssh)やtcp ACKを優先するのが賢明だったけど、5-10-25GEの速度になると、ACKパケットをキューに入れられないことがメインの問題じゃないかもしれないね。
> つまり、現在データセンターや10G以上のポートを扱うところでOpenBSDを使ってる人はほとんどいないってこと? 半分の問題は適切なドライバがないことだよ。OpenBSDは大好きだけど、ファイバー関連はちょっと中途半端なんだよね。長い間、OpenBSDの1GファイバードライバにはDOM(ライトレベルモニタリングなど)が全然対応してなかった。こういうのがあると、DOMの統計がトラブルシューティングにとって重要なデータセンターではOpenBSDを選ぶのが難しくなる。OpenBSDは2020年から2021年頃にSFP用のDOM統計をやっと導入したけど、常に機能するわけじゃなくて、正しいSFPとカードのメーカーの組み合わせが必要なんだ。FreeBSDではそれが普通に動くのにね。全体的に見ても、高速なオプティクスではFreeBSDが圧倒的に進んでる(言葉遊びは許して!)。例えば、Decisioは10G SFP+のルーターボックスを作ってるけど、FreeBSDはすぐに使えるドライバがあるのに、OpenBSDにはない。これはSFP+の例だけど、QSFPなどに手を出すと、まるで砂漠の中の転がる枯れ草みたいだよ…。
この記事は、2³²-1を超えるバイト/秒の帯域制限を許可することについてで、pfがパケットをどれだけ速くフィルタリングできるかについてではないよね。速いポートを持ってる人は、そんなに大きなサービスのために帯域を制限する必要を感じてないんじゃないかな。引用すると、「OpenBSDのPFパケットフィルタは、pf.conf(5)のキュールールでHFSCトラフィックシェイピングを長い間サポートしてきた。しかし、HFSCサービスカーブ構造(struct hfsc_sc)の内部32ビット制限により、帯域幅の値は約4.29Gbpsで静かに制限されていた。」今や10G、25G、100Gのネットワークインターフェースが一般的になって、OpenBSDの開発者たちがSMPのためにカーネルを解放し、これらの速度をサポートするカードのドライバを追加している中で、この制限が問題になり始めた。10Gの帯域をキューに設定すると、静かにラップアラウンドして、間違った予測不可能なスケジューリング動作を引き起こすことがあった。新しいパッチでは、カーネルのHFSCスケジューラの帯域幅フィールドを32ビットから64ビット整数に拡張して、このボトルネックを完全に取り除いているよ。」
マルチギガ以上の領域に入ると、「カーネルを速くする」って答えじゃなくて、「カーネルでやるのをやめる」ってことが多いよね。ホットパスをユーザーレベルに押し出して、コア間でスケールできるようにする(DPDK/netmap/XDPスタイルのアプローチ)とか、パケットをバッチ処理して、NICとの間で直接DMAする感じ。カーネルはデータプレーンよりも制御プレーン的な役割になるんだ。PF/ALTQは伝統的なカーネル内のパケットごとのモデルだから、限界に早くぶつかっちゃう。
OpenBSDって主にセキュリティテストに使われてるんじゃないの?もしそうじゃなかったら驚くけど、プロダクションのデータセンターのネットワークハードウェアで使われてるとは思えないな。ほとんどの人は、特定のハードウェア用に書かれたドライバーを含むようなプロプライエタリな実装や、FreeBSDみたいなものを使うんじゃないかな。
PF自体はISPや大きな組織向けには作られてないよ。IPFW(FreeBSD)の方がもっとパワフルで柔軟性がある。OpenBSDはセキュアなオールインワンルーターとしてSOHO向けに輝いてる。必要なソフトウェアがベースシステムに全部揃ってるのがいいよね。PFは直感的で扱いやすいから、ネットワークの専門家じゃなくても大丈夫。
OpenBSDは90年代後半から2000年代初頭にかけて素晴らしいOSだった。場合によってはLinuxと肩を並べて競ってたし。それ以来、Linuxはすごく成長したけど、OpenBSDはあまり成長してない。これにはいくつかの原因があるけど、いくつかだけ挙げると、Linuxは大企業からのサポートが多いし、ユーザーベースの数が大きく違うし、Linuxは新しいユーザーに対してもっとウェルカムなんだよね。その差はどんどん広がってる。
PFではすべての入出力がキューを通過する必要はないよ。制限は特にキューのスループットに影響を与えたんだ。
まだシングルスレッドだね。FreeBSDのPFはマルチスレッド。家庭のWANならOpenBSDを使うけど、他の用途ならFreeBSDかな。
地元のファイバーがやっと4Gbpsの接続を提供してくれたけど、何に使うか全然わからない笑。2Gbpsで十分すぎるし。
やっと3Gbpsにする気になった(内部ネットワークは10Gbpsにする予定)。NASへの内部転送がめっちゃ速くなるし、AIモデルのダウンロードも約8分から3分未満に短縮されるはず。必要かって言われると、そうでもないけど、めっちゃいいよね。
OpenBSDを使いたいな。試してみたいけど、ファイルシステムの選択肢が微妙な感じ。OpenBSDに対応した良いNVMeやFDEサポートのあるモダンなファイルシステムってあるのかな?