随笔-调试-观察CPU和内存

观察应用CPU、内存使用情况

实时打印(一般用于观察变化)

$xpid=$(pidof gdb);top -p $xpid -b -d 1 | awk '/(^\s*[0-9])/{print strftime("%H:%M:%S",systime()),$0}'

打印应用占用CPU大于阈值的线程

top -H -p $(cat /var/run/$1.pid) -o PPID -d 1 -b -w 512 | awk -F' ' '/(^top)|(^\s*[0-9])/{
            if ($1~/[0-9]/) {
                if ($9 > 90) arr[$1]=$12"["$9"]";
            } else {
                for (i in arr) line=line sep arr[i];
                if (line != "") print $3,line;
                delete arr;line="";
            }
        }'

观察应用内存使用情况(通过/proc采集):

function proc_mem_usage_total() {
    local statm=($(cat /proc/$ppid/statm))
    metric_list+="proc_mem_usage_total{name=\"$proc_name\", pid=\"$ppid\"} $((statm[1]*4))\n"
}

配合prometheus使用观察应用cpu变化情况(通过/proc采集):

function proc_cpu_usage_total() {
    local stat=
    local data=

    stat=$(cat /proc/$ppid/stat)

    # cpu time: utime stime cutime cstime
    data=(${stat#*)})

    # return lables
    metric_list+="proc_cpu_usage_total{name=\"$proc_name\", pid=\"$ppid\"} $((data[11]+data[12]+data[13]+data[14]))\n"
}

function task_cpu_usage_total() {
    local pid=$1
    local stat=
    local name=
    local data=

    stat=$(cat /proc/$ppid/task/$pid/stat)

    # name
    name=${stat%)*}
    name=${name#*\(}

    # cpu time: utime stime cutime cstime
    data=(${stat#*)})

    # return lables
    metric_list+="task_cpu_usage_total{name=\"$name\", pid=\"$pid\"} $((data[11]+data[12]+data[13]+data[14]))\n"
}

观察系统cpu、内存使用最多的应用

一般方式

top -o %CPU
top -o +%MEM

其他方式

查看系统cpu使用最多的应用:

将上面的脚本-p去掉即可

查看系统内存使用最多的应用

watch "ps -eo pid,ppid,cmd,%mem --sort=-%mem | head"
ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' --sort -rsz | head -10 其中rsz是是实际内存

观察进程上下文切换

xpid=$(pidof app);pidstat -p $xpid 1 -wt -h 
posted @ 2024-05-12 19:56  LiYanbin  阅读(8)  评论(0编辑  收藏  举报