【研究任务】精准控制进程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

猜你喜欢

转载自blog.51cto.com/12814931/2131942