背景
- 定点的にプロセスのメモリを観測したくなりまして。
- AWS の CloudWatch だと割りとゆるっとしか見てくれないのので、もうちょっと細かく RSS や VSS を観測出来ないかな、cron とかで回せないかな、と思いました。
最初
- unixコマンドを叩いて適当に文字列処理しようとしました。
$ ps aux --sort -rss | head -n 10
- が、結構文字列処理がつらそうだなと思いました。(多分
split("\n")
とかでだいぶ苦しい感じになると踏みました)
$ ps aux --sort -rss | head -n 10
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
mysql 1613 0.3 8.4 798092 163160 ? Sl 00:30 4:13 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/lib/mysql/jector.err --pid-file=/var/lib/mysql/jector.pid
vagrant 21628 0.4 4.9 287652 94972 pts/4 Sl+ 18:25 0:02 pry
td-agent 1991 0.2 2.6 261276 51700 ? Sl 00:30 2:43 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
root 1196 0.0 2.0 302396 40156 ? Ssl 00:30 0:11 /usr/sbin/glusterfs -s localhost --volfile-id gluster/nfs -p /var/lib/glusterd/nfs/run/nfs.pid -l /var/log/glusterfs/nfs.log -S /var/run/35bbdec0a200d158d8636306460640b8.socket
mongod 1756 2.1 1.8 696480 35336 ? Sl 00:30 23:33 /usr/bin/mongod -f /etc/mongod.conf
td-agent 1988 0.0 1.3 219528 25512 ? Sl 00:30 0:00 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
root 1309 0.0 1.2 297900 23204 ? Ssl 00:30 0:10 /usr/sbin/glusterfs --acl --volfile-id=/ms2_devel --volfile-server=localnode /mnt/ms2_devel
root 1192 0.0 0.5 415384 10308 ? Ssl 00:30 0:11 /usr/sbin/glusterfsd -s localnode --volfile-id ms2_devel.localnode.bricks-sdb1-ms2_devel -p /var/lib/glusterd/vols/ms2_devel/run/localnode-bricks-sdb1-ms2_devel.pid -S /var/run/70575b79a080da8a80cedca77106b5f8.socket --brick-name /bricks/sdb1/ms2_devel -l /var/log/glusterfs/bricks/bricks-sdb1-ms2_devel.log --xlator-option *-posix.glusterd-uuid=b6854102-97d8-41f8-8cbc-92a2a2f93334 --brick-port 49152 --xlator-option ms2_devel-server.listen-port=49152
vagrant 21470 0.0 0.4 150756 9148 pts/6 S+ 17:59 0:00 vim .
その後
- いい感じにプロセスの結果パースしてくれるの無いかなって探してみたら、見事にありました
- 以下のようにすると消費メモリtop10の情報を拾ってくる
> require 'sys/proctable'
> Sys::ProcTable.ps.sort_by!(&:rss).reverse.first(10)
# =>
=> [#<struct Struct::ProcTableStruct
cmdline="spring app | ikemen-rails-app | started 1 hour ago | development mode",
cwd="/home/vagrant/github/ncb-mds",
environ=
{"RBENV_VERSION"=>"2.2.2",
"HOSTNAME"=>"jector",
"SHELL"=>"/bin/bash",
"TERM"=>"screen",
"HISTSIZE"=>"1000",
"MAILCATCHER"=>"1",
"SSH_CLIENT"=>"10.0.2.2 58800 22",
"SSH_TTY"=>"/dev/pts/0",
"USER"=>"vagrant",
"LS_COLORS"=>"rs",
"RBENV_ROOT"=>"/usr/local/rbenv",
"SSH_AUTH_SOCK"=>"/tmp/ssh-LztcP11344/agent.11344",
"RBENV_HOOK_PATH"=>":/usr/local/rbenv/rbenv.d:/usr/local/etc/rbenv.d:/etc/rbenv.d:/usr/lib/rbenv/hooks",
"TMUX"=>"/tmp/tmux-500/default,11439,0",
"MAIL"=>"/var/spool/mail/vagrant",
"MAVEN_HOME"=>"/usr/share/apache-maven",
"PATH"=>
# (略)
余談
unixコマンドにおけるrespond_to?
的なやつ
- スクリプト作成してる時に副次的に知ったのですが、
require 'mkmf'
とかいうのをやって以下のようにすると、コマンドが実行可能か判断できます(ikemen
コマンドなど存在するはずがない) - 実行できないなら
nil
が返ってきます
> require 'mkmf'
> find_executable("ikemen")
checking for ikemen... no
=> nil
> find_executable("ls")
checking for ls... yes
=> "/bin/ls"
このGemの作者について
- やたらとWindows上で ruby を動かすことに熱意を燃やしている凄い人ですね
僕はやりたくない...