この回答 で説明されているように、cgroupを使用してプロセスのネットワーク帯域幅を制限しようとしています。しかし、私は彼らが参照している「ファイル」を見つけることができません。 cgroup-binがインストールされたUbuntu12.04LTSを使用しています。 cgroupsは/ sys/fs/cgroupの下に自動的にマウントされますが、次のサブシステムしか表示されません。
$ ls -l /sys/fs/cgroup/
total 0
drwxr-xr-x 3 root root 0 Mar 8 09:51 cpu
drwxr-xr-x 3 root root 0 Mar 8 09:51 cpuacct
drwxr-xr-x 3 root root 0 Mar 8 09:51 devices
drwxr-xr-x 3 root root 0 Mar 8 09:51 freezer
drwxr-xr-x 3 root root 0 Mar 8 09:51 memory
さらに、「net」サブシステムを手動でマウントしようとしましたが、成功しませんでした。
# mkdir -p /sys/fs/cgroup/net
# mount -t cgroup -o net net /sys/fs/cgroup/net/
mount: special device net does not exist
誰か助けてもらえますか?
ネットワークに関連する2つのcgroup、 net_prio (ネットワークトラフィックの優先度を設定)と net_cls (Linuxで識別できるようにパケットにタグを付けるtc
)しか知りません。 。
net_clsの設定方法は、明らかに自動的には行われません。まず、サポートされていることを確認します(私がどのように見つけたかを知るためだけに!):
$ grep CGROUP /boot/config-`uname -r`
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_MEM_RES_CTLR=y
CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y
CONFIG_CGROUP_MEM_RES_CTLR_SWAP_ENABLED=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NET_CLS_CGROUP=m
これは、net_clsがモジュールであり、カーネル(m
)の一部としてコンパイルされていないことを示しています。
モジュールがあることがわかったので、それを探しましょう。
$ find /lib/modules/`uname -r` -iname "*cgroup*"
/lib/modules/3.2.0-38-generic/kernel/net/sched/cls_cgroup.ko
これで、モジュールがcls_cgroupと呼ばれることがわかりました。単に、次のようにロードします。
$ Sudo modprobe cls_cgroup
ホップ完了!それでは、取り付けを行いましょう。取得した情報は、Ubuntu 12.04LTSで提供されるカーネルではかなり正しくありません。これはUbuntuによるものではなく、cgroupsのAPIが変更された可能性があります。以下はカーネルの公式ドキュメントに準拠しているためです。
$ Sudo mkdir /sys/fs/cgroup/net_cls
$ Sudo mount -t cgroup -o net_cls none /sys/fs/cgroup/net_cls
これで、パケットにtc
のタグを付けることができるはずです。
net_prioの場合、プロセスはかなり似ています。ただし、新しいカーネルをインストールする必要があります。 Ubuntu 12.04 LTSは、彼らが呼ぶものをサポートしています LTS Hardware Enablement Stack これは新しいカーネルバージョン3.5を提供します。それをインストールするには:
$ Sudo apt-get install linux-generic-lts-quantal xserver-xorg-lts-quantal
再起動後、Linuxカーネル3.5を使用することになります。上記のgrep
コマンドを使用すると、わずかに異なるリストが返されます。特に、もう1つのモジュールであるCONFIG_NETPRIO_CGROUP=m
があります。上記と同じfind
コマンドを使用してモジュールを再度検索すると、netprio_cgroup
が見つかります。ロードするだけです。
$ Sudo modprobe netprio_cgroup
次に、前と同じように、cgroupをマウントできます。
$ Sudo mkdir /sys/fs/cgroup/net_prio
$ Sudo mount -t cgroup -o net_prio none /sys/fs/cgroup/net_prio
Net_prio cgroupの使用方法については、ドキュメント(最初のリンクを参照)を参照するか、これを参照することもできます Red Hatドキュメント 。
タイトルが示すように、次の再起動時に変更は失われます。
これを永続的にしたい場合は、ファイル/etc/rc.local
を編集し、ディレクトリを作成してcgroupをマウントする上記の手順を追加します。そして、モジュール(使用するモジュールに応じて両方または一方)をファイル/etc/modules
に追加し、新しい行に各名前を追加します。例:
Sudo bash -c "echo cls_cgroup >> /etc/modules"
警告:/etc
の下のファイルを変更するときに、注意しないと、起動プロセスが中断する可能性があります。知識のある人が修理できなかったことは何もありませんが、注意して、自分が何をしようとしているのかを知っているか、友人に助けてもらうほうがよいでしょう。さらに、貴重なデータのバックアップは常に良い考えです!