一、cpu的使用率計算
cpu的使用率的獲取可以通過top命令或者/proc/<pid>/stat文件
以下是計算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
單進程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