仕事でcgroupを使用したくなってちょっと調べたのですが、
Googleで調べると、昔こんな記事を書いたことが発覚しました。
当時は動いたのだでしょうが、現代では間違いだらけの動かないポンポコピーなので、
書き直すことにします。
なお当該のパッチは現在でも形を変えて(当時ほど率直ではないものの)残ってはいるので、この対応は全くの無駄です
。
でもgoogleでcgroupの使いかたの日本語記事でこのblogが引っかかるので、訂正しておかなければならないですよね・・・。
まず、Cgroup自体についてはRed Hat社のこの記事がとても詳しいです。
Red Hat Enterprise Linux 6 リソース管理ガイド
なので、私の駄文など読まずに上記のリンクを踏むのが最適解となります。
しかしながら、昔シェルごとにCgroupを作る記事を書いてしまった手前更新して置かなければならないので、更新します。
まず、
現代のディストリビューションではCgroupの資源はすでにmountされているのです。
なので、元の記事でcgroup用のディレクトリを作り、mountしていたが無駄です。
例えばUbuntu 17.04 だと
/sys/fs/cgroup
にすでに基本的な機能を展開済みです。
ファイル操作だけでも設定できるのですが、
誰でも簡単に扱えるようにするためのツールを入れましょう。
sudo aptitude install cgroup-tools以上。
これで、基本的なcgroup制御用のコマンドが使えるようになります。
詳しくは、Red Hatの記事を読んでね。
しかし、今回はあくまでも前回の記事の更新なので、前と同じテイストでも書いておきます。
sudo mkdir -m 0777 /sys/fs/cgroup/cpuset/usersはい、何やってるかというと、cgroupのcpusetというサブセットの中にusersというユーザ用のフォルダをアクセス権全開で作ります。
sudo cp /sys/fs/cgroup/cpuset/cpuset.cpus /sys/fs/cgroup/cpuset/users/
sudo cp /sys/fs/cgroup/cpuset/cpuset.mems /sys/fs/cgroup/cpuset/users/
しかし、cgroupは初期値では何も動作しないようになっているため、cpusetの値(基本的には環境のフル機能)をusers環境にコピーしています。
cgroupのフォルダは階層型の設定がファイルに仮想的にマッピングされている構造であるため、こうやって無理矢理風にコピーしても、動いちゃいます。
スゴイネー
あとは前回と同じスクリプトをシェルの環境設定に仕込んでください。
.bashrc や .zshrcに
if [ "$PS1" ] ; thenと追記すれば、はい、これでシェルから起動したプロセスは毎回cgroupに個別に閉じ込められることになりました!
mkdir -m 0700 /sys/fs/cgroup/cpuset/users/$$
cp /sys/fs/cgroup/cpuset/users/cpuset.cpus /sys/fs/cgroup/cpuset/users/$$/
cp /sys/fs/cgroup/cpuset/users/cpuset.mems /sys/fs/cgroup/cpuset/users/$$/
echo $$ > /sys/fs/cgroup/cpuset/users/$$/tasks
fi
プロセスディスパッチのヒンテングに効果抜群で・・・
・・・という時代は終わりました。
もうパッチもその後継も十分にみなさんに行き渡っていると思います。
いまさらこのパッチが当たる前の世代のカーネルを使っている人はいないでしょう。
すくなくとも、cgroupが使えて、パッチが当たっていない環境は残っていないと思います。
まぁ上記のスクリプトを一部イジることで、アプリの機能を常にCPUの70%までしか使わないようにしたり、CPUにラウンドロビンで割り当てたりと、カスタム自由なので、遊んでみてください。
なお、cgourpに割り当てた資源を
rm -rf /sys/fs/cgroup/cpuset/usersみたいに消そうとすると、権限がなくて失敗します。
仮想なので。
簡単なのは、先程入れたコマンドで、
cgdelete -r cpuset:usersとやると一発です。
でも、どうしてもファイル操作でやりたいひねくれ者のあなた。
そう僕。
そんな人のためにファイル操作でも出来る方法を見つけておきました。
資源のグループごとにrmdirで消すことができます。(盲点だったZE)
rmdir /sys/fs/cgroup/cpuset/users/$$こんな感じ。
rmdir /sys/fs/cgroup/cpuset/users
それでは本当にではでは。
過去の負債を精算する記事でした。
さよなら!
0 件のコメント:
コメントを投稿