Product SiteDocumentation Site

10.3. Quality of Service

10.3.1. 原理とメカニズム

Quality of Service (サービスの品質) (略して QoS) はアプリケーションに提供されるサービスの品質を向上させる技術群を指します。最も人気の技術は、ネットワークトラフィックをカテゴリ分けして、トラフィックの所属するカテゴリごとにその取り扱いに違いを付けることです。サービスを差別化するという概念の主な用途がトラフィックシェーピングです。これは一部のサービスおよびホストに関連する接続のデータの転送率を制限します。これを使うことで、利用できる帯域幅が飽和することを避け、重要な他のサービスに支障が出ないようにします。トラフィックシェーピングは TCP トラフィックに対して特に有効です。なぜなら、TCP は自動的に利用できる帯域幅に適応するからです。
これを使うことで、トラフィックの優先度を変更し、対話型サービス (sshtelnet など) や小さなブロックのデータだけを取り扱うサービスに関連するパケットに高い優先順位を付けることが可能です。
Debian カーネルには、QoS 関連モジュールと一緒に QoS に必要な機能が含まれています。多くのモジュールが存在し、各モジュールが異なるサービスを提供します。中でも注目すべきは IP パケットの待ち行列用の特別なスケジューラです。このスケジューラはさまざまな用途に利用できるため、考え得るさまざまな要求に対応できます。

10.3.2. 設定と実践

QoS パラメータは tc コマンド (iproute パッケージの提供する) を使って設定します。このコマンドはインターフェースがかなり複雑なので、高レベルツールを使うことを推奨します。

10.3.2.1. 待ち時間の低減、wondershaper

wondershaper (よく似た名前のパッケージに含まれます) の主目的はネットワーク負荷とは無関係に待ち時間を最小化することです。このコマンドを使うことで、全トラフィックがある値に制限されます。この値には帯域を飽和させるよりほんの少しだけ小さな値を設定します。
ネットワークインターフェースを設定した後、wondershaper interface download_rate upload_rate を実行することでトラフィックが制限されます。インターフェースはたとえば eth0 または ppp0 などで、各制限値はキロビット毎秒単位です。特定のインターフェースで実施されているトラフィック制限を無効化するには wondershaper remove interface コマンドを使います。
イーサネット接続の場合、このスクリプトをインターフェースが設定された直後に呼び出すのが最良です。これを行うには、/etc/network/interfaces ファイルに updown 指示文を追加して、それぞれインターフェースが開始された後と停止される前に実行するコマンドを宣言します。以下にその例を示します。

例 10.9 /etc/network/interfaces ファイルの修正

iface eth0 inet dhcp
    up /sbin/wondershaper eth0 500 100
    down /sbin/wondershaper remove eth0
PPP の場合、/etc/ppp/ip-up.d/ 内に wondershaper を呼び出すスクリプトを作成することで、接続が開始された後の可能な限り早い時期にトラフィック制御を行うように設定できます。

10.3.2.2. 標準的な設定

明示的に QoS 設定を行わない場合、Linux カーネルは pfifo_fast キュースケジューラを使います。これは興味深い機能を提供します。各 IP パケットの優先度はパケットの ToS フィールド (Type of Service) によって決まります。さらに、スケジューリング機能を活用するには、このフィールドを修正するだけで十分です。ToS フィールドの取り得る値は以下の 5 種類です。
  • 通常のサービス (0)。
  • コストの最小化 (2)。
  • 信頼度の最大化 (4)。
  • 速度の最大化 (8)。
  • 遅延の最小化 (16)。
ToS フィールドは IP パケットを生成するアプリケーションによって設定されるか、netfilter によってその場で修正されます。以下のルールを使うだけで、サーバの SSH サービスに対する応答性を増加させることが可能です。
iptables -t mangle -A PREROUTING -p tcp --sport ssh -j TOS --set-tos Minimize-Delay
iptables -t mangle -A PREROUTING -p tcp --dport ssh -j TOS --set-tos Minimize-Delay