最近有个多应用部署在一台服务器上,然后要监控各自应用占用的cpu、内存、磁盘io情况的需求。这样的需求来自于,当一台服务器发生故障时,能快速定位是哪个应用导致的类似于cpu或内存过高的情况。
核心思想是找到应用的进程pid,然后用pidstat命令来查资源占用情况。我的应用虽然是各个语言的,但是还好都是supervisor拉起服务器,所以查进程pid只需要用如下命令实现:
supervisorctl status | grep $appid| awk -F' ' '{print $4}' | sed -e 's/,$//' | paste -sd' '
然后查看cpu占用了为:
pidstat -p $1 -u|grep -v Command|grep -v ^$|grep -v Linux|awk '{print $8}
内存:
pidstat -p $1 -r|grep -v Command|grep -v ^$|grep -v Linux|awk '{print $9}'
读写io:
pidstat -p $1 -d|grep -v Command|grep -v ^$|grep -v Linux|awk '{print $5}'
pidstat -p $1 -d|grep -v Command|grep -v ^$|grep -v Linux|awk '{print $6}'
故写下如下脚本:
#!/bin/bash
appid=$1
item=$2
cpu()
{
result=`pidstat -p $1 -u|grep -v Command|grep -v ^$|grep -v Linux|awk '{print $8}'`
echo $result
}
mem()
{
result=`pidstat -p $1 -r|grep -v Command|grep -v ^$|grep -v Linux|awk '{print $9}'`
echo $result
}
readio()
{
result=`pidstat -p $1 -d|grep -v Command|grep -v ^$|grep -v Linux|awk '{print $5}'`
echo $result
}
writeio()
{
result=`pidstat -p $1 -d|grep -v Command|grep -v ^$|grep -v Linux|awk '{print $6}'`
echo $result
}
app_pid=`supervisorctl status | grep $appid| awk -F' ' '{print $4}' | sed -e 's/,$//' | paste -sd' '`
case $item in
cpu)
cpu $app_pid
;;
mem)
mem $app_pid
;;
read)
readio $app_pid
;;
write)
writeio $app_pid
;;
esac