JoyentのSmartOSで各種情報を取得するツールの案内。

ちなみにここで紹介しているツールはbase64の1.8.xで確認、1.7以前のSmartOSには多分無いです。
sm-summaryを叩く
以前はイマイチ環境情報を取りにくかったSmartOSですが、sm-*コマンドの実装により相当扱いやすくなっています。
そのひとつがsm-summary、
$ sm-summary * Gathering SmartMachine summary.. SM UUID 0ec33864-49ce-4674-bf01-976b8e771cdc SM ID 246 Hostname test01.example.com SmartOS build joyent_20120614T001014Z Image base64 1.8.4 Pkgsrc http://pkgsrc.joyent.com/sdc6/2012Q2/x86_64/All Processes 31 Memory (RSS) Cap 1024M Memory (RSS) Used 128M Memory (RSS) Free 896M Swap Cap 1024M Swap Used 101M /tmp Used 12K Disk Quota 31G % Disk Used 13%
準仮想のコンテナにありがちな、リソース上限と現状リソースの相関がつかみにくいといった悩みが結構解消します。
sm-summaryスクリプトの中身
sm-summaryコマンドはただのBashスクリプトなので中身を確認します、
#!/usr/bin/bash
#
# Provides SmartMachine summary of information.
# Joyent 2012.
PATH="/opt/local/bin:/opt/local/gnu/bin:/opt/local/sbin:/usr/bin:/usr/sbin";
echo "* Gathering SmartMachine summary..";
SM_UUID=$(zonename);
SM_ID=$(zoneadm list -p | awk -F: '{ print $1 }');
SM_HOSTNAME=$(hostname);
[[ -f /etc/product ]] && SM_IMAGE=$(cat /etc/product | grep Image | awk '{ print $2 " " $3 }') || SM_IMAGE="NA";
[[ -f /etc/product ]] && SM_IMAGE=${SM_IMAGE:-$(cat /etc/product | grep Dataset | awk '{ print $2 " " $3 }')} || SM_IMAGE="NA";
[[ -f /etc/product ]] && SM_IMAGE=${SM_IMAGE:-NA} || SM_IMAGE="NA";
[[ -f /opt/local/etc/pkg_install.conf ]] && SM_PKGSRC=$(cat /opt/local/etc/pkg_install.conf | awk -F= '{ print $2 }') || SM_PKGSRC="Not installed";
SM_BUILD=$(uname -v);
SM_NPROCS=$(kstat -p -n nprocs_zone_${SM_ID} -s usage | awk '{ print $2 }');
SM_MEMCAP=$(kstat -p -c zone_caps -n lockedmem_zone_${SM_ID} -s value | awk '{print $2/1024/1024 }');
SM_MEMUSED=$(prstat -Z -s rss 1 1 | awk -v zone=${SM_UUID} '$8 ~ zone { printf("%d", $4 ) }');
SM_MEMFREE=$(echo "${SM_MEMCAP}-${SM_MEMUSED}" | bc);
SM_SWAPCAP=$(kstat -p -c zone_caps -n swapresv_zone_${SM_ID} -s value | awk '{ print $2/1024/1024 }');
SM_SWAPUSED=$(kstat -p -c zone_caps -n swapresv_zone_${SM_ID} -s usage | awk '{ printf("%d", $2/1024/1024) }');
SM_TMPUSED=$(du -hs /tmp | awk '{ print $1 }');
SM_DISKQUOTA=$(df -h / | tail -1 | awk '{ print $2 }');
SM_DISKUSED=$(df -P -h / | tail -1 | awk '{ print $5 }');
cat << EOF
SM UUID ${SM_UUID}
SM ID ${SM_ID}
Hostname ${SM_HOSTNAME}
SmartOS build ${SM_BUILD}
Image ${SM_IMAGE}
Pkgsrc ${SM_PKGSRC}
Processes ${SM_NPROCS}
Memory (RSS) Cap ${SM_MEMCAP}M
Memory (RSS) Used ${SM_MEMUSED}M
Memory (RSS) Free ${SM_MEMFREE}M
Swap Cap ${SM_SWAPCAP}M
Swap Used ${SM_SWAPUSED}M
/tmp Used ${SM_TMPUSED}
Disk Quota ${SM_DISKQUOTA}
% Disk Used ${SM_DISKUSED}
EOF
結構泥臭い事をやっているという印象と共に、なるほどこうやって各種情報が取得できるのだなあと実感します。
マシンのUUIDなんかは、zoneadm list -p | awk -F: '{ print $1 }' とすればKVSのような感覚で取得できる。
知ってればできるけど、知らなきゃどうすりゃいいのか全然分からない事のリファレンスにもなって一石二鳥な感じ。
SmartOS
テスト用とはいえ、httpやamqp等いくらかのデーモンを上げていてもMemory (RSS) Used:128Mぽっち。
このリソース効率の良さは上手く活用するとサービスプロバイダ、ユーザともに案外魅力があるものです。
よく見受けられるOSに使われているような感覚の環境構築ではなく、なるべくスマートに使いこなしたいですね。