のぴぴのメモ

自分用のLinuxとかの技術メモ

Linux /proc/meminfoの統計情報を取得する。

/proc/meminfoの統計情報を取得する

 Linuxのメモリ挙動を詳しく分析するためには/proc/meminfoを見る必要がある。がしかし、sarコマンドのように時系列でmeminfo情報を取得してくれるコマンドはなく、自作のスクリプトなどで取得するしかない。  

そこで、スクリプトで/proc/meminfo情報を時系列で取得する方法を説明する。

  • 2013.3.4 awkコマンド修正(ヘッダ末尾のリターンコード忘れてた)

コマンドで取得する(テストなどの秒間隔での取得)

ざっくりいうと、meminfoをawkCSV形式に整形してログファイルに追加でリダイレクトするコマンドを、wlile分で無限ループさせているだけ。終了する場合は、CTRL+Cで強制終了させる。

LANG=C;( awk 'BEGIN{ printf "\"DATE\",\"TIME\""} {printf ",\"%s(%s)\"",$1,$3} END{printf "\n"}' /proc/meminfo > meminfo.csv ); while true;do ( awk 'BEGIN{ printf strftime("%Y/%m/%d, %H:%M:%S") } {printf ",%d",$2} END{printf "\n"}' /proc/meminfo >> meminfo.csv );sleep 1; done

これを動かすと、こんな結果が取得される。

"DATE","TIME","MemTotal:(kB)","MemFree:(kB)","Buffers:(kB)","Cached:(kB)","SwapCached:(kB)","Active:(kB)","Inactive:(kB)","Active(anon):(kB)","Inactive(anon):(kB)","Active(file):(kB)","Inactive(file):(kB)","Unevictable:(kB)","Mlocked:(kB)","SwapTotal:(kB)","SwapFree:(kB)","Dirty:(kB)","Writeback:(kB)","AnonPages:(kB)","Mapped:(kB)","Shmem:(kB)","Slab:(kB)","SReclaimable:(kB)","SUnreclaim:(kB)","KernelStack:(kB)","PageTables:(kB)","NFS_Unstable:(kB)","Bounce:(kB)","WritebackTmp:(kB)","CommitLimit:(kB)","Committed_AS:(kB)","VmallocTotal:(kB)","VmallocUsed:(kB)","VmallocChunk:(kB)","HardwareCorrupted:(kB)","AnonHugePages:(kB)","HugePages_Total:()","HugePages_Free:()","HugePages_Rsvd:()","HugePages_Surp:()","Hugepagesize:(kB)","DirectMap4k:(kB)","DirectMap2M:(kB)"
2013/03/03, 23:58:48,2054984,1161012,99012,605416,0,282204,439192,17128,8,265076,439184,0,0,4128760,4128760,8,0,16960,15536,172,132568,77788,54780,808,4056,0,0,0,5156252,140192,34359738367,274388,34359451196,0,0,0,0,0,0,2048,8192,2088960
2013/03/03, 23:58:49,2054984,1160996,99012,605412,0,282176,439192,17104,8,265072,439184,0,0,4128760,4128760,8,0,16976,15576,172,132580,77792,54788,816,4036,0,0,0,5156252,140192,34359738367,274388,34359451196,0,0,0,0,0,0,2048,8192,2088960
2013/03/03, 23:58:50,2054984,1160996,99020,605412,0,282176,439200,17104,8,265072,439192,0,0,4128760,4128760,20,0,16976,15576,172,132580,77792,54788,816,4036,0,0,0,5156252,140192,34359738367,274388,34359451196,0,0,0,0,0,0,2048,8192,2088960
2013/03/03, 23:58:51,2054984,1160996,99020,605412,0,282216,439200,17144,8,265072,439192,0,0,4128760,4128760,20,0,16972,15576,172,132580,77792,54788,816,4036,0,0,0,5156252,140192,34359738367,274388,34359451196,0,0,0,0,0,0,2048,8192,2088960

cronで取得する(日/週/月単位のトレンド取得)

長期のトレンドを見たい場合は、cronで分以上の間隔で取得するのが良い。

取得用のシェル

  • /usr/lib64/sa/meminfo.sh
#!/bin/bash
LANG=C
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:
export LANG PATH
umask 022

LOGFILE_BASE="/var/log/sa/meminfo"
LOGFILE="${LOGFILE_BASE}.`date +%Y%m%d`"

# Write header, if LOGFILE does not exist.
if [ ! -f ${LOGFILE} ]; then
    awk '
        BEGIN{
            printf "\"DATE\",\"TIME\""
        }
        {
            printf ",\"%s(%s)\"",$1,$3
        }
        END{
            printf "\n"
        }' /proc/meminfo > ${LOGFILE}

    fi

# Write data
awk '
        BEGIN{
            printf strftime("%Y/%M/%d, %H:%M:%S")
        }
        {
            printf ",%d",$2
        }
        END{
            printf "\n"
        }' /proc/meminfo >> ${LOGFILE}

exit 0

シェルをキックするcron設定

1分間隔で取得する。

  • /etc/cron.d/meminfo
# Get meminfo.
* * * * * root /usr/lib64/sa/meminfo  > /dev/null 2>&1

ログのローテーションは。。。別に考えよう(^^;