
tcツールを利用したRockyOSのネットワーク帯域制限
-
2023年6月6日
こんにちは、インフラチームのMです。
今回はLinuxサーバーのネットワークを制限する方法について話してみたいと思います。
オンプレミス環境の同じ内部ネットワーク機器を共有しているサーバーで 、一方が有限なネットワーク資源を多く使用すると、他のサーバーに影響を与える場合があります。
例えば、データベースの移行で大量のデータの複製が行われる場合があります。
ネットワーク制限をかけなければ、運営中の他のサービスに遅延を発生させることがあります。
特に、最近のようにサーバーで10Gネットワークインターフェースを普遍的に使用する場合、さらに問題を起こす可能性があります。
ネットワーク負荷の例
スイッチの最大ネットワーク帯域幅内で通信する場合は、二つのProjectが問題なく通信できます。
しかし、データ移行によりA projectに負荷が発生した場合は、A projectの間に発生するネットワーク負荷によりB projectが影響を受けてしまいます。
解決方法
このような場合、制限をする方法として
- ネットワーク機器の帯域幅を制限
- サーバーからソフトウェアで制限
などがあります。
今回は、上記の2つの中でサーバーから制限する方法について話してみたいと思います。
テスト環境の構成
まず、テスト環境です。
DB1(A project DB1)にサーバーを立て、DB11(New A project DB1)サーバーにネットワークの帯域制限をかけてテストを行います。
環境構築
ClientとServerにtcとiperfツールをインストールします。
クライアント(New A project DB 11) インストールツール
Client (RockyOS 8.6) | yum install iproute-tc |
yum install iperf3 |
サーバー(A project DB 1)インストールツール
Server (RockyOS 8.6) | yum install iperf3 |
TC(Traffic Control)の設定
TCは、ユーザーがネットワークのQueueとQueuingメカニズムを制御できるようにするツールです。
クライアント(New A project DB 11)のネットワーク制限設定
tcのqdisc (queue discipline)を生成
tc qdisc add dev [IFNAME] root handle [ROOT_HANDLE_NO]: htb default 10
[IFNAME] はNICのネーム
[ROOT_HANDLE_NO] はルート qdisc のハンドル番号です。
defaultの後ろの数字に意味は特にありません。
class生成
tc class add dev [IFNAME] parent [ROOT_HANDLE_NO]: classid [ROOT_HANDLE_NO]:[CLASS_NO] htb rate [DATA_RATE]
[CLASS_NO]は新しくtraffic shapingを適用するクラスに付ける番号で、好きな番号を付けて構いません。
[DATA_RATE] は制限をかける 帯域 を表します。
実験
それでは、Client (New A project DB 11) のbond0 interfaceに3Mbitのネットワーク制限をかけてみます。
# tc qdisc add dev bond0 root handle 1:0 htb default 10
# tc class add dev bond0 parent 1:0 classid 1:10 htb rate 3mbit
接続するサーバーを開始します。
Server ( A project DB 1)から実行
iperf3 -s
iperf3サーバーを起動すると下記のようなメッセージが表示されます。
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
clientからサーバーに接続して確認
iperf3 -c server_hostname
Client (New A project DB 11) の出力内容
# iperf3 -c ServerIP
Connecting to host ServerIP, port 5201
[ 5] local ClientIP port 20032 connected to ServerIP port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 729 KBytes 5.97 Mbits/sec 0 57.0 KBytes
[ 5] 1.00-2.00 sec 376 KBytes 3.08 Mbits/sec 0 57.0 KBytes
[ 5] 2.00-3.00 sec 376 KBytes 3.08 Mbits/sec 0 57.0 KBytes
[ 5] 3.00-4.00 sec 376 KBytes 3.08 Mbits/sec 0 57.0 KBytes
[ 5] 4.00-5.00 sec 376 KBytes 3.08 Mbits/sec 0 57.0 KBytes
[ 5] 5.00-6.00 sec 376 KBytes 3.08 Mbits/sec 0 57.0 KBytes
[ 5] 6.00-7.00 sec 376 KBytes 3.08 Mbits/sec 0 57.0 KBytes
[ 5] 7.00-8.00 sec 188 KBytes 1.54 Mbits/sec 0 57.0 KBytes
[ 5] 8.00-8.25 sec 188 KBytes 6.22 Mbits/sec 0 57.0 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-8.25 sec 3.28 MBytes 3.34 Mbits/sec 0 sender
[ 5] 0.00-8.25 sec 0.00 Bytes 0.00 bits/sec receiver
Serverからの確認
Server ( A project DB 1)からはこのように表示されます。
Serverの出力内容
Server listening on 5201
-----------------------------------------------------------
Accepted connection from clientIP, port 20030
[ 5] local ServerIP port 5201 connected to clientIP port 20032
[ ID] Interval Transfer Bitrate
[ 5] 0.00-1.00 sec 342 KBytes 2.80 Mbits/sec
[ 5] 1.00-2.00 sec 352 KBytes 2.88 Mbits/sec
[ 5] 2.00-3.00 sec 354 KBytes 2.90 Mbits/sec
[ 5] 3.00-4.00 sec 354 KBytes 2.90 Mbits/sec
[ 5] 4.00-5.00 sec 354 KBytes 2.90 Mbits/sec
[ 5] 5.00-6.00 sec 351 KBytes 2.87 Mbits/sec
[ 5] 6.00-7.00 sec 354 KBytes 2.90 Mbits/sec
[ 5] 7.00-8.00 sec 354 KBytes 2.90 Mbits/sec
[ 5] 7.00-8.00 sec 354 KBytes 2.90 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate
[ 5] 0.00-8.00 sec 2.85 MBytes 2.99 Mbits/sec receiver
これでネットワークの制限がかかっていることが確認できました。
最後に
今回はTCツールを利用してLinuxのネットワーク帯域制限をする方法について話してみました。
クラウド環境ならあまり気にしない問題も、オンプレミスでは注意しなければならないことが多くありますが、tcやiperfのようなコマンドを使ってみるのも一つの楽しみではないかと思います。