前面給大家分享過(guò)一個(gè)工作中用到的編譯拷貝腳本,其實(shí)工作中還有一些其他工具的使用,今天再來(lái)分享一個(gè)自己純手工的CPU監(jiān)控的腳本。大家可以結(jié)合上篇文章與本篇文章一起學(xué)習(xí)shell。
主要實(shí)現(xiàn)功能:
- 1.監(jiān)控指定進(jìn)程是否運(yùn)行2.讀取該進(jìn)程所在當(dāng)前CPU的占用率,5s一次的執(zhí)行頻率計(jì)算當(dāng)前進(jìn)程 5分鐘 10分鐘 15分鐘的平均cpu占用率3.計(jì)算該進(jìn)程下用PID排序的前十個(gè)線程的 5分鐘 10分鐘 15分鐘的平均cpu占用率
歡迎關(guān)注微信公眾號(hào):羽林君,或者添加作者個(gè)人微信:become_me
情節(jié)介紹:
在工作中,我們會(huì)對(duì)調(diào)試的進(jìn)程以及線程進(jìn)行性能分析并進(jìn)行調(diào)優(yōu),通常我們使用linux下很多的工具包例如,perf 性能分析工具,以及剖析工具 GNU profiler(gprof 可以為 Linux平臺(tái)上的程序精確分析性能瓶頸。gprof精確地給出函數(shù)被調(diào)用的時(shí)間和次數(shù),給出函數(shù)調(diào)用關(guān)系)。
當(dāng)然現(xiàn)在運(yùn)維以及自動(dòng)駕駛里面工作對(duì)性能分析工具熟悉也要很多要求,舉例展示一個(gè)自動(dòng)駕駛相關(guān)的系統(tǒng)工程師需要掌握的一些性能分析工具,包含speccpu、fio、iperf、stream、mlc、lmbench、erf、emon/Vtune等工具及相關(guān)調(diào)優(yōu)手段,以后有時(shí)間再給大家一一介紹這些使用的性能分析工具。
今天呢,沒(méi)有過(guò)多描述這些工具,因?yàn)槲矣龅降那闆r是沒(méi)有這些工具,所以為了實(shí)現(xiàn)一個(gè)進(jìn)程監(jiān)控,我自己寫(xiě)了一個(gè)腳本,今天主要給大家分享,如果你工作中,需要一個(gè)性能監(jiān)控的要求,但是你使用的環(huán)境中沒(méi)有這些工具,此外你的環(huán)境支持shell腳本,那么這篇文章應(yīng)該對(duì)你有所幫助。
好了,言歸正傳,接下來(lái)我給大家分享我寫(xiě)這些腳本使用的技術(shù),以及最終實(shí)現(xiàn)的情況。
下圖是腳本執(zhí)行的流程圖:
腳本內(nèi)容:
#!/bin/bash
#一共11個(gè)數(shù)據(jù)?第0個(gè)是總的cpu計(jì)算?第1-10是線程前十個(gè)的排序
#?????????????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?#修改對(duì)應(yīng)的用戶和進(jìn)程名
?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?"