GNU time にパッチが当たってるか確認する方法

皆さん「このプログラム動かしたらどのくらいメモリ/CPU使うか調べといて、今日中にね。」て言われることよくありますよね。そんな場合に備えること書きます。なおこれは架空のタスクであり実在する(略

● 使用メモリを調べる
常駐してるようなプログラムなら、ps とか free とか dstat とか /proc/(PID)/status とか /proc/meminfo とか、好きに使えればいいよ、うん。そうじゃなくて、プログラム動かしたらすぐに終わるような場合でしかもいつ最大使用メモリなのかわからない場合はめんどいです。そんなあなたにお勧めなのが GNU time。timeというとbash組み込みtimeがメジャーですが、たいていのデストリで /usr/bin/time あたりに入ってるこれを使えば、処理にかかった時間だけじゃなくて使用したメモリとかもわかります。うん今回の用途にピッタリ。

しかし、ググればすぐに出てくるGNU timeのバグを見てみんな驚きとまどう。「え?このデストリに入ってる /usr/bin/time は直ってるの?直ってないの?」/usr/bin/time -V すると 1.7 と出る。うんだって GNU time って v1.7からバージョンあがってない(2016.09.21時点)もん。バージョン見てもマニュアル見てもパッチ当たってるか書いてない。うわぁん、出てきた数字そのままでいいのか4で割れば(4KBページサイズなCPUの場合)いいのかわからないよー(AA略

● Ubuntuの場合
trusty(14.04LTS)の場合、このへんのページにいってtime_1.7-24.debian.tar.gzをダウンロードしてきて解凍して中身を見ればよい。こんなパッチが当たってる。
- bug-address.patch
- configure.patch
- info-direntry.patch
- info-nav.patch
- non-normal-exit.patch
- quiet.patch
- ru_maxrss.patch
- rusage-portability.patch
「ru_maxrss.patch」が目的のパッチでした。time_1.7-24 なら 4で割る必要がないようです。

● CentOSの場合
time-1.7-38.el6.src.rpm を 例えばこのへんからDLしてきてRPMを解凍する。
$ rpm2cpio time-1.7-38.el6.src.rpm |cpio -idv
するとこんなパッチが出てくる。
- time-1.7-destdir.patch
- time-1.7-ru_maxrss-is-in-kilobytes-on-Linux.patch
- time-1.7-verbose.patch
「time-1.7-ru_maxrss-is-in-kilobytes-on-Linux.patch」が目的のパッチでした。time-1.7-38 なら 4で割る必要がないようです。ちなみに、CentOSはRHELのクローンなのでID:702826でトラックされてるようです。

● わからない場合
バージョン古かったりバージョンわからなかったりしてソースファイル類にだ取りつけない場合、実際に動かして比較してみるという手がある。
$ curl -O -L http://ftp.gnu.org/gnu/time/time-1.7.tar.gz
$ cd time-1.7
$ ./configure
$ make
$ TIME="%M" ./time -v ls
$ TIME="%M" /usr/bin/time -v ls
同じならパッチが当たっていない=4で割る必要がある、異なったら(ちょうど4分の1)パッチが当たっている、と判断できる。うん同じものを同じように動かしてみると確実でわかりやすい。ちなみにクロスビルドの場合、ac_cv_func_wait3=yesをつけないとメモリ他が取れない側(HAVE_WAIT3)の #ifdef になっちゃうようです、ぐぬぬ・・・
$ ac_cv_func_wait3=yes ./configure

● GNU time がやってること
wait3(2)で struct rusage* をもらってきてそれの ru_maxrss を出してます。・・・うんシンプル。getrusage(2)でも同じのが取れますが、こっちだと「いつ最大になったか」がわからんので、プロセス終了した後 wait3 で、もしくはプロセスが終了した後waitするまでの間の /proc/(PID)/status の VmHWM、ということになります。

というわけで、決して「それなら***すれば一発でわかりますよ」とか答えないようにしましょう。いろんな条件の組み合わせで繰り返しテストさせられることうけあいなのですよ。

このブログ記事について

このページは、らるるが2016年9月21日 01:02に書いたブログ記事です。

ひとつ前のブログ記事は「Linuxスケジューラ」です。

次のブログ記事は「思いの外オープンソースな社会になったもんだ」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

ウェブページ

Powered by Movable Type 7.9.0