Trickle を使用して Linux システムでアプリケーションが使用するネットワーク帯域幅を制限する方法
1 つのアプリケーションがすべてのネットワーク帯域幅を独占する状況に遭遇したことがありますか? 1 つのアプリケーションがすべてのトラフィックを消費する状況に陥ったことがある場合は、トリクル帯域幅シェーパー アプリケーションの役割を高く評価するでしょう。
あなたはシステム管理者でも、単なるLinux ユーザーでも、ネットワーク帯域幅が消費されないようにアプリケーションのアップロード速度とダウンロード速度を制御する方法を学ぶ必要があります。単一のアプリケーションで。
トリクルとは何ですか?
Trickle は、アプリケーションのアップロード速度とダウンロード速度を管理できるネットワーク帯域幅シェーパー ツールで、単一のアプリケーションが利用可能な帯域幅のすべて (またはほとんど) を占有することを防ぎます。
簡単に言うと、トリクルを使用すると、ユーザーごとの制御とは対照的に、アプリケーションごとにネットワーク トラフィック レートを制御できます。これは、クライアント/サーバー環境における帯域幅シェーピングの典型的な例であり、おそらく私たちが好む設定です。に精通。
トリクルはどのように機能するのでしょうか?
さらに、トリクルはアプリケーションごとに優先順位を定義するのに役立ちます。これにより、システム全体に全体的な制限が設定されている場合でも、優先順位の高いアプリケーションは自動的にさらに多くの帯域幅を取得できます。
このタスクを達成するために、トリクルは、TCP 接続を使用してソケットとの間でデータを送受信する方法にトラフィック制限を設定します。データ転送速度以外は、トリクルはその時点で形成しているプロセスの動作を一切変更しないことに注意する必要があります。
トリクルにできないことは何ですか?
いわば唯一の制限は、トリクルは動的リンクと読み込みを使用して配置するため、SUID または SGID ビットが設定された静的にリンクされたアプリケーションまたはバイナリでは動作しないことです。整形されたプロセスとそれに関連付けられたネットワーク ソケットの間に存在します。 Trickle は、これら 2 つのソフトウェア コンポーネント間のプロキシとして機能します。
トリクルは実行するためにスーパーユーザー権限を必要としないため、ユーザーは独自のトラフィック制限を設定できます。これは望ましくない可能性があるため、システム ユーザーが超えられない全体的な制限を設定する方法を検討します。言い換えれば、ユーザーは引き続き自分のトラフィック レートを管理できますが、常にシステム管理者が設定した境界内に収まります。
テスト環境
この記事では、Linux サーバーでアプリケーションが使用するネットワーク帯域幅をトリクルで制限する方法を説明します。
必要なトラフィックを生成するには、クライアント (CentOS) で ncftpput と ncftpget を使用します (どちらのツールも ncftp をインストールすると利用可能になります) サーバー – dev1: 192.168.0.17)、サーバー上の vsftpd (Debian – dev2: 192.168.0.15) )デモンストレーション目的。同じ手順はRedHat、Fedora、および Ubuntu ベースのシステムでも機能します。
Linux への ncftp と vsftpd のインストール
1。 RHEL/CentOS 8/7 の場合は、EPEL リポジトリを有効にします。 Enterprise Linux 用の追加パッケージ (EPEL) は、Fedora プロジェクトによって維持されている高品質の無料オープンソース ソフトウェアのリポジトリであり、Red Hat Enterprise などのスピンオフ製品と 100% 互換性があります。 Linux とCentOS。 trickle と ncftp はどちらもこのリポジトリから利用できます。
2。次のように ncftp をインストールします。
yum update && sudo yum install ncftp [On RedHat based systems]
aptitude update && aptitude install ncftp [On Debian based systems]
3 。 FTPサーバーを別のサーバーにセットアップします。 FTP は本質的に安全ではありませんが、ファイルのアップロードまたはダウンロードにおけるセキュリティが必要ない場合には依然として広く使用されていることに注意してください。
この記事でこれを使用しているのは、トリクルの恩恵を説明するためであり、 クライアント上の標準出力で転送レートが表示されるためです。これを別の目的で使用する必要があるかどうかについての議論は省略します。日時。
yum update && yum install vsftpd [On RedHat based systems]
apt update && apt install vsftpd [On Debian based systems]
次に、FTP サーバー上の /etc/vsftpd/vsftpd.conf ファイルを次のように編集します。
sudo nano /etc/vsftpd/vsftpd.conf
OR
sudo /etc/vsftpd.conf
次の変更を加えます。
anonymous_enable=NO
local_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
その後、現在のセッションで vsftpd を起動し、今後の起動時に自動的に起動できるように有効にしてください。
systemctl start vsftpd [For systemd-based systems]
systemctl enable vsftpd
service vsftpd start [For init-based systems]
chkconfig vsftpd on
4 。リモート アクセス用に SSH キーを使用して CentOS/RHEL ドロップレットに FTP サーバーをセットアップすることを選択した場合は、適切なディレクトリとパスワードで保護されたユーザー アカウントが必要になります。ルートのホーム ディレクトリの外で目的のコンテンツをアップロードおよびダウンロードするためのファイル アクセス許可。
ブラウザに次の URL を入力すると、ホーム ディレクトリを参照できます。ログイン ウィンドウがポップアップ表示され、FTP サーバー上の有効なユーザー アカウントとパスワードの入力を求められます。
ftp://192.168.0.15
認証が成功すると、ホーム ディレクトリの内容が表示されます。このチュートリアルの後半では、そのページを更新して、前の手順でアップロードされたファイルを表示できるようになります。
Linux に Trickle をインストールする方法
次に、yum または apt を使用して trickle をインストールします。
インストールを確実に成功させるには、ツール自体をインストールする前に、現在インストールされているパッケージが最新であることを (yum update を使用して) 確認することをお勧めします。
yum -y update && yum install trickle [On RedHat based systems]
apt -y update && apt install trickle [On Debian based systems]
trickle が目的のバイナリで動作するかどうかを確認します。前に説明したように、トリクルは動的ライブラリまたは共有ライブラリを使用するバイナリでのみ機能します。このツールを特定のアプリケーションで使用できるかどうかを確認するには、よく知られているlddユーティリティを使用できます。ここで、lddはリスト動的依存関係を表します。
具体的には、特定のプログラムの動的依存関係のリストでglibc (GNU C ライブラリ) の存在を探します。ソケットを介した通信に関係するシステム コールを定義するのはまさにこのライブラリだからです。
特定のバイナリに対して次のコマンドを実行して、トリクルを使用して帯域幅を形成できるかどうかを確認します。
ldd $(which [binary]) | grep libc.so
例えば、
ldd $(which ncftp) | grep libc.so
その出力は次のとおりです。
libc.so.6 => /lib64/libc.so.6 (0x00007efff2e6c000)
出力内の括弧で囲まれた文字列は、物理メモリ内のライブラリのロード アドレスを表すため、システムごとに、さらには同じコマンドの後続の実行間でも変化する可能性があります。
上記のコマンドが結果を返さない場合は、実行対象のバイナリがlibc を使用していないことを意味するため、その場合にはトリクルを帯域幅シェーパーとして使用できません。
Linux で Trickle を使用する方法を学ぶ
trickle の最も基本的な使用法はスタンドアロン モードです。このアプローチでは、トリクルを使用して、特定のアプリケーションのダウンロード速度とアップロード速度を明示的に定義します。前に説明したように、簡潔にするために、ダウンロード テストとアップロード テストに同じアプリケーションを使用します。
スタンドアロン モードで Trickle を実行する
トリクルを使用した場合と使用しない場合のダウンロードとアップロードの速度を比較します。 -d
オプションはダウンロード速度を KB/s 単位で示し、-u
フラグはアップロード速度を同じ単位で制限するよう trickle に指示します。さらに、-s
フラグを使用します。これは、トリクルがスタンドアロン モードで実行されるように指定します。
スタンドアロン モードで trickle を実行するための基本的な構文は次のとおりです。
trickle -s -d [download rate in KB/s] -u [upload rate in KB/s]
次の例を自分で実行するには、trickle と ncftp がクライアント マシン (私の場合は 192.168.0.17) にインストールされていることを確認してください。場合)。
例 1: トリクルありとなしの 2.8 MB PDF ファイルをアップロードします。
次のテストでは、無料配布可能なLinux Fundamentals PDF ファイル (ここから入手可能) を使用します。
最初に、次のコマンドを使用して、このファイルを現在の作業ディレクトリにダウンロードできます。
wget http://linux-training.be/files/books/LinuxFun.pdf
トリクルなしでファイルを FTP サーバーにアップロードするための構文は次のとおりです。
ncftpput -u username -p password 192.168.0.15 /remote_directory local-filename
ここで、/remote_directory はユーザー名のホームを基準としたアップロード ディレクトリのパスで、local-filename は現在の作業ディレクトリ内のファイルです。
具体的には、トリクルがなければ、52.02 MB/秒のピークアップロード速度が得られ (これは実際の平均アップロード速度ではなく、瞬時の開始ピークであることに注意してください)、ファイルはほぼ瞬時にアップロードされます。
ncftpput -u username -p password 192.168.0.15 /testdir LinuxFun.pdf
出力:
LinuxFun.pdf: 2.79 MB 52.02 MB/s
トリクルでは、 アップロード転送速度を 5 KB/s に制限します。ファイルを 2 回目にアップロードする前に、宛先ディレクトリからファイルを削除する必要があります。それ以外の場合、ncftp は、宛先ディレクトリにあるファイルがアップロードしようとしているファイルと同じであることを通知し、転送は実行されません。
rm /absolute/path/to/destination/directory/LinuxFun.pdf
それから :
trickle -s -u 5 ncftpput -u username -p password 111.111.111.111 /testdir LinuxFun.pdf
出力:
LinuxFun.pdf: 2.79 MB 4.94 kB/s
上の例では、平均アップロード速度が約 5 KB/ 秒に低下していることがわかります。
例 2: 同じ 2.8 MB PDF ファイルをトリクルありとなしでダウンロードする
まず、元のソース ディレクトリから PDF を削除することを忘れないでください。
rm /absolute/path/to/source/directory/LinuxFun.pdf
次の場合、リモート ファイルがクライアント マシンの現在のディレクトリにダウンロードされることに注意してください。この事実は、FTP サーバーの IP アドレスの後に表示されるピリオド (「.」) によって示されます。
滴下なし:
ncftpget -u username -p password 111.111.111.111 . /testdir/LinuxFun.pdf
出力:
LinuxFun.pdf: 2.79 MB 260.53 MB/s
トリクルを使用すると、ダウンロード速度が 20 KB/s に制限されます。
trickle -s -d 30 ncftpget -u username -p password 111.111.111.111 . /testdir/LinuxFun.pdf
出力:
LinuxFun.pdf: 2.79 MB 17.76 kB/s
監視付き [非管理] モードでの Trickle の実行
Trickle は、/etc/tricled.conf で定義された一連のパラメータに従ってアンマネージ モードで実行することもできます。このファイルは、trickle (デーモン) がどのように動作し、trickle を管理するかを定義します。
さらに、すべてのアプリケーションで全体的に使用されるグローバル設定を設定したい場合は、trickle コマンドを使用する必要があります。このコマンドはデーモンを実行し、毎回制限を指定する必要なく、トリクルを通じて実行されるすべてのアプリケーションで共有されるダウンロードおよびアップロードの制限を定義できるようにします。
たとえば、次のように実行します。
trickled -d 50 -u 10
これにより、トリクルを介して実行されるアプリケーションのダウンロード速度とアップロード速度がそれぞれ 30 KB/s と 10 KB/s に制限されます。
trickle が実行されているかどうか、またどのような引数を使用しているかをいつでも確認できることに注意してください。
ps -ef | grep trickled | grep -v grep
出力:
root 16475 1 0 Dec24 ? 00:00:04 trickled -d 50 -u 10
例 3: トリクルありとなしを使用して、19 MB の mp4 ファイルを FTP サーバーにアップロードします。
この例では、自由に配布可能な「He is the Gift」ビデオを使用します。このビデオはこのリンクからダウンロードできます。
まず、次のコマンドを使用して、このファイルを現在の作業ディレクトリにダウンロードします。
wget http://media2.ldscdn.org/assets/missionary/our-people-2014/2014-00-1460-he-is-the-gift-360p-eng.mp4
まず、上記のコマンドを使用して trickle デーモンを起動します。
trickled -d 30 -u 10
滴下なし:
ncftpput -u username -p password 192.168.0.15 /testdir 2014-00-1460-he-is-the-gift-360p-eng.mp4
出力:
2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 MB 36.31 MB/s
チョロチョロと:
trickle ncftpput -u username -p password 192.168.0.15 /testdir 2014-00-1460-he-is-the-gift-360p-eng.mp4
出力:
2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 MB 9.51 kB/s
上記の出力からわかるように、アップロード転送速度は約 10 KB/ 秒に低下しました。
例 4: トリクルありとなしで同じビデオをダウンロードする
例 2 と同様に、ファイルを現在の作業ディレクトリにダウンロードします。
滴下なし:
ncftpget -u username -p password 192.168.0.15 . /testdir/2014-00-1460-he-is-the-gift-360p-eng.mp4
出力:
2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 MB 108.34 MB/s
チョロチョロと:
trickle ncftpget -u username -p password 111.111.111.111 . /testdir/2014-00-1460-he-is-the-gift-360p-eng.mp4
出力:
2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 MB 29.28 kB/s
これは、以前に設定したダウンロード制限 (30 KB/秒) に準拠しています。
注: デーモンが開始されたら、トリクルを使用するアプリケーションごとに個別の制限を設定する必要はありません。
前述したように、trickle.conf を通じて trickle の帯域幅シェーピングをさらにカスタマイズできます。このファイルの一般的なセクションは次で構成されます。
[service]
Priority = <value>
Time-Smoothing = <value>
Length-Smoothing = <value>
どこ、
- [サービス] は、帯域幅使用量を調整するアプリケーションの名前を示します。
- 優先度 を使用すると、サービスが他のサービスよりも高い優先度を持つように指定できるため、単一のアプリケーションがデーモンが管理するすべての帯域幅を独占することがなくなります。数値が小さいほど、[サービス] に割り当てられる帯域幅が増加します。
- 時間平滑化 [秒単位]: アプリケーションがデータの転送や受信を試行する時間間隔を定義します。小さい値 (0.1 ~ 1 秒の範囲) は対話型アプリケーションに最適で、より連続した (スムーズな) セッションが得られます。一方、わずかに大きい値 (1 ~ 10 秒) は、一括転送が必要なアプリケーションに適しています。値が指定されていない場合は、デフォルト (5 秒) が使用されます。
- 長さ平滑化 [KB 単位]: 考え方は時間平滑化と同じですが、I/O 操作の長さに基づいています。値が指定されていない場合は、デフォルト (10 KB) が使用されます。
スムージング値を変更すると、固定値ではなく一定間隔内の転送レートを使用して、[サービス] で指定されたアプリケーションに変換されます。残念ながら、この間隔の下限と上限は主にそれぞれの特定のケース シナリオに依存するため、計算する公式はありません。
以下は、CentOS 7 クライアント (192.168.0.17) の trickled.conf サンプル ファイルです。
[ssh]
Priority = 1
Time-Smoothing = 0.1
Length-Smoothing = 2
[ftp]
Priority = 2
Time-Smoothing = 1
Length-Smoothing = 3
この設定を使用すると、trickle は FTP 転送よりも SSH 接続を優先します。 SSH などの対話型プロセスではより小さい時間平滑化値が使用されるのに対し、大量データ転送 (FTP) を実行するサービスではより大きな値が使用されることに注意してください。
平滑化値は、前の例のダウンロード速度とアップロード速度が、トリクル デーモンによって指定された正確な値と一致しないものの、それに近い間隔で変化する原因となっています。
結論
この記事では、Fedora ベースのディストリビューションおよび Debian/派生製品でトリクルを使用してアプリケーションが使用する帯域幅を制限する方法を検討しました。その他に考えられる使用例としては次のようなものがありますが、これらに限定されません。
- たとえば、wget などのシステム ユーティリティや torrent クライアントを介してダウンロード速度を制限します。
- パッケージ管理システムである「yum」(Debian ベースのシステムの場合は「aptitude」)を介してシステムを更新できる速度を制限します。
- サーバーがプロキシまたはファイアウォールの内側にある場合(またはプロキシまたはファイアウォール自体)、トリクルを使用して、ダウンロードとアップロードの両方、またはクライアントまたは外部との通信速度に制限を設定できます。
質問やコメントも大歓迎です。下記のフォームをご利用の上、お気軽にお送りください。