• 正文
    • 腳本內容:
    • 最終效果
    • 結語
  • 相關推薦
申請入駐 產業(yè)圖譜

分享自己做的一個指定進程以及線程長時間cpu監(jiān)控的工具

02/14 09:16
185
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

前面給大家分享過一個工作中用到的編譯拷貝腳本,其實工作中還有一些其他工具的使用,今天再來分享一個自己純手工的CPU監(jiān)控的腳本。大家可以結合上篇文章與本篇文章一起學習shell。

主要實現(xiàn)功能:

    1.監(jiān)控指定進程是否運行2.讀取該進程所在當前CPU的占用率,5s一次的執(zhí)行頻率計算當前進程 5分鐘 10分鐘 15分鐘的平均cpu占用率3.計算該進程下用PID排序的前十個線程的 5分鐘 10分鐘 15分鐘的平均cpu占用率

歡迎關注微信公眾號:羽林君,或者添加作者個人微信:become_me

情節(jié)介紹:

在工作中,我們會對調試的進程以及線程進行性能分析并進行調優(yōu),通常我們使用linux下很多的工具包例如,perf 性能分析工具,以及剖析工具 GNU profiler(gprof 可以為 Linux平臺上的程序精確分析性能瓶頸。gprof精確地給出函數(shù)被調用的時間和次數(shù),給出函數(shù)調用關系)。

當然現(xiàn)在運維以及自動駕駛里面工作對性能分析工具熟悉也要很多要求,舉例展示一個自動駕駛相關的系統(tǒng)工程師需要掌握的一些性能分析工具,包含speccpu、fio、iperf、stream、mlc、lmbench、erf、emon/Vtune等工具及相關調優(yōu)手段,以后有時間再給大家一一介紹這些使用的性能分析工具。

今天呢,沒有過多描述這些工具,因為我遇到的情況是沒有這些工具,所以為了實現(xiàn)一個進程監(jiān)控,我自己寫了一個腳本,今天主要給大家分享,如果你工作中,需要一個性能監(jiān)控的要求,但是你使用的環(huán)境中沒有這些工具,此外你的環(huán)境支持shell腳本,那么這篇文章應該對你有所幫助。

好了,言歸正傳,接下來我給大家分享我寫這些腳本使用的技術,以及最終實現(xiàn)的情況。

下圖是腳本執(zhí)行的流程圖:

腳本內容:

#!/bin/bash

#一共11個數(shù)據(jù)?第0個是總的cpu計算?第1-10是線程前十個的排序
#?????????????0?1?2?3?4?5?6?7?8?9?a?b
cpu_sum_info=(0?0?0?0?0?0?0?0?0?0?0?0)
cpu_5mi_info=(0?0?0?0?0?0?0?0?0?0?0?0)
cpu_10m_info=(0?0?0?0?0?0?0?0?0?0?0?0)
cpu_15m_info=(0?0?0?0?0?0?0?0?0?0?0?0)
cnt=0


function?GetPID?#User?#Name
{????????????????????????????????????????

?PsUser=$1?????????????????????????????

?PsName=$2??

?PID=`ps?-u?$PsUser|grep?$PsName|grep?-v?grep|grep?-v?vi|grep?-v?dbxn|grep?-v?tail|grep?-v?start|grep?-v?stop?|sed?-n?1p?|awk?'{print?$1}'`

?#echo?$PID
?return?$PID?

}
function?GetCpu
{
?#?CpuValue=`ps?-p?$1?-o?pcpu?|grep?-v?CPU?|?awk?'{print?$1}'?|?awk?-F.?'{print?$1}'`
?CpuValue=`top?-p?$1?-bn?1?|?awk?'NR?==?8?{print?$9}'|?awk?-F.?'{print?$1}'`
?#?echo?"cpu?all?use?"$CpuValue?"%"

?return??$CpuValue
}
function?SumCpuAverage
{
?sum_value=$1
?cnt=$2
?#?echo?"?"$sum_value?$cnt
?((aver=sum_value/cnt))
?#?echo?"aver="${aver}
?return?$aver
}
function?float()?{
?bc?<<?EOF
num?=?$1;
base?=?num?/?1;
if?(((num?-?base)?*?10)?>?1?)
????base?+=?1;
print?base;
EOF
echo?""
return?$base
}


while?true
do
?date
?GetPID?root??exe?#修改對應的用戶和進程名

?echo?$?

?if?[?-n?"$PID"?-a?-e?/proc/$PID?];?then
??echo?"process?exists"
?else???????????????????????????????????????????????????????????????????????????????????????????????????????
??exit?0?
?fi

?if?ps?-p?$PID?>?/dev/null
?then
??echo?"$PID?is?running"
??#?Do?something?knowing?the?pid?exists,?i.e.?the?process?with?$PID?is?running
?else
??exit?0
?fi

?GetCpu??$PID?

?single_value=$?
?echo??-e?"