一種基于Linux的CPU和內(nèi)存使用率收集的方法
【專利摘要】本發(fā)明公開了一種基于Linux的CPU和內(nèi)存使用率收集的方法,所述方法首先收集CPU或內(nèi)存的信息,然后根據(jù)所收集的信息,通過公式分別計算出CPU或內(nèi)存的使用率,其中CPU的使用率為:用執(zhí)行用戶系統(tǒng)狀態(tài)的時間除以總的時間,內(nèi)存使用率為:1-空閑使用率。本發(fā)明具有平均可控采樣,科學(xué)計算,多路支持以及快速多臺同時部署等特點。
【專利說明】—種基于Linux的CPU和內(nèi)存使用率收集的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計算機【技術(shù)領(lǐng)域】,具體涉及一種基于Linux的CPU和內(nèi)存使用率收集的方法,應(yīng)用于服務(wù)器日常巡檢工作中,實現(xiàn)服務(wù)器運行狀態(tài)的自動收集、計算工作。
【背景技術(shù)】
[0002]服務(wù)器巡檢能夠及時發(fā)現(xiàn)服務(wù)器的隱患,便于改善和優(yōu)化服務(wù)器的性能。在巡檢過程中服務(wù)人員需要分別收集服務(wù)器系統(tǒng)的CPU使用率,內(nèi)存使用率,磁盤使用率信息,通過這些信息進(jìn)行服務(wù)器系統(tǒng)的健康狀態(tài)評估,該評估結(jié)果幫助服務(wù)器維護(hù)人員實時獲得當(dāng)前服務(wù)器的運行情況,并針對可能出現(xiàn)的CPU占用率過大,磁盤即將寫滿等問題及時做出處理。
[0003]隨著云計算、大數(shù)據(jù)的普及和應(yīng)用,用戶對服務(wù)器的穩(wěn)定性、可靠性的要求和平均無故障運行時間(MTBF)要求越來越高,并且隨著數(shù)據(jù)膨脹帶來的服務(wù)器數(shù)量的激增,傳統(tǒng)的方法只能每次一臺進(jìn)行系統(tǒng)狀態(tài)的查看,并且只能通過人為估計的方法來獲得某一時間點的CPU使用率和內(nèi)存使用率。如何快速,準(zhǔn)確的獲得大量服務(wù)器的運行狀態(tài),是擺在所有服務(wù)器維護(hù)人員面前的難題。
【發(fā)明內(nèi)容】
[0004]本發(fā)明要解決的技術(shù)問題是:由于大多數(shù)以Linux為操作系統(tǒng)的服務(wù)器是不安裝圖形界面的,只能通過復(fù)雜的指令進(jìn)行服務(wù)器當(dāng)前數(shù)據(jù)的收集,目前的收集工作主要有兩個問題:
1.收集工作往往是系統(tǒng)在某個時間點的運行狀態(tài),無法反映出系統(tǒng)在某一階段的平均運行狀態(tài)。
[0005]2.Linux系統(tǒng)中的CPU使用率以及內(nèi)存使用率是通過相應(yīng)的公式進(jìn)行計算獲得,現(xiàn)場很難通過計算來獲得準(zhǔn)確的數(shù)據(jù)。
[0006]為了避免這種情況的出現(xiàn),簡化維護(hù)成本,本申請?zhí)岢隽艘环N基于Linux的CPU和內(nèi)存使用率收集的方法。通過自動腳本的運行,可以準(zhǔn)確的或者系統(tǒng)在某一時間段內(nèi)的CPU使用率和內(nèi)存使用率的平均值,客觀且全面的反映系統(tǒng)的當(dāng)前狀態(tài)。具有平均可控采樣,科學(xué)計算,多路支持以及快速多臺同時部署等特點。
[0007]本發(fā)明所采用的技術(shù)方案為:
一種基于Linux的CPU和內(nèi)存使用率收集的方法,所述方法首先收集CPU或內(nèi)存的信息,然后根據(jù)所收集的信息,通過公式分別計算出CPU或內(nèi)存的使用率,其中CPU的使用率為:用執(zhí)行用戶系統(tǒng)狀態(tài)的時間除以總的時間,內(nèi)存使用率為:1_空閑使用率。
[0008]所述CPU使用率收集方法包括步驟如下:
I)獲得CPU信息,Linux中CPU信息存放在/proc/stat文件中,包括參數(shù)如下:user:從系統(tǒng)啟動開始累計到當(dāng)前時刻,用戶態(tài)的CPU時間(單位:jiffies),不包含nice 值為負(fù)進(jìn)程,I jiffies=0.01 秒; nice:從系統(tǒng)啟動開始累計到當(dāng)前時刻,nice值為負(fù)的進(jìn)程所占用的CPU時間(單位:jiffies);
system:從系統(tǒng)啟動開始累計到當(dāng)前時刻,核心時間(單位:jiffies);idle:從系統(tǒng)啟動開始累計到當(dāng)前時刻,除硬盤1等待時間以外其它等待時間(單位:jiffies);
1wait:從系統(tǒng)啟動開始累計到當(dāng)前時刻,硬盤1等待時間(單位:jiffies); irq:從系統(tǒng)啟動開始累計到當(dāng)前時刻,硬中斷時間(單位:jiffies); softirq:從系統(tǒng)啟動開始累計到當(dāng)前時刻,軟中斷時間(單位:jiffies);
其中每一個參數(shù),都表示一個CPU的當(dāng)前狀態(tài);
2)計算CPU使用率,在Linux的內(nèi)核中,有一個全局變量:jiffies,jiffies代表時間。它的單位隨硬件平臺的不同而不同。系統(tǒng)里定義了一個常數(shù)HZ,代表每秒種最小時間間隔的數(shù)目。這樣jiffies的單位就是I/HZο Intel平臺jiffies的單位是1/100秒,這就是系統(tǒng)所能分辨的最小時間間隔了。每個CPU時間片,jiffies都要加I。CPU的利用率就是用執(zhí)行用戶系統(tǒng)狀態(tài)的Jiffies除以總的jiffies來表示。
[0009]CPU計算方法:
CPUTOTAL=user+system+nice+idle+1wait+irq+softirq
SYS_IDLE=idle
CPU_USAGE=(SYS_IDLE2-SYS_IDLE1)/(CPU_T0TAL2-CPU_T0TALI)*100%
所述內(nèi)存使用率收集方法包括步驟如下:
I)獲得內(nèi)存信息,Linux內(nèi)存信息存放在/proc/meminfo中,包括參數(shù):
MemTotal:所有可用RAM大小(即物理內(nèi)存減去一些預(yù)留位和內(nèi)核的二進(jìn)制代碼大小);
MemFree:LowFree與HighFree的總和,被系統(tǒng)留著未使用的內(nèi)存;
Buffers:用來給文件做緩沖大?。?br>
Cached:被高速緩沖存儲器(cache memory)用的內(nèi)存的大??;
為求的機器在一段時間內(nèi)的平均內(nèi)存使用率,這里在10秒內(nèi)每秒進(jìn)行一次內(nèi)存采樣。
[0010]2)計算內(nèi)存使用率,空閑內(nèi)存計算方法:當(dāng)Cached大于MemTotal時,空閑內(nèi)存MEM_FREE 為 MemFree,其余情況下,MEM_FREE = MemFree + Cached + Buffers,則內(nèi)存使用率 MEM_USAGE = 1- MEM_FREE / MemTotal
程序代碼:
If ( Cached > MemTotal )
MEM_FREE = MemFree
Else
MEM_FREE = MemFree + Cached + Buffers
MEM_USAGE = 1- MEM_FREE / MemTotal
在所述收集過程開始的準(zhǔn)備工作中,將上述編寫的程序腳本拷到某目錄下,這個目錄就是后續(xù)收集到的信息文件所在目錄,得到需要的信息就可以直接到此目錄查看,本發(fā)明的易用性得以體現(xiàn)。
[0011]所述程序能夠自動識別到當(dāng)前服務(wù)器的CPU數(shù)量,并且能夠?qū)γ總€CPU進(jìn)行單獨信息收集。通過設(shè)置CPUTestTime參數(shù)來定義CPU使用率采樣次數(shù),采樣越多數(shù)據(jù)反映的越準(zhǔn)確,但所占用的事件也越長。
[0012]CPU使用率計算代碼如下: for ((m=0; m〈$CPU—NUM; m++)) do {
temp—row=$m+2
unset AVE—Disp—SYS—Rate
echo -n “ CPU$m Testing.”
for ((j+0;j<$CPUTestTime;j++))
do
{
temp—row—p=,,$ {temp—row} p”
CPULOG—1=$(cat /proc/stat | grep ;cpu,| sed - n $temp_row_p | awk ; {print$2” “$3” “$4” “$5” “$6” “$7” “$8”},)
SYS—IDLE—1=$(echo $CPUL0G_1 | awk ‘{print $4},)
Total—l=$echo $CPUL0G_1 | awk “ {print $l+$2+$3+$4+$5+$6+$7},)
for ((n=0;n<x;n++))
do
echo - n ”
sleep I
done
CPULOG—2=$ (cat /proc/stat | grep ;cpu,| sed - n $temp_row_p | awk ; {print$2” “$3” “$4” “$5” “$6” “$7” “$8”},)
SYS—IDLE—2=$(echo $CPUL0G_2 | awk ‘{print $4},)
Total-2=$ (echo $CPUL0G_2 | awk ‘{print $l+$2+$3+$4+$5+$6+$7}’)
SYS—IDLE=’ expr $SYS—IDLE—2 - $SYS—IDLE—Γ
Total=, expr $Total—2 - $Total—I,
SYS—USAGE=’ expr $SYS—IDLE/$Total*100 be -Γ
SYS—Rate=, expr 100-$SYS—USAGE | be -1,
Disp—SYS—Rate=/expr “scale+3; $SYS—Rate/1” | be,if [ ! $AVE—Disp—SYS—Rate ]; thenAVE—Disp—SYS—Rate=$Disp—SYS—Rate
eles
AVE—Disp—SYS—Rate=, expr “scale=3;$ AVE—Disp—SYS—Rate+$Disp—SYS—Rate”
I be,fi
}
done
echo “Finish!”
AVE—Disp—SYS—Rate=, expr “scale=3; $AVE—Disp—SYS—Rate/$CPUTestTime” | be,
echo - e “\033[32m CPU$m Usage: $ AVE—Disp—SYS—Rate% \033[0m”
echo “CPU$m Usage: $AVE—Disp—SYS—Rate% “?$fileName
}
done
內(nèi)存的測試次數(shù)可以通過MEMTestTime進(jìn)行控制,通過定制測試次數(shù)滿足用戶具體的應(yīng)用要求。內(nèi)存大小自動轉(zhuǎn)化為GB單位,方便觀察,所述內(nèi)存計算代碼:for ((i=0; i〈$MENTestTime; i++))do
{
declare -1 templ=$MEMTestTime_lif [ $1- eq $tempI ]; thenecho “.Finish!”
else
echo - n “.,,
fi
declare -1 CMDMEMTotal=,cat /proc/meminfo | grep “MemTotal” | cut - f2,3-d:1 sed - n ‘s/.* \ ([0—9] \ {1,\} \) kB.*$八1/p,,;
SUMMENTotal=${{$SUMMENTotal+$CMDMEMTotal}};
declare -1 CMDMEMFree=’ cat /proc/meminfo | grep “MemFree” | cut - f2,3-d:1 sed - n ‘s/.* \ ([0—9] \ {1,\} \) kB.*$八1/p,,;
SUMMEMFree=${{$SUMMENFree+$CMDMEMFree}};
declare -1 CMDMEMCached= ^ cat /proc/meminfo | grep - w “Cached” | cut-f2,3 -d: |sed -n ‘s/.* \ ([0—9] \ {1,\} \) kB.*$Al/p,,;
SUMMENCached=${{$SUMMENCached+$CMDMEMCached}};
declare -1 CMDMENBuffers=’ cat /proc/meminfo | grep -w “Buffers” | cut-f2,3 -d: |sed -n ‘s/.* \ ([0—9] \ {1,\} \) kB.*$Al/p,,;
SUMMENBuffers=${{$SUMMENBuffers+$CMDMEMBuffers}};
sleep I;
}
done
CMDMEMTotal=$SUMMENTotal/$MEMTestTime
CMDMEMFree=$SUMMENFree/$MEMTestTime
CMDMEMTCached=$SUMMENCached/$MEMTestTime CMDMEMBuffers=$SUMMENBuffers/$MEMTestTime
declare _i MEMFree
declare -1 MEMTotaI=$CMDMEMTotaI
if { $CMDMEMCached - gt $CMDMEMTotal }; then
MEMFree=$CMDMEMFree
else
MEMFree=$CMDMEMFree+$CMDMEMBuffers+$CMDMEMCached
fi
temp3=, expr $MEMFree/$MEMTotal*100 | be -1,
temp4=, expr 100-$temp3 | be,
MEMUSE=^ expr “scale=3; $temp4/l” | be -1,
temp5=’ expr “scale=l; $MEMTotal/1024/1024” | be -1’
temp6=, expr “scale=l; $MEMFree/1024/1024” | be -1,
echo - e “\033[36m Total memory: $MEMTotal kB ( $temp5 GB ) \033[0m”
echo - e “\033[36m Free memory: $MEMFree kB ( $temp6 GB ) \033[0m”
echo - e “\033[36m Memory usage: $MEMUSE% \033[0m”
echo “Total memory: $MEMTotal kB ( $temp5 GB ) ” >>$fileName
echo “Free memory: $MEMFree kB ( $temp6 GB ) ” >>$fileName
echo “Memory usage: $MEMUSE%” >>$fileName
本發(fā)明的有益效果為:本發(fā)明提出的基于Linux操作系統(tǒng)的CPU使用率以及內(nèi)存使用率實現(xiàn)方法能夠很好的解決以上提出的問題:
1.CPU使用率以及內(nèi)存使用率的釆集工作基于多個時間點,可自行設(shè)置釆樣點跨度時間,客觀的獲得平均使用狀態(tài)。
[0013]2.CPU使用率以及內(nèi)存使用率釆用科學(xué)的計算方法,通過在上述平均釆樣的基礎(chǔ)上進(jìn)行計算。能夠客觀、準(zhǔn)確的反映出系統(tǒng)的運行狀態(tài)。
[0014]3.由于釆用腳本的設(shè)計方式,可以快速部署到多臺機器上,通過指令同時進(jìn)行數(shù)據(jù)釆樣,計算,保存,收集工作,極大的減輕了維護(hù)人員巡檢工作,無人值守,自動運行。
[0015]4.釆用動態(tài)顯示的方法,使收集過程清晰明了的展現(xiàn)在使用者面前;并且自動將計算過程和計算數(shù)據(jù)保存在當(dāng)前目錄下,方便使用者統(tǒng)一收集。
[0016]5.支持多路服務(wù)器的CPU使用率收集,由于現(xiàn)在服務(wù)器上通常會部署多個CPU,該方法可以收集多CPU在同一時間段內(nèi)的平均使用狀態(tài),并分別分析,顯示并保存使用信息。
【具體實施方式】
[0017]下面通過【具體實施方式】,對本發(fā)明進(jìn)一步說明:
CPU使用率計算代碼如下:
for ((m=0; m〈$CPU—NUM; m++))
do
{
temp—row=$m+2
unset AVE—Disp—SYS—Rate
echo -n “ CPU$m Testing.”
for ((j+0;j<$CPUTestTime;j++))
do
{
temp—row—p=,,$ {temp—row} p”
CPULOG—1=$(cat /proc/stat | grep ;cpu,| sed - n $temp_row_p | awk ; {print$2” “$3” “$4” “$5” “$6” “$7” “$8”},)
SYS—IDLE—1=$(echo $CPUL0G_1 | awk ‘{print $4},)
Total—l=$echo $CPUL0G_1 | awk “ {print $l+$2+$3+$4+$5+$6+$7},)
for ((n=0;n<x;n++))
do
echo - n ”
sleep I
done
CPULOG—2=$(cat /proc/stat | grep ;cpu,| sed - n $temp_row_p | awk ; {print$2” “$3” “$4” “$5” “$6” “$7” “$8”},)
SYS—IDLE—2=$(echo $CPUL0G_2 | awk ‘{print $4},)
Total-2=$ (echo $CPUL0G_2 | awk ‘{print $l+$2+$3+$4+$5+$6+$7}’)
SYS—IDLE=’ expr $SYS—IDLE—2 - $SYS—IDLE—Γ
Total=, expr $Total—2 - $Total—I,
SYS—USAGE=’ expr $SYS—IDLE/$Total*100 be -Γ
SYS—Rate=, expr 100-$SYS—USAGE | be -1,
Disp—SYS—Rate=/expr “scale+3; $SYS—Rate/1” | be,if [ ! $AVE—Disp—SYS—Rate ]; thenAVE—Disp—SYS—Rate=$Disp—SYS—Rate
eles
AVE—Disp—SYS—Rate=, expr “scale=3;$ AVE—Disp—SYS—Rate+$Disp—SYS—Rate”
I be,fi
}
done
echo “Finish!”
AVE—Disp—SYS—Rate=, expr “scale=3; $AVE—Disp—SYS—Rate/$CPUTestTime” | be,
echo - e “\033[32m CPU$m Usage: $ AVE—Disp—SYS—Rate% \033[0m”
echo “CPU$m Usage: $AVE—Disp—SYS—Rate% “?$fileName
}
done
內(nèi)存計算代碼:
for ((i=0; i〈$MENTestTime; i++))
do
{
declare -1 templ=$MEMTestTime_l
if [ $1- eq $tempI ]; then
echo “.Finish!”
else
echo - n “.,,
fi
declare -1 CMDMEMTotal=,cat /proc/meminfo | grep “MemTotal” | cut - f2,3-d:1 sed - n ‘s/.* \ ([0—9] \ {1,\} \) kB.*$八1/p,,;
SUMMENTotal=${{$SUMMENTotal+$CMDMEMTotal}};
declare -1 CMDMEMFree=’ cat /proc/meminfo | grep “MemFree” | cut - f2,3-d:1 sed - n ‘s/.* \ ([0—9] \ {1,\} \) kB.*$八1/p,,;
SUMMEMFree=${{$SUMMENFree+$CMDMEMFree}};
declare -1 CMDMEMCached= ^ cat /proc/meminfo | grep - w “Cached” | cut-f2,3 -d: |sed -n ‘s/.* \ ([0—9] \ {1,\} \) kB.*$Al/p,,;
SUMMENCached=${{$SUMMENCached+$CMDMEMCached}};
declare -1 CMDMENBuffers=’ cat /proc/meminfo | grep -w “Buffers” | cut-f2,3 -d: |sed -n ‘s/.* \ ([0—9] \ {1,\} \) kB.*$Al/p,,;
SUMMENBuffers=${{$SUMMENBuffers+$CMDMEMBuffers}};
sleep I;
}
done
CMDMEMTotal=$SUMMENTotal/$MEMTestTime
CMDMEMFree=$SUMMENFree/$MEMTestTime
CMDMEMTCached=$SUMMENCached/$MEMTestTime CMDMEMBuffers=$SUMMENBuffers/$MEMTestTime
declare _i MEMFree
declare -1 MEMTotal=$CMDMEMTotal
if { $CMDMEMCached - gt $CMDMEMTotal }; then
MEMFree=$CMDMEMFree
else
MEMFree=$CMDMEMFree+$CMDMEMBuffers+$CMDMEMCached
fi
temp3=, expr $MEMFree/$MEMTotal*100 | be -1,
temp4=, expr 100-$temp3 | be,
MEMUSE=^ expr “scale=3; $temp4/l” | be -1,
temp5=’ expr “scale=l; $MEMTotal/1024/1024” | be -1’
temp6=, expr “scale=l; $MEMFree/1024/1024” | be -1,
echo - e “\033[36m Total memory: $MEMTotal kB ( $temp5 GB ) \033[0m”
echo - e “\033[36m Free memory: $MEMFree kB ( $temp6 GB ) \033[0m”
echo - e “\033[36m Memory usage: $MEMUSE% \033[0m”echo “Total memory: $MEMTotal kB ( $temp5 GB ) ” >>$fileNameecho “Free memory: $MEMFree kB ( $temp6 GB ) ” >>$fileNameecho “Memory usage: $MEMUSE%” >>$fileName0
【權(quán)利要求】
1.一種基于Linux的CPU和內(nèi)存使用率收集的方法,其特征在于:所述方法首先收集CPU或內(nèi)存的信息,然后根據(jù)所收集的信息,通過公式分別計算出CPU或內(nèi)存的使用率,其中CPU的使用率為:用執(zhí)行用戶系統(tǒng)狀態(tài)的時間除以總的時間,內(nèi)存使用率為:1_空閑使用率。
2.根據(jù)權(quán)利要求1所述的一種基于Linux的CPU和內(nèi)存使用率收集的方法,其特征在于,所述CPU使用率收集方法包括步驟如下: 1)獲得CPU信息,Linux中CPU信息存放在/proc/stat文件中,包括參數(shù)如下: user:從系統(tǒng)啟動開始累計到當(dāng)前時刻,用戶態(tài)的CPU時間,不包含nice值為負(fù)進(jìn)程; nice:從系統(tǒng)啟動開始累計到當(dāng)前時刻,nice值為負(fù)的進(jìn)程所占用的CPU時間; system:從系統(tǒng)啟動開始累計到當(dāng)前時刻,核心時間(; idle:從系統(tǒng)啟動開始累計到當(dāng)前時刻,除硬盤1等待時間以外其它等待時間; 1wait:從系統(tǒng)啟動開始累計到當(dāng)前時刻,硬盤1等待時間; irq:從系統(tǒng)啟動開始累計到當(dāng)前時刻,硬中斷時間; softirq:從系統(tǒng)啟動開始累計到當(dāng)前時刻,軟中斷時間; 其中每一個參數(shù),都表示一個CPU的當(dāng)前狀態(tài); 2)計算CPU使用率, CPU計算方法:
CPUTOTAL=user+system+nice+idle+1wait+irq+softirq
SYS_IDLE=idle
CPU_USAGE=(SYS_IDLE2-SYS_IDLE1)/(CPU_T0TAL2-CPU_T0TALI)*100%
o
3.根據(jù)權(quán)利要求1所述的一種基于Linux的CPU和內(nèi)存使用率收集的方法,其特征在于,所述內(nèi)存使用率收集方法包括步驟如下: 1)獲得內(nèi)存信息,Linux內(nèi)存信息存放在/proc/meminfo中,包括參數(shù): MemTotal:所有可用RAM大??; MemFree:LowFree與HighFree的總和,被系統(tǒng)留著未使用的內(nèi)存; Buffers:用來給文件做緩沖大小; Cached:被高速緩沖存儲器用的內(nèi)存的大小; 2)計算內(nèi)存使用率,其中: 空閑內(nèi)存計算方法: 當(dāng) Cached 大于 MemTotal 時,空閑內(nèi)存 MEM_FREE 為 MemFree, 其余情況下,MEM_FREE = MemFree + Cached + Buffers, 則內(nèi)存使用率 MEM_USAGE = 1- MEM_FREE / MemTotal。
4.根據(jù)權(quán)利要求1、2或3任一所述的一種基于Linux的CPU和內(nèi)存使用率收集的方法,其特征在于:在所述收集過程開始的準(zhǔn)備工作中,將根據(jù)權(quán)利要求2或3編寫的程序腳本拷到某目錄下,這個目錄就是后續(xù)收集到的信息文件所在目錄,得到需要的信息就可以直接到此目錄查看。
5.根據(jù)權(quán)利要求2所述的一種基于Linux的CPU和內(nèi)存使用率收集的方法,其特征在于:所述程序通過設(shè)置CPUTestTime參數(shù)能夠自動識別到當(dāng)前服務(wù)器的CPU數(shù)量,并且能夠?qū)γ總€CPU進(jìn)行單獨信息收集。
6.根據(jù)權(quán)利要求3任一所述的一種基于Linux的CPU和內(nèi)存使用率收集的方法,其特征在于:內(nèi)存的測試次數(shù)可以通過設(shè)置MEMTestTime進(jìn)行控制,通過定制測試次數(shù)滿足用戶具體的應(yīng)用要求。
【文檔編號】G06F11/34GK104239193SQ201410448195
【公開日】2014年12月24日 申請日期:2014年9月4日 優(yōu)先權(quán)日:2014年9月4日
【發(fā)明者】唐珂, 任華進(jìn) 申請人:浪潮電子信息產(chǎn)業(yè)股份有限公司