本日は
アドベントカレンダーの $N=13$ 日目の記事です.
自作パッケージ TerminalSystemMonitor.jl の紹介です.htop
コマンドの機能にある CPU, メモリの使用量を確認できる素朴なパッケージです.
こんなことができます
作成の背景
top
というコマンドがあります.
top – display sorted information about processes
どのようなプロセスが動いているかのような情報を監視することができます.
また htop
というコマンドがあります.CPU,メモリ の使用状況を視覚的に見ることができます.
最近ですと Rust 製による btm
というコマンドがあります.これは top の対義語としての bottom の略だと思われます.
Yet another cross-platform graphical process/system monitor.
インストールの手順は下記の通りです.
btm
コマンドの使い方は htop
とほぼ同じで
$ btm --basic
で htop
ライクな出力を出します.
btm
単体で実行するともう少しリッチな見え方が可能です.
また,watch nvidia-smi
, nvtop
のように NVIDIA の GPU の使用率のモニタリングツールもありますね.
他にも macOS だと mactop
, macmon
などなどあります.これは P, E コア別にCPUの使用状況を確認することができます.
他にありましたら教えてください.
表示上の問題点
htop
は搭載されている CPU のコア数が大きくなると CPU の使用率の視認性が悪化しがちです.
ターミナルのサイズを画面の半分にすると次のようになります.
20 コア 40 スレッドのマシンで htop
を実行し MacBook 16 inch の画面右半分で表示させた場合です.なるほどわからん.btm --basic
だと横幅に関しては視認性が解消されてますが縦方向で短くなると全てのコアの表示を諦めてしまいます.
「とりあえず計算機の CPU 使用率がどうなっているか(並列計算で全てのCPUが100% 使ってるか) メモリ使いすぎておらず OOM にならないか心配」という目的だと若干難儀です.
単純に作りたかった
はい.実は Web 版として Dash.jl を使ったものは作っていました.ターミナル上でシンプルに動く版はなかったのでいつか作るかということで作ってみることにしました.
動かしてみよう
julia> using Pkg; Pkg.add("TerminalSystemMonitor")
julia> using TerminalSystemMonitor; monitor()
これでできます.依存パッケージは Dates.jl UnicodePlots.jl, Term.jl, MLDataDevices.jl という Julia パッケージです.これらは Windows 上でも動くはずなので多くのプラットフォームで動作するようになっています.
またレイアウトもターミナルの横幅のサイズに応じて表示するブロックを縦側に押し付けて全部表示させようと頑張っています.レスポンシブデザインというとカッコいいですね
CPU, メモリ使用量以外の情報(例えばCPU温度,プロセス)は取得の仕方がわからないのでつけてません.
Julia ではマシンの保有するメモリ最大値は libuv
を使って調べています.
libuv 自体は元々は Node.JS を主眼に作られたライブラリのようですが Julia も実は使っているのです.
よって libuv
がサポートしている機能があれば ccall
を使って呼び出すことができます.
NVIDIA GPU の使用率,メモリ消費量をみたい
- 事前に
CUDA.jl
をインストールします. - Julia の TerminalSystemMonitor.jl をロードする前に
using CUDA
を実行しておきます.つまり次のコマンドを実行すればOKです.
julia> using CUDA; using TerminalSystemMonitor; monitor()
下記のようになっていると思います.
取得に用いている情報は CUDA.jl ソースコードを読んで API を探し出して見つけています.よって Julia, CUDA.jl が適切にインストールされているシチュエーションではうまく動作するはずです.
事前に using CUDA
が必要な理由はパッケージエクステンションという機能を用いているからです.CUDA.jl がロードされているとこの機能を使える仕組みにしています.これは必ずしも NVIDIA GPU が載っていないマシンでも動作をさせたいからです.
Apple シリコンののGPUの使用状況を見たい
Julia だと Metal.jl がありますが,やり方わからん!誰かすごい人教えて.現状で最適なツールは macmon
を入れてもうのが良いと思います.
多くのツール,例えば mactop
, asitop
は powermetrics
というルート権限が必要なコマンドを内部で実行しその情報をパースして得ています.macmon は別のアプローチを用いています.CFString
とかを使っているので https://developer.apple.com/documentation/corefoundation を気合を読んで読む必要があります.CoreFoundation に関しては satoshin2071
さんが公開されている gist を読むか Objective C を勉強する必要がありますね.
う~~~~~~~~ 得意な方がいればアドバイスお願いします.
以上