【研究任務】精準控制進程cpu使用率

一、cpu的使用率計算

cpu的使用率的獲取可以通過top命令或者/proc/<pid>/stat文件

以下是計算cpu使用率有關的參數:

pid=17184

進程號

utime=45010

該任務在用戶態運行的時間,單位爲jiffies

stime=4050

該任務在覈心態運行的時間,單位爲jiffies

cutime=0

所有已死線程在用戶態運行的時間,單位爲jiffies

cstime=0

所有已死在覈心態運行的時間,單位爲jiffies

#參考python包psutil源碼
def cpu_percent(self, interval=None):
    def timer():
        return time.time() * 1000

    st1 = timer()
    pt1 = self._proc.cpu_times()
    time.sleep(interval)
    st2 = timer()
    pt2 = self._proc.cpu_times()
    delta_proc = (pt2.user - pt1.user) + (pt2.system - pt1.system)
    delta_time = st2 - st1
    try:
       cpu_percent = ((delta_proc / delta_time) * 100)
    except ZeroDivisionError:
        return 0.0

單進程cpu使用率計算:

① 每一個進程快照均爲 (utime、stime、cutime、cstime)的4元組;

② 採樣兩個足夠短的時間間隔的進程快照

③ 計算該進程的cpu使用率pcpu = 100*(processCpuTime2 – processCpuTime1) / (totalCpuTime2 – totalCpuTime1)


二、控制原理

假設給定總時間100ms,需要限制進程A的CPU使用率是25%。則進程A的執行時間25ms,剩餘時間不讓進程A執行就可以了。Linux中斷信號中SIGSTOP/SIGCONT可以實現進程的暫停和激活,這樣就能將程序CPU使用率隨意控制了。

#參考python包psutil源碼
def cpu_percent(self, interval=None):
    def timer():
        return time.time() * 1000

    st1 = timer()
    pt1 = self._proc.cpu_times()
    time.sleep(interval)
    st2 = timer()
    pt2 = self._proc.cpu_times()
    delta_proc = (pt2.user - pt1.user) + (pt2.system - pt1.system)
    delta_time = st2 - st1
    try:
       cpu_percent = ((delta_proc / delta_time) * 100)
    except ZeroDivisionError:
        return 0.0

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