cgroupsの状況を確認するコマンドcgrpsを作った

以前のエントリで書いたようにcgroupsの状況を確認するコマンドはあります。

k1low.hatenablog.com

ごく普通のcgroupsの使い方であれば上記エントリにある systemd-cgtop systemd-cglslscgroup などで十分です。

しかし、 たまたまなのですが 私が関わっているプロダクト ではコンテナをフル活用しているためcgroupが大量に作成されることがあり、systemd-cgtop などではなかなか厳しいことになってきていました。

また、同じcgroupパスのサブシステムの状況は「同じグループとして」確認したいという気持ちもありました。

cgrps

というわけで、cgroupsとGoの勉強がてらに cgrps というコマンドを作ってみました。

github.com

img

cgrps は以下のような特徴があります

  • cgroupsの各サブシステム内の同じパス(例えば /sys/fs/cgroup/cpu/my-cgroup-name/sys/fs/cgroup/memory/my-cgroup-name )を同じグループとしてまとめる
  • 状況を確認できることに特化して、cgroupsの操作系はない

使い方

基本的に peco などのフィルタリングコマンドとの併用を想定しています。

例えばあるcgroupで動いているプロセスを確認したいときは

$ cgrps ps $(cgrps ls | peco)

とすると peco でcgroupを絞り込んで確認ができます。

当然、cgroupのパスがわかっていれば

$ cgrps ps /my-cgroup-name

としても確認可能です。

現在は cgrps ls cgrps ps cgrps stat がありますが、今後はそれぞれの機能拡張( cgrps stat も対応サブシステムが少ない )に加えて、 cgrps top が欲しいです。あとJSON出力ですね。

勉強にちょうどいい。

余談

cgroupsはファイルシステム

開発当初は https://github.com/containerd/cgroups を使っていたのですが、表示したいものを作っていくうえで痒いところに手が届かない感じだったので(そもそも使い方が違う)、結局最後は /sys/fs/cgroup 内のファイルを直接見にいく形に変更しました。

CLK_TCK

udzuraさんの便利エントリにもあるように cpuacct.stat の値を秒単位で表示するためには クロック/秒 を知る必要があります。これをcgoを使わずにどうやって取得しようかなと考えたのですが、getconf というコマンドがだいたいのディストリビューションにあることを知って、採用させていただきました。

github.com/shirou/gopsutil ++

RedHatの資料がかなり充実している

ギョーム中にpyamaさんに教えてもらいました。

リソース管理ガイド - Red Hat Customer Portal

ギョーム中もcgrpsを作っている間もずっとにらめっこしてました。

というわけで

なかなか使う機会はないかもしれませんが、cgroupsの勉強などに是非。

ところでcgroupsなのかcgroupなのか。。。