火曜日, 5月 16, 2017

cgroupを利用して処理ごとに資源を割り振る話


仕事で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
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は初期値では何も動作しないようになっているため、cpusetの値(基本的には環境のフル機能)をusers環境にコピーしています。
cgroupのフォルダは階層型の設定がファイルに仮想的にマッピングされている構造であるため、こうやって無理矢理風にコピーしても、動いちゃいます。
スゴイネー

あとは前回と同じスクリプトをシェルの環境設定に仕込んでください。

.bashrc や .zshrcに

if [ "$PS1" ] ; then
  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に個別に閉じ込められることになりました!
プロセスディスパッチのヒンテングに効果抜群で・・・


・・・という時代は終わりました。
もうパッチもその後継も十分にみなさんに行き渡っていると思います。
いまさらこのパッチが当たる前の世代のカーネルを使っている人はいないでしょう。
すくなくとも、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 件のコメント:

自己紹介

自分の写真
NetRadioDJ ...since 2003, Programer ...since 1994