MENU

Linux カーネルの Multipath TCP を本番環境で有効化する|性能計測・フォールバック確認・切り戻し

目次

Multipath TCP が「使える選択肢」になった背景

Multipath TCP(MPTCP)は、単一の TCP コネクションを複数の物理パス上に束ねて通信する IETF 標準プロトコルです。RFC 8684 として 2020 年に策定され、同年リリースされた Linux カーネル 5.6 にアップストリームで取り込まれました。

長らく「Apple 端末が FaceTime / Siri 専用に使うプロトコル」という印象が強かった MPTCP ですが、サーバーサイドでの普及は 2022 年以降に加速しています。Ubuntu 22.04 LTS・RHEL 9・Rocky Linux 9 がいずれもデフォルトカーネルで MPTCP を有効化済みであり、2026 年現在では Ubuntu 24.04 LTS(カーネル 6.8 系)や Debian 12 でも追加パッチなしに利用できます。

MPTCP を本番で検討する理由は主に三つです。まず、マルチホームサーバーで複数 NIC のスループットを単一コネクションに集約できます。次に、フェイルオーバー時も TCP セッションを維持したままパス切り替えが可能です。そして、モバイル端末や VPN 経路が混在する環境で到達性を補完できます。

本番適用前の環境確認とカーネル要件

有効化の前に、稼働中のカーネルが MPTCP をサポートしているかを確認します。

uname -r
grep CONFIG_MPTCP /boot/config-$(uname -r)

CONFIG_MPTCP=yCONFIG_MPTCP_IPV6=y の両行が返れば対応済みです。カーネル 5.6 未満、または設定が CONFIG_MPTCP=m(モジュール)の場合はカーネルアップグレードが必要になります。RHEL 系では CONFIG_MPTCP=y がデフォルトであるため、多くの場合は追加作業なしに進めます。

また、ネットワーク経路上のミドルボックス(ファイアウォール・ロードバランサー・NAT)が TCP オプション(kind=30)を透過させるかどうかも事前に確認しておきます。透過できない場合は MPTCP フォールバックが発動しますが、それ自体は障害ではなく設計の一部として扱います(後述)。

sysctl とエンドポイント設定による有効化手順

MPTCP の有効化は sysctl 一行から始まります。

# カーネルパラメータを即時有効化
sysctl -w net.mptcp.enabled=1

# 恒久化(再起動後も維持)
cat <<'EOF' > /etc/sysctl.d/99-mptcp.conf
net.mptcp.enabled = 1
EOF
sysctl --system

次に、サブフロー(追加パス)として使うインターフェースの IP アドレスをエンドポイントとして登録します。ip mptcp サブコマンドは iproute2 5.10 以降で利用可能です。

# エンドポイントの登録(subflow:発信サブフロー用)
ip mptcp endpoint add 192.0.2.10 dev eth1 subflow

# 受信側で announce も許可する場合
ip mptcp endpoint add 192.0.2.10 dev eth1 subflow signal

# サブフロー数とアドレスアドバタイズの上限設定
ip mptcp limits set subflows 4 add_addr_accepted 4

# 設定確認
ip mptcp endpoint show
ip mptcp limits show

エンドポイントの設定は再起動で失われるため、本番では systemd-networkd[Network] セクションに MultiPathTCP=yes を追記するか、NetworkManager の nmcli / connection プロファイルで管理します。あるいは mptcpd(Multipath TCP Daemon)を導入してユーザー空間からパス管理を委任する構成も 2026 年時点では選択肢に入ります。

性能計測とサブフロー動作の確認方法

MPTCP コネクションが実際に確立されているかは ss コマンドで確認できます。

# MPTCP ソケット一覧
ss -M

# 詳細統計付き(サブフロー数・送受信バイト等)
ss -iMn

# 接続ごとのサブフロー情報
ss -M -e

出力の tcp-ulp-mptcp フラグが確認できれば MPTCP として動作しています。スループット計測は iperf3 を使いますが、iperf3 自体は MPTCP ソケットを直接開けないため、カーネルの setsockopt(SOL_TCP, TCP_ULP, "mptcp") を通じて MPTCP ソケットを作るラッパーか、mptcp-tools パッケージの mptcpize コマンドを活用します。

# mptcpize を使って iperf3 を MPTCP ソケットで動かす例
mptcpize run iperf3 -c 192.0.2.1 -t 30 -P 4

