tkhrsskの日記

技術ネタなど

/proc/stat から LinuxのCPU使用率を測定するコマンドを作った

LinuxCPU使用率を計測するには、topなどのコマンドが使えますが、 高機能がゆえに、測定コマンド自身が少し重いと感じていました。

単に、CPU使用率を測定したいのであれば、/proc/statを一定間隔で取得することで算出できます。

CプログラムやRubyスクリプトを紹介しているブログもあり、参考になります。

LinuxでCPU利用率を取得する

d.hatena.ne.jp

/proc/stat の値の意味は、naoyaさんの記事も勉強になります。

d.hatena.ne.jp

コマンド cpustat を作りました

個人的に、AMPで動いているシステムでCPU使用率を図りたいケースがあり、 かつ、sarとかも簡単にインストールできない環境だったので、自作しました。

github.com

使い方

使い方は、以下のヘルプ内容の通り。

$ ./cpustat.exe -h
Usage:
  ./cpustat.exe [OPTION]...

Options:
  -d, --delay=SEC      delay-time interval
  -c, --cpumask=MASK   specify cpu-mask
  -a, --accumulation   accumulate each cpus if cpu-mask is specified
  -h, --help           display this help

オプション指定なしであれば、CPU全体の使用率を1秒毎に標準出力します。

./cpustat.exe
delay = 1.000000000 sec
date       time            user% nice%  sys% idle%
2015/07/08 00:10:50.471471 0.51% 0.00% 0.79% 98.26%
2015/07/08 00:10:51.473531 0.00% 0.00% 0.00% 100.00%
2015/07/08 00:10:52.475964 0.00% 0.00% 0.00% 100.00%
2015/07/08 00:10:53.509681 0.00% 0.00% 0.00% 100.00%
2015/07/08 00:10:54.515131 0.00% 0.00% 0.24% 99.75%
( Ctrl + c で終了 )

インターバル変更

オプション -d で、測定周期を変更できます。1秒未満も指定できます。 もちろんオーバーヘッドの割合が大きくなるので精度(?)は落ちると思いますが。

$ ./cpustat.exe -d 0.2
delay = 0.200000000 sec
date       time            user% nice%  sys% idle%
2015/07/08 00:12:24.737498 0.48% 0.00% 0.76% 98.33%
2015/07/08 00:12:24.941880 0.00% 0.00% 1.21% 98.78%
2015/07/08 00:12:25.144380 0.00% 0.00% 0.00% 100.00%
2015/07/08 00:12:25.346361 0.00% 0.00% 0.00% 100.00%

CPUマスク指定

オプション -c で測定対象のCPUのマスク値を指定できます。 例えば、CPU#2とCPU#3を指定する場合は、0x0C (0000 1100)とします。

$ ./cpustat.exe -c 0c
cpumask = c
delay = 1.000000000 sec
cpu# date       time            user% nice%  sys% idle%
cpu2 2015/07/08 00:14:56.836423 0.31% 0.00% 0.63% 98.78%
cpu3 2015/07/08 00:14:56.836807 0.41% 0.00% 0.68% 98.60%
cpu2 2015/07/08 00:14:57.838844 0.00% 0.00% 1.00% 99.00%
cpu3 2015/07/08 00:14:57.839269 0.00% 0.00% 0.00% 100.00%
cpu2 2015/07/08 00:14:58.841128 0.00% 0.00% 0.00% 100.00%
cpu3 2015/07/08 00:14:58.841340 0.00% 0.00% 0.00% 100.00%

CPUマスク指定(累積)

さらに、-aオプションを指定した場合は、 CPUマスク指定した対象CPUの累積値からCPU使用率を算出します。

$ ./cpustat.exe -c 0c -a
cpumask = c
delay = 1.000000000 sec
date       time            user% nice%  sys% idle%
2015/07/08 00:16:04.464295 0.35% 0.00% 0.63% 98.72%
2015/07/08 00:16:05.466384 0.00% 0.00% 0.50% 99.50%
2015/07/08 00:16:06.472750 0.00% 0.00% 0.00% 100.00%
2015/07/08 00:16:07.475505 0.00% 0.00% 0.49% 99.50%

少々荒い作りですが、まぁ割と軽量に動くと思います。満足。

Atomのctags (Symbols View)について

Atom 1.0.0 Windows版をトライしてみました。

