...

サーバー帯域幅のシェーピングとトラフィック制御 Linux:最適化について解説

どのように 帯域幅シェーピング サーバーとLinuxのトラフィック・コントロールでパケット・フローを制御し、レイテンシー、ジッター、停電を顕著に減らしています。私は、VoIP、API、ショップのリクエストなど、ビジネスクリティカルなフローをバックグラウンドの負荷やバックアップから保護するために、優先順位付けされたキュー、制限、QoSルールを使用しています。.

中心点

以下のコア・ステートメントは、Linuxサーバーの帯域幅とトラフィックを目標どおりに制御し、恒久的に計画可能にするのに役立つ。.

  • 優先順位付け タイムクリティカルなフローは、レイテンシーとジッターを低減する。.
  • 料金制限 とスロットリングでバーストやバッファジャムを回避する。.
  • HTB/SFQ 帯域幅を公平に分配し、クラスを一定に保つ。.
  • QoSフィルター IP、ポート、プロトコル、タグによる制御。.
  • モニタリング P95とアラートを介して、ボトルネックを早期に検出する。.

これらのポイントを段階的に積み重ね、継続的に効果を測定し、クラスやレートを実際の活用に合わせる。.

帯域幅シェーピングの実際の意味

シェイピングをするときは 区画フロー 単に反応的にスロットリングするのではなく、積極的にスロットリングします。レートを一定に保ち、リアルタイムとインタラクティブなトラフィックを優先し、不規則なデータバーストをスムーズにする。そのために、発信トラフィックにはレート制限を使い、着信データストリームにはスロットリングを使っています。このように分けることで、方向ごとの責任を明確にし、バッファがいっぱいになるのを防いでいます。ホスティング環境では、負荷ピークがシステム全体をスローダウンさせないように、顧客やアプリケーションごとに定義された上限値を設定しています。.

Linuxにおけるトラフィック制御:ツールとコンセプト

Linuxでは、以下のツールを使ってトラフィックをコントロールしている。 ティーシー とカーネルキューイング規律(qdisc)がある。典型的なビルディングブロックは、ルートqdisc、クラス、そしてパケットの優先度や制限への割り当てを定義するフィルタである。私は、保証レートと最大レートのための階層的なコントローラとしてHTBから始めることが多い。また、クラス内の公平な分配のためにSFQも使います。バースト・ヘッドルームを維持し、レイテンシのピークを避けるために、帯域幅を物理的に可能なレートの90~95%に制限しています。.

入力シェーピング(Ingress):ポリサーの代わりにIFB

着信トラフィックについては、物理インターフェイス上で直接形成するのではなく イフビー-デバイス(中間機能ブロック)。イングレス・パケットをIFBにミラーリングし、そこでHTBの階層、公平性、制限を含めて、アウトゴーイング・トラフィックのように扱う。これは ファイナー 純粋なポリサーは、ハードディスクを破棄するだけで、ジッターを増加させることが多い。.

modprobe ifb numifbs=1
ip link add ifb0 type ifb
ip link set dev ifb0 up

# PHYのingressをアクティブにし、IFBにリダイレクトする。
tc qdisc add dev eth0 handle ffff: ingress
tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 \
  アクション ミラーされたイグレス リダイレクト dev ifb0

# IFBでegressと同様にシェーピング
tc qdisc add dev ifb0 root handle 2: htb default 20
tc class add dev ifb0 parent 2: classid 2:10 htb rate 40mbit ceil 60mbit
tc class add dev ifb0 parent 2: classid 2:20 htb rate 20mbit ceil 40mbit
tc qdisc add dev ifb0 parent 2:10 handle 210: fq_codel
tc qdisc add dev ifb0 parent 2:20 handle 220: sfq

IFBを使うことで、例えばバックアップやミラーのジョブが帯域幅を圧迫するような場合に、ダウンロードのピークをコントロールすることができます。実際には、IFBは非対称なレート(1G/200Mなど)のインターフェイスや、バーストの着信によってインタラクティブ性が損なわれるようなインターフェイスで使用しています。.

HTB、TBF、SFQの比較

