一、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
转载于:https://blog.51cto.com/12814931/2131942