在linux中對vbox的cpu使用率監控

目前,每天中午cpu的負載都會突然增加,通過htop命令查看到此時的vbox的cpu佔用率一致蠻高的,便計劃對vbox的cpu使用率進行計劃性監控,最開始的想法很簡單就是通過調用top命令來進行cpu使用率的監控,但監控了好幾天,發現值一直爲0,而htop中值是一直有變化的,正常的結果也不應該爲0,可惜,我沒法對htop進行重定向,便計劃通過/proc/<pid>/stat文件中的數據進行監控。可是當讀取/proc/<pid>/stat文件內容後發現第14,15,16,17列的值完全沒有變化(用於計算cpu使用率),預估top的值沒有變化也和此有關,但htop的值一直有變化,而且顯示的不止一個進程,故猜想htop讀取的是線程值,所以開始讀取/proc/<pid>/task/<tid>/stat文件內容,發現所需列的值有發生變化,而且一秒內變化的值和htop顯示的值類似(此段內容,個人沒法確定正確與否),故此,讀取線程cpu使用率,代碼如下:

import subprocess
import time
import psutil
import os

NAME = 'vbox_cpu_info'
VERBOSE = True
#通過psutil讀取VBoxHeadless進程pid
def usePsutil():
    pidList = psutil.pids()
    processToTest = "VBoxHeadless"
    for eachPid in pidList:
        try:
            eachProcess = psutil.Process(eachPid)
            processName = eachProcess.name()  
            if(processName == processToTest):
                return eachPid
        except psutil.NoSuchProcess,pid:
            print "no process found with pid=%s"%(pid)
#得到線程的cpu佔用時間
def get_cpu_time():
    vboxPid = tryPsutil()
    currentDirs = os.listdir("/proc/%d/task/"%vboxPid)
    allDirs = []
    timeOfCPU = []
    for i in currentDirs:
        allDirs.append(i)
    for i in allDirs:
        fileName = "/proc/%d/task/%d/stat"%(vboxPid,int(i))
        with open(fileName, 'r') as f:
            line = f.readlines()
            line_str = ''.join(line)
            line_split = line_str.split()
            timeOfCPU.append(int(line_split[13]) + int(line_split[14]) + int(line_split[15]) + int(line_split[16]))
    return timeOfCPU
#得到線程id
def get_tid():
    vboxPid = tryPsutil()
    currentDirs = os.listdir("/proc/%d/task/"%vboxPid)
    allDirs = []
    for i in currentDirs:
        allDirs.append(i)
    return allDirs
#得到tid和cpu used
def get_stats():
    firstTime = []
    lastTime =[]
    firstTime = get_cpu_time()
    time.sleep(1)
    lastTime = get_cpu_time()
    CPUofUsed = list(map(lambda x: x[0]-x[1], zip(lastTime, firstTime)))
    tid = get_tid()
    print zip(tid,CPUofUsed)
get_stats()

若需在nagios中監控,只需修改少量代碼即可,在此忽略,若想在collectd中監控,可參考:https://github.com/anryko/cpu-collectd-plugin

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章