を正しく選択するために キューディスク 私はアプリケーションのゴールを見ている:保証、バースト動作、公平性です。HTBは固定レートと最大レートを持つ階層的なクラスを提供し、TBFはトークン・バケットごとに厳密に制限し、SFQはフローを介して機会を分配する。これらを組み合わせることで、実際には弾力的なフレームワークが形成される:HTBは上限を設けて保証し、SFQは個々のコネクションが支配的になるのを防ぎ、TBFは頑固なバーストを抑制する。次の表は、典型的なサーバー・シナリオのコア機能をまとめたものである。これは、どの規律がどの時点で意味を持つかをより迅速に判断するのに役立つ。.

qdisc/特集 目的 強み 代表的な使用例
HTB 階層 およびレートコントロール 保証率、上限、相続 クライアント、サービスクラス、QoSプロファイル
TBF 厳しい シンプルで非常に決定論的 アップリンク上限、ハードアプリケーション制限
エスエフキュー 公平性 フローあたり オーバーヘッドが少なく、分配が良い ダウンロード、P2P、多数のセッション
FQ_CoDel AQM バッファブロート対策 低遅延、キュー・スクランブル解除 エッジルーター、レイテンシが重要なリンク

RTTが大きく変動するアクセスには、FQ_CoDelか、カーネルによってはオールラウンダーとしてCAKEを使う。しかし、サーバーの実践では、私はHTB+SFQ/FQ_CoDelにこだわる。なぜなら、保証、借用、公平な分配を階層構造できれいに組み合わせることができるからだ。.

実践:典型的なサーバーのtcルール

まずはシンプルに HTB-構造を作り、フィルターを使って割り当てる。デフォルト・クラスのルートqdiscは未分類のパケットをキャッチし、優先順位付けされたクラスは保証されたレートを受け取る。HTTP/SをクラスA、データベースのレプリケーションをクラスB、バックアップをクラスCに振り分ける。これにより、ショップのリクエストは高速に保たれ、バックアップは残り物を利用する。基本や用語については、以下の入門書を参照してほしい。 帯域幅管理, その手順を具体化する。.

tc qdisc add dev eth0 root handle 1: htb default 20
tc class add dev eth0 parent 1: classid 1:10 htb rate 50mbit ceil 70mbit
tc class add dev eth0 parent 1: classid 1:20 htb rate 20mbit ceil 50mbit
tc class add dev eth0 parent 1: classid 1:30 htb rate 10mbit ceil 30mbit
tc qdisc add dev eth0 parent 1:10 handle 110: sfq
tc qdisc add dev eth0 parent 1:20 handle 120: sfq
tc qdisc add dev eth0 parent 1:30 handle 130: sfq
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 443 0xffff flowid 1:10
tc filter add dev eth0 protocol ip parent 1:0 prio 2 u32 match ip dport 3306 0xffff flowid 1:20
tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 match ip sport 22 0xffff flowid 1:30

DSCPとマークによる分類(IPv4/IPv6対応)

フィルターがIPバージョンやNATとは無関係に機能するようにするため、私はパケットを早めにマークし、次のような方法でマッピングしている。 フューマーク をクラスに追加した。これにより、複雑なu32マッチを省き、ルールをスリムに保つことができる。また、エンド・ツー・エンドのセマンティクス、例えばVoIPや双方向性にもDSCPを使用している。.

nftables による # の例: TLS を優先し、バックアップをスロットルする
nft add table inet mangle
nft add chain inet mangle prerouting { type filter hook prerouting priority -150; }.
nft add rule inet mangle prerouting tcp dport 443 meta mark set 10
nft add rule inet mangle prerouting tcp dport 22 meta mark set 30
nft add rule inet mangle prerouting tcp dport 873 meta mark set 40 # rsync/バックアップ

HTBクラスでの#マッピング(IPv4/IPv6で等しく機能する)
tc filter add dev eth0 parent 1:0 prio 1 handle 10 fw flowid 1:10
tc filter add dev eth0 parent 1:0 prio 2 handle 30 fw flowid 1:30
tc filter add dev eth0 parent 1:0 prio 3 handle 40 fw flowid 1:20

重要:可能な限りDSCP/マーカーを設定する。 縁の下 (マシンの入力または前方)により、後の決断を素早く下すことができ、tcが負荷の下で行う仕事を減らすことができる。.

ホスティングのQoS戦略:公平性と限界