比較対象として同条件の通常 TCP ベンチマーク(iperf3 -c 192.0.2.1 -t 30 -P 4)を取り、スループット・再送カウント・レイテンシを記録します。現場の知見では、100 GbE デュアル NIC 環境でのバルク転送において MPTCP が通常 TCP の 1.6〜1.9 倍のスループットを示す事例が報告されている一方、小さいトランザクション(OLTP 系 DB 接続等)では顕著な差が出ないケースも多くあります。用途ごとのベンチマークを省略しないことが重要です。

カーネル統計は /proc/net/netstat の MPTcp 行や nstat -az | grep MPTcp でも参照できます。MPTcpExtSubflowConflictMPTcpExtInfiniteMapRx のカウントが増加している場合はパス競合が疑われるため、エンドポイント設定を見直します。

フォールバック動作とアプリケーション互換性の検証

MPTCP の重要な設計原則として、「ミドルボックスが TCP オプションを除去した場合でも通信は継続する」という透過性があります。この MPTCP フォールバックは意図通りの挙動であり、アプリケーションから見れば通常の TCP コネクションとして処理されます。

フォールバックが発生しているかどうかは以下で確認できます。

# フォールバック回数のカウンタ
nstat -az | grep -i fallback

# または
cat /proc/net/netstat | grep -i mptcp | tr ' ' '\n' | grep -A1 Fallback

MPTcpExtMPCapableFallbackACK(サーバー側フォールバック)や MPTcpExtMPCapableFallbackSYNACK のカウントが大きい場合、経路上のいずれかのデバイスが TCP オプションを除去しています。tcpdump で SYN/SYN-ACK の TCP オプションフィールドを確認し、問題のある機器を特定します。

アプリケーション側では、既存の TCP ソケットを持つデーモン(nginx・HAProxy・PostgreSQL など)を MPTCP 対応にするには mptcpize による動的書き換えか、アプリケーション自体を IPPROTO_MPTCPsocket() を呼ぶよう改修する必要があります。カーネルレベルの透過プロキシ設定(iptables / nftables の TPROXY)を使ってトランスペアレントに MPTCP に切り替える手法もありますが、セッション追跡の複雑度が増すため、本番投入前に検証環境で十分な負荷テストを行うことが推奨されます。

切り戻し手順とよくあるトラブルシューティング

MPTCP を無効化して通常 TCP に戻す手順はシンプルです。

# 即時無効化
sysctl -w net.mptcp.enabled=0

# 恒久化ファイルを削除
rm /etc/sysctl.d/99-mptcp.conf
sysctl --system

# エンドポイントの削除
ip mptcp endpoint flush

既存コネクションへの影響については、無効化後に新規確立するコネクションは通常 TCP となりますが、既存の MPTCP コネクションは有効化されたまま継続します。完全に切り離すには対象プロセスの再起動が必要です。

よく見られるトラブルとその対処をまとめます。

  • サブフローが増えない:エンドポイントに subflow フラグが付いているか確認。また ip mptcp limitssubflows 値が 1 のままになっていないかチェック。
  • 接続遅延が増加する:ミドルボックスが SYN パケットの MPTCP オプションを除去して再送を誘発している可能性。フォールバックカウンタと tcpdump を照合して原因デバイスを特定する。
  • ss -M に何も表示されない:アプリケーションが IPPROTO_MPTCP ソケットを使っていない。mptcpizesetsockopt による明示的な指定が必要。
  • RHEL 9 / Rocky 9 で ip mptcp コマンドが見つからない:iproute の バージョンが古い場合は dnf update iproute でアップデートする。

2026 年時点の注意点として、Ubuntu 24.04 LTS(カーネル 6.8)以降では net.mptcp.pm_type パラメータが追加されており、パスマネージャをカーネル内蔵の in-kernel(デフォルト)と userspace(mptcpd)の間で切り替えられます。mptcpd を使う場合は同時に net.mptcp.pm_type=1 を設定しないと、パス管理が二重になり予期しないサブフロー挙動を起こすことがあります。

MPTCP はカーネルへのマージから 6 年以上が経過し、エンタープライズディストリビューションへの搭載も完了した成熟した機能です。単純な sysctl 1 行から始められる反面、エンドポイント管理・ミドルボックス透過性・アプリケーション対応という三つのレイヤーを順番に検証することが、本番での安定稼働につながります。

「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。

ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。

>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)

※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。

PR・広告

Linuxで動かしながら学ぶTCP/IPネットワーク入門(Amazon)

IPアドレス・ルーティング・名前解決などネットワークの基礎をLinux上で手を動かして学べる入門書。

Amazonで見る

※ Amazonのアソシエイトとして、当サイトは適格販売により収入を得ています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次