前に試した Sublime Text 2 より、導入はスムーズ。
デフォルトで Symbols Viewというプラグインがあり、プロジェクト全体のシンボル検索(Ctrl+Shit+r)ができます。
ctagsの出力結果(tags)を参照しているのですが、ちょっと難あり。

マクロ定義の行ジャンプができない。

ctags -R .でtagsを生成したところ関数とかには飛べるようになりました。
しかし、C言語のマクロ定義(#define HOGEHOGEとか)のシンボルは、ファイルは開くけど定義行までジャンプしてくれないのです。

マクロ定義は、標準で行番号形式で出力されるのですが、対応していない模様。
オプション(--excmd=pattern)で、pattern形式に強制するもまだだめ。
どうもパターンの出力結果が微妙に違うのが問題になっていそう。

SOMEDEF  .\hoge.c    /^#define SOMEDEF   /;" d   file:
main    .\hoge.c    /^int main()$/;"    f

正規表現で検索するなら問題ないはずなので、ちょっと実装をのぞいてみた。

https://github.com/atom/symbols-view/blob/master/lib/symbols-view.coffee#L101

  getTagLine: (tag) ->
    # Remove leading /^ and trailing $/
    pattern = tag.pattern?.replace(/(^^\/\^)|(\$\/$)/g, '').trim()

うーん、強引に行全体マッチだけを使っているようですね。
行番号形式もだめなわけです。

回避方法

以下のオプションを追加して、少し強引に行全体マッチの出力を追加するようにした。

--regex-C=/^[ \t]*#define ([A-Z_][A-Z0-9_]*)/\1/C,constant/
--C-kinds=-d

上記を記述したctags.cnfというファイルを、実行するディレクトリ直下においておけばよさそう。
#defineではじまる定義を定数のシンボルとして読み込んで、マクロ定義は出力対象外にしています。

キーマップ

とりあえずジャンプできるようになったので、下記の内容をkeymap.csonに記述。
※メニューの「ファイル」→「キーマップを開く」で編集画面。

'atom-text-editor':
  'f12': 'symbols-view:go-to-declaration'
  'shift-f12': 'symbols-view:return-from-declaration'

これで、F12でカーソルにあるシンボルの定義場所に移動。
Shift-F12で、元に戻ることができるようになった。

参考

ctagsの説明はこの辺。

Manpage of CTAGS日本語対応版

Windows版Dockerを試してみた。

Ubuntu14.04 LTSで、Dockerをインストールしたところ、1.6が入ったので、 Windows版Dockerもトライしてみた。

Ubuntu 14.04 LTS 準備

公式ページに従って、コマンド一発。 Vagrantで立ち上げていたので、vagrantユーザに権限追加もしておきます。

$ wget -qO- https://get.docker.com/ | sh
$ sudo usermod -aG docker vagrant

docs.docker.com

また、外部(今回の場合 Windows上のクライアント)からdocker操作ができるように、/etc/default/dockerを編集します。

DOCKER_OPTS="-H=tcp://0.0.0.0:4243"

変更したら、再起動しておきましょう。

$ sudo restart docker

Windows 準備

インストールは、Chocolateyを使うのが手っ取り早いです。

> choco install -y docker

環境変数 DOCKER_HOST を指定するか --host or -H オプションを指定することで、docker操作OKです。

> set DOCKER_HOST=tcp://192.168.33.10:4243
> docker run hello-world
> docker --host=tcp://192.168.33.10:4243 run hello-world

Windowsから実施して意味あるか疑問でしたが、DockerfileADDコマンドとかで、Windows上のファイルも転送してくれるので、Windowsメインでファイル編集して、コンテナ動かす人にはいいかも。

<参考>

www.atmarkit.co.jp

dev.classmethod.jp

Linux計測系コマンド

CentOS 7.0 向けインストール手順

dstat

いろいろ統計情報まとめ

$ sudo yum install -y dstat

htop

topの拡張版

$ sudo yum install -y epel-release
$ sudo yum install -y htop

iperf3

ネットワークパフォーマンス測定

$ sudo yum install -y iperf3

sar(sysstat)

sar(System Admin Reporter:システム管理者向けレポーター)

$ sudo yum install -y sysstat
$ sudo systemctl start sysstat
$ sudo systemctl enable sysstat