マルチテナント・セットアップでは、私は次のようにセキュアにしている。 公平性 顧客ごとの固定保証とアプリケーションごとの上限によって。DSCPまたはポートによってパッケージをマークし、適切なクラスに割り当てています。ダウンロードとバックアップは容量を満たすために許可され、インタラクティブ・セッションは優先されます。こうすることで、他のテナントを排除することなく、SLAに関連するサービスが優先されます。この概要では、実用的なシナリオと優先順位付けのロジックを要約します。 トラフィックの優先順位付け これはTCのルールに合致している。.

永続性と自動化

私のQoSポリシーは再起動やインターフェイスの再起動にも耐えられる。私はtcコマンドをidempotentスクリプトとして保存し、systemdやnetplan/networkdに統合している。動的な名前のデバイス(veth/tapなど)には、udevルールかsystemdテンプレートを使っている。.

# /usr/local/sbin/tc-setup.sh (べき等ビルド)
#!/bin/sh
tc qdisc replace dev eth0 root handle 1: htb default 20
# ... その他のクラス/フィルターはこちら

# systemd unit: /etc/systemd/system/tc-setup.service
[ユニット]
説明=トラフィックコントロールセットアップ
After=network-online.target
Wants=network-online.target

[サービス]
タイプ=ワンショット
実行開始=/usr/local/sbin/tc-setup.sh
RemainAfterExit=はい

[インストール]
WantedBy=multi-user.target

まずステージングで、次に本番システムで限られた期間だけ(tc置換 の代わりに 追加メトリックスとロールバックボタンを伴う)。.

イライラすることなくモニタリング、P95、トラブルシューティングが可能

に集中するのではなく、継続的に効果を測定している。 直感 を残す。P95のレイテンシー、キューの長さ、パケットロスは、ルールが有効か厳しすぎるかを示す。iftop、vnStat、Netdataのようなツールは負荷のピークを可視化し、tcとiptablesのログは割り当てを表示します。ジッターが発生した場合は、ceil値を少し下げ、AQM対策としてCoDel/FQ_CoDelをチェックします。ボトルネックが発生した場合は、クラスの重みを段階的に調整し、各変更後に測定ウィンドウを維持します。.

テスト方法:負荷シミュレーションと検証

連続的なフロー(iperf3)、短いインタラクション(小さなHTTPリクエスト)、定期的なバースト(バックアップ/rsync)という現実的なシナリオを並行してシミュレートした。そして、インタラクティブなフローが一貫して低いレイテンシを維持するかどうか、バーストがきれいに平滑化されるかどうかをチェックする。.

# 逆方向のテスト (ダウンロード/イングレス)
iperf3 -c  -R -t 60

# シェーピング統計を読む
tc -s qdisc show dev eth0
tc -s class show dev eth0

# ジッター/RTTの分布をチェックする
ping -i 0.2 -c 100  | awk '/time=/{print $7}'

クラスが恒久的に借用を必要とする場合は、保証レートを少し上げる。AQMのキューにドロップが溜まっている場合は、バッファのサイズとリミットがアグレッシブに設定されすぎていないかチェックする。.

パフォーマンス・チューニング:90-95 %カバー、バースト・スムージング、MTU

私は出力レートを 90-95% バッファの肥大化を避け、AQMを有効にするために、リンク速度のトークンのバケット・パラメータ(レート、バースト/レイテンシー)でバーストをスムージングし、短期的なピークがキュー全体を埋め尽くさないようにする。フラグメンテーションを減らし、パスMTUの問題を避けるためにMTUをチェックする。変動が激しいワークロードに対しては、余裕のある上限値を設定しますが、保証レートは控えめにします。この設定により、優先トラフィックを高速に保つ一方で、バックグラウンド・プロセスは中立的に実行し続けることができる。.

ハードウェアオフロード、マルチキュー、IRQチューニング

高速リンクでの正確なシェーピングのために、私はNICオフロードとの相互作用を知っている。TSO/GSO/GROは加速させるが、非常に低いターゲットレートでは、それらは細かい粒度を悪化させる可能性がある。繊細なリンクでは、テストとしてTSO/GSOをオフにし、それに対するレイテンシ/CPUゲインを測定します。マルチキューNICでは、私は mq-RPS/XPSとIRQピンニングでCPU負荷を分散し、QoS作業がCPU上で飢餓状態にならないようにする。.

# オフロードを選択的にテストする (本番では慎重に)
ethtool -K eth0 tso off gso off gro off

# マルチキューのレイアウト
tc qdisc add dev eth0 root handle 1: mq
tc qdisc add dev eth0 parent 1:1 handle 10: htb default 20
tc qdisc add dev eth0 parent 1:2 handle 20: htb デフォルト 20
# ...各キューを継続し、通常どおりクラス/フィルタを設定する。

