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

原文地址:http://blog.51cto.com/12814931/2131942

时间: 2024-11-11 06:49:49

【研究任务】精准控制进程cpu使用率的相关文章

一个限制进程 CPU 使用率的解决方案

一个限制进程 CPU 使用率的解决方案 一 背景 在最近的一个项目中,需要限制 CPU 使用率.通过查阅各种资料,发现已经有直接可以使用的软件可以使用,这个软件就是cpulimit,这个软件使用非常简单.但是,结合实际使用场景,被限制的进程不能后台运行,一旦后台运行,进程即会立刻退出,而且该进程运行一段时间后会产生子进程及相关进程.针对这种情况,经过思考,通过以下解决方案解决该问题. 二 解决步骤 2.1 安装cpulimit [root@gysl-dev ~]# yum -y install

Java进程CPU使用率高排查

近期java应用,CPU使用率一直很高,经常达到100%,通过以下步骤完美解决,分享一下. 1.jps 获取Java进程的PID. 2.jstack pid >> java.txt 导出CPU占用高进程的线程栈. 3.top -H -p PID 查看对应进程的哪个线程占用CPU过高. 4.echo "obase=16; PID" | bc 将线程的PID转换为16进制. 5.在第二步导出的Java.txt中查找转换成为16进制的线程PID.找到对应的线程栈. 6.分析负载高

Windows下用C语言获取进程cpu使用率,内存使用,IO情况

#ifndef PROCESS_STAT_H #define PROCESS_STAT_H #ifdef __cplusplus extern “C” { #endif typedef long long int64_t; typedef unsigned long long uint64_t; /// 获取当前进程的cpu使用率,返回-1失败 int get_cpu_usage(); /// 获取当前进程内存和虚拟内存使用量,返回-1失败,0成功 int get_memory_usage(ui

关于在zabbix监测脚本中使用ps命令监控进程CPU使用率和内存使用率,获得数据为0的情况描述

前提:想自己编写zabbix监测脚本,然后通过配置模板的方式,实现对资源(cpu和内存)使用率高的进程进行监控. 过程描述:zabbix版本为2.21,被监控主机操作系统为CentOS 6.4.脚本中主要命令如下:percent=0; #通过脚本输入参数process=$1; #通过ps aux参数,获取CPU%和MEM%值,使用awk将第四行的MEM%值筛选出来percent=ps aux | grep $process | grep -v grep | head -1 | awk '{pri

SQLSERVER进程CPU使用率100%

解决SQLSERVER2008 CPU使用率99%: 1.dbcc checkdb 重建索引 2.檢查有沒有死鎖 -- sp_lock SELECT request_session_id spid , OBJECT_NAME(resource_associated_entity_id) tableName     FROM sys.dm_tran_locks     WHERE resource_type = 'OBJECT' -- kill spid 解除死锁 kill 58 到这里查看一下C

Ubuntu下Linux限制进程cpu使用率

安装cpulimit 使用源码安装 # cd /tmp # wget 'http://downloads.sourceforge.net/cpulimit/cpulimit-1.1.tar.gz' # tar cpulimit-1.1.tar.gz# cd cpulimit-1.1 # make # cp cpulimit /usr/local/sbin/ # rm -rf cpulimit *Debian / Ubuntu 用户 使用apt-get更方便的安装 $ sudo apt-get u

查看线程linux cpu使用率

Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算 转 http://www.cnblogs.com/lidabo/p/4738113.html目录(?)[-] proc文件系统 proccpuinfo文件 procstat文件 procpidstat文件 procpidtasktidstat文件 系统中有关进程cpu使用率的常用命令 ps 命令 top命令 单核情况下Cpu使用率的计算 基本思想 总的Cpu使用率计算 计算方法 某一进程Cpu使用率的计算 计算方法 实验数据

Linux性能优化从入门到实战:04 CPU篇:CPU使用率

??CPU使用率是单位时间内CPU使用情况的统计,以百分比方式展示. $ top top - 11:46:45 up 7 days, 11:52, 1 user, load average: 0.00, 0.01, 0.00 Tasks: 198 total, 1 running, 197 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.2 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st K

记一次mysql 导致的CPU使用率过高问题

前几天更新完程序,测试功能时,发现应用登录非常慢,以为是应用有问题,但是等待较长一段时间后发现应用登录是ok的.检查应用日志,发现提示数据池已满,无法创建更多的连接.然后赶紧登录数据库检查, 1.top查看发现mysql进程cpu使用率竟然高达1300%多,我勒个去,这是什么鬼! 2.登录mysql查看线程 # show processlist 发现大量的从应用服务器过来的连接,而且全部是Query状态.想着看看慢查询日志有哪些SQL运行时间较长,导致连接一直保持Query状态. 3.开启慢查询