tcツールを利用したRockyOSのネットワーク帯域制限

こんにちは、インフラチームの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のようなコマンドを使ってみるのも一つの楽しみではないかと思います。

ココネでは一緒に働く仲間を募集中です。

ご興味のある方は、ぜひこちらのエンジニア採用サイトをご覧ください。

→ココネ株式会社エンジニアの求人一覧

 

Category

Tag