と一緒に タックスキューレン, リングのバッファサイズとIRQアフィニティ、私はレイテンシの削減を続けている。目的は、負荷がかかってもひっくり返らない、安定した短いキューパスを実現することだ。.

セキュリティとセグメンテーション:ファイアウォールとVLANによるシェーピング

私はQoSと組み合わせている。 セグメンテーション, クリティカルなネットワークがそれぞれの能力を維持できるようにね。私はVLANやインターフェイスごとに独自のキューを設定し、ファイアウォールはパケットがサーバーに入るとすぐにマークします。これは、パケットが早い段階で分類されるため、tcが負荷のかかる状況下で決断を下す回数が減ることを意味する。ストレージVLANからのバックアップはパス上に残り、フロントエンドのHTTPは飢えることはない。また、フローがより明確に割り当てられるため、エラー分析も短縮される。.

仮想化とコンテナ:私はどこにいるのか

KVM/virtioのセットアップでは、私は次のようにすることを好む。 エッジブリッジインターフェース(br0)、物理アップリンク(eth0)、またはゲストごとのvnetインターフェース。私はvnetXでテナントごとの保証を実装し、アップリンクでグローバルな上限を設定するのが好きです。Kubernetesでは、tcはvethピアまたはノードのアップリンクで実行可能です。割り当てが決定論的であり続けるように、CNI/iptables/nftablesを介して早い段階でマーカーを割り当てます。SR-IOVやDPDKの場合は、データパスがtcを通過することを確認する。.

コストとメリットハードウェアのアップグレードに代わる効率化

クリーン シェーピング 既存の回線を有効活用でき、高価なアップグレードを節約できることも多い。パケットロスが減り、レイテンシーが下がることは、ユーザー・エクスペリエンスの向上に直結します。ホスティング環境では、公正な制限がクライアント間のエスカレーションを防ぐため、これは2倍の利益をもたらします。実際、安定したレートは再送信を減らすため、スループットを向上させます。これらの効果は、最終的にはSLAの明確化とサポートケースの減少に反映されます。.

よくある落とし穴と迅速なチェック

  • 不適切なユニットをチェックします。 ビット そして ビット が正しく書き込まれ、バースト/レイテンシがMTUと一致する。.
  • 優先順位の逆転:実質的な制限なしに優先順位の高いクラスが多すぎると、デフォルトが飢餓状態に陥る。私は上限を厳守している。.
  • NAT/IPv6の見落とし:NAT/IPv6の後ではポートフィルターが意図したとおりに機能しない。私は早めにマークして(fwmark)、クラスでマッピングしています。.
  • セイルがレートを下回る:借用を妨害するよくあるタイプミス。各クラスを tc -s クラス.
  • イングレスの極性のみ:ハードドロップはジッターを生む。IFBでは、より細かく、より公平にシェイプします。.
  • オフロードは測定を歪める:私はテストごとにオフロードの状態を記録し、リンゴとリンゴを比較する。.

将来の展望AIがサポートする予約と適応政策

私は次のようなトレンドを使っている。 予想 過去の負荷に基づき、ピーク時の少し前にクラスを動的に調整。学習モデルは、キューが増大する前に、VoIPやチェックアウトフェーズ用の帯域幅を確保する。クラウドとオンプレミスのハイブリッド・ネットワークでは、スケジュールでポリシーを変更する一時的な上限とバースト・バジェットを使用しています。これにより、運用への介入を減らし、特別なイベントの際にもサービスを予測可能な状態に保つことができます。スケーリングと制限に関するより詳細な背景知識については、こちらをご覧ください: トラフィック管理とホスティングの制限.

概要とチェックリスト

私は、まず、明確な 階層 HTBでギャランティーを発行し、Ceilをリンク速度よりわずかに低く保つ。その後、サービス、プロトコル、DSCPに従って分類し、レイテンシー、ジッター、P95値をチェックします。SFQやFQ_CoDelを使って、公平な分配と短いキューを確保します。すべての変更にモニタリングが付随しているので、推測する代わりに効果を判断することができます。つまり、帯域幅のシェーピングは一過性のものではなく、サーバーのトラフィックを安全かつ予測可能な状態に保つ無駄のない制御ループなのです。.

現在の記事