进程cpu使用率过高怎么办

cpu使用率过高怎么办  时间:2021-01-11  阅读:()
LinuxCPU占用率原理与精确度分析http://ilinuxkernel.
com1CPU占用率计算原理1.
1相关概念在Linux/Unix下,CPU利用率分为用户态、系统态和空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间.
下面是几个与CPU占用率相关的概念.
CPU利用率CPU的使用情况.
用户时间(Usertime)表示CPU执行用户进程的时间,包括nices时间.
通常期望用户空间CPU越高越好.
系统时间(Systemtime)表示CPU在内核运行时间,包括IRQ和softirq时间.
系统CPU占用率高,表明系统某部分存在瓶颈.
通常值越低越好.
等待时间(Waitingtime)CPI在等待I/O操作完成所花费的时间.
系统部应该花费大量时间来等待I/O操作,否则就说明I/O存在瓶颈.
空闲时间(Idletime)系统处于空闲期,等待进程运行.
Nice时间(Nicetime)系统调整进程优先级所花费的时间.
硬中断处理时间(HardIrqtime)系统处理硬中断所花费的时间.
软中断处理时间(SoftIrqtime)系统处理软中断中断所花费的时间.
丢失时间(Stealtime)被强制等待(involuntarywait)虚拟CPU的时间,此时hypervisor在为另一个虚拟处理器服务.
下面是我们在top命令看到的CPU占用率信息及各项值含义.
Cpu(s):0.
2%us,0.
2%sy,0.
0%ni,99.
2%id,0.
5%wa,0.
0%hi,0.
0%si,0.
0%stus:Usertimesy:Systemtimeni:Nicetimeid:Idletimewa:Waitingtimehi:HardIrqtimesi:SoftIrqtimest:Stealtime1.
2CPU占用率计算LinuxCPU占用率计算,都是根据/proc/stat文件内容计算而来,下面是stat文件内容样例,内核版本不同,会稍有不同,但内容基本一致.
CPU信息,cpu为总的信息,cpu0…cpun为各个具体CPU信息cpu66173346850392523305557354883514244158490上面共有8个值(单位:ticks),分别为:Usertime,661733Nicetime,468Systemtime,503925Idletime,233055573Waitingtime,548835HardIrqtime,14244SoftIRQtime,15849Stealtime,0CPU占用率计算公式如下:CPU时间=user+system+nice+idle+iowait+irq+softirq+Stl%us=(Usertime+Nicetime)/CPU时间*100%%sy=(Systemtime+HardIrqtime+SoftIRQtime)/CPU时间*100%%id=(Idletime)/CPU时间*100%%ni=(Nicetime)/CPU时间*100%%wa=(Waitingtime)/CPU时间*100%%hi=(HardIrqtime)/CPU时间*100%%si=(SoftIRQtime)/CPU时间*100%%st=(Stealtime)/CPU时间*100%2CPU占用率内核实现下面以RHEL6内核源码版本2.
6.
32-220.
el6x86_64为例,来介绍内核源码实现.
/proc/stat文件的创建由函数proc_stat_init()实现,在文件fs/proc/stat.
c中,在内核初始化时调用.
/proc/stat文件相关函数时间均在stat.
c文件中.
对/proc/stat文件的读写方法为proc_stat_operations.
00152:staticconststructfile_operationsproc_stat_operations={00153:.
open=stat_open,00154:.
read=seq_read,00155:.
llseek=seq_lseek,00156:.
release=single_release,00157:};00158:打开文件函数stat_open(),函数首先申请大小为size的内存,来存放临时数据(也是我们看到的stat里的最终数据).
00128:staticintssttaatt__ooppeenn(structinode*inode,structfile*file)00129:{00130:unsignedsize=4096*(1+num_possible_cpus()/32);00131:char*buf;00132:structseq_file*m;00133:intres;00134:00135:/*don'taskformorethanthekmalloc()maxsize,currently128KB*/00136:if(size>128*1024)00137:size=128*1024;00138:buf=kmalloc(size,GFP_KERNEL);00139:if(!
buf)00140:return-ENOMEM;00141:00142:res=single_open(file,show_stat,NULL);00143:if(!
res){00144:m=file->private_data;00145:m->buf=buf;00146:m->size=size;00147:}else00148:kfree(buf);00149:returnres;00150:}endstat_open00151:/proc/stat文件的数据由show_stat()函数填充.
注意42行for_each_possible_cpu(i)循环,是累加计算所有CPU的数据,如我们前面的示例看到的/proc/stat文件中第一行cpu值.
cpu6617334685039252330555735488351424415849000025:staticintsshhooww__ssttaatt(structseq_file*p,void*v)00026:{00027:inti,j;00028:unsignedlongjif;00029:cputime64_tuser,nice,system,idle,iowait,irq,softirq,steal;00030:cputime64_tguest;00031:u64sum=0;00032:u64sum_softirq=0;00033:unsignedintper_softirq_sums[NR_SOFTIRQS]={0};00034:structtimespecboottime;00035:00036:user=nice=system=idle=iowait=00037:irq=softirq=steal=cputime64_zero;00038:guest=cputime64_zero;00039:getboottime(&boottime);00040:jif=boottime.
tv_sec;00041:00042:for_each_possible_cpu(i){00043:user=cputime64_add(user,kstat_cpu(i).
cpustat.
user);00044:nice=cputime64_add(nice,kstat_cpu(i).
cpustat.
nice);00045:system=cputime64_add(system,kstat_cpu(i).
cpustat.
system);00046:idle=cputime64_add(idle,kstat_cpu(i).
cpustat.
idle);00047:idle=cputime64_add(idle,arch_idle_time(i));00048:iowait=cputime64_add(iowait,kstat_cpu(i).
cpustat.
iowait);00049:irq=cputime64_add(irq,kstat_cpu(i).
cpustat.
irq);00050:softirq=cputime64_add(softirq,kstat_cpu(i).
cpustat.
softirq);00051:steal=cputime64_add(steal,kstat_cpu(i).
cpustat.
steal);00052:guest=cputime64_add(guest,kstat_cpu(i).
cpustat.
guest);00053:sum+=kstat_cpu_irqs_sum(i);00054:sum+=arch_irq_stat_cpu(i);00055:00056:for(j=0;j来指定刷新频率,如top-d0.
1或top-d0.
01等.
top执行时,也可以按"s"键,修改时间间隔.
我们可以将CPU占用率刷新间隔设置很低,如0.
01秒.
但过低的刷新频率是否能够更准确观察到CPU占用率Linux系统提供的CPU占用率信息是否足够精确根据前面分析,我们已知Linux是根据/proc/stat文件的内容来计算CPU占用率,也就是精确度和/proc/stat提供的数据精确度有关.
那么(1)/proc/stat文件中的内容单位是什么(2)多久会刷新/proc/stat中的数据cpu92604160589490320280700cpu080047336772365803003.
1/proc/stat中的数据单位精度/proc/stat中CPU数据信息,单位是ticks.
内核中有个全局变量jiffies,来记录系统启动以来,经历的ticks数量.
cpu1130200368639630000ticks(滴答)就是系统时钟中断的时间间隔,该值与内核中HZ值有关,即ticks=1/HZ.
HZ值的大小,在内核编译时可配置的.
某台机器上是RHEL6.
1内核,配置的HZ值为1000.
[root@ssdboot]#uname-aLinuxssd2.
6.
32-131.
0.
15.
el6.
x86_64#1SMPTueMay1015:42:40EDT2011x86_64x86_64x86_64GNU/Linux[root@ssdboot]#catconfig-2.
6.
32-131.
0.
15.
el6.
x86_64|grepCONFIG_HZ#CONFIG_HZ_100isnotset#CONFIG_HZ_250isnotset#CONFIG_HZ_300isnotsetCONFIG_HZ_1000=yCONFIG_HZ=1000[root@ssdboot]#HZ的值,就是每秒的时钟中断数量.
可以观察/proc/interrupts中时钟中断值变化,来计算HZ的值.
当HZ的值为1000时,ticks的单位即为1/1000秒,即1ms.
Every5.
0s:cat/proc/interrupts|grepLOCTueMay1515:54:222012LOC:162124630859928013169953712695699115928523996415529616392358053205801703749626100422348133Localtimerinterrupts3.
2CPU利用率统计信息更新在时钟中断程序中,更新CPU利用信息,即每个ticks更新一次.
include/linux/kernel_stat.
h中,有相应函数接口,专门用来更新CPU利用率信息.
如account_user_time()是更新用户态CPU信息.
00111:/*00112:*Lock/unlockthecurrentrunqueue-toextracttaskstatistics:00113:*/00114:externunsignedlonglongttaasskk__ddeellttaa__eexxeecc(structtask_struct*);00115:00116:externvoidaaccccoouunntt__uusseerr__ttiimmee(structtask_struct*,cputime_t,cputime_t);00117:externvoidaaccccoouunntt__ssyysstteemm__ttiimmee(structtask_struct*,int,cputime_t,00117:cputime_t);00118:externvoidaaccccoouunntt__sstteeaall__ttiimmee(cputime_t);00119:externvoidaaccccoouunntt__iiddllee__ttiimmee(cputime_t);00120:00121:externvoidaaccccoouunntt__pprroocceessss__ttiicckk(structtask_struct*,intuser);00122:externvoidaaccccoouunntt__sstteeaall__ttiicckkss(unsignedlongticks);00123:externvoidaaccccoouunntt__iiddllee__ttiicckkss(unsignedlongticks);在内核中有一个perCPU变量kernel_stat,专门用来记录CPU利用信息.
其定义在include/linux/kernel_stat.
h中.
00039:DDEECCLLAARREE__PPEERR__CCPPUU(structkernel_stat,kstat);00040:00041:#definekstat_cpu(cpu)per_cpu(kstat,cpu)每次时钟中断时(ticks),就会更新kernel_stat变量中各个成员变量的值.
/proc/stat文件中的值,都是在程序读取时更新,内核并不会主动更新/proc/stat中的数据.
/proc/stat中的CPU信息是通过kernel_stat各个成员变量的值计算而来.
3.
3CPU利用率精确性分析通过前面分析,我们可以得出以下结论:(1)LinuxCPU占用率是根据/proc/stat文件中的数据计算而来;(2)/proc/stat中的数据精度为ticks,即1/HZ秒;(3)内核每个ticks会更新一次CPU使用信息;(4)CPU占用率的精度为1/HZ秒.
4LinuxCPU占用率是否准确有时偶尔会遇到类似问题:在稳定计算压力下,进程CPU占用率不稳定;或者特性进程CPU占用率明显不准.
即在系统切换次数很高时,Linux的CPU利用率计算机制可能不准确.
那么Linux的CPU利用率计算到底是否准确若可能不准确,则什么情况下出现这种情况4.
1LinuxCPU占用率不准确情形在前面分析中,Linux内核是在每次时钟中断时更新CPU使用情况,即1/HZ秒更新一次.
时钟中断时,只会看到当前正在运行的进程信息.
以下图为例,红色箭头表示时钟中断(TimerInterrupt).
第一次中断时,看到进程A在运行.
但进程A运行时间短,进程B运行.
第二次中断时,进程C运行;在第三次中断到来时,再次调度进程A执行.
第三次此中断时,进程C运行.
按照Linux内核CPU占用率统计方法,在第1次和第2次中断期间,内核并没有看到进程B在运行;于是就漏掉了进程B使用CPU的信息.
同样道理,在第2次和第3次中断期间,漏掉了进程B使用CPU的情况.
这样,就导致了Linux内核CPU占用率统计不准确.
发生CPU占用率不准确的原因是:在一个时钟中断周期内,发生了多次进程调度.
时钟中断的精度是1/HZ秒.
4.
2top命令CPU使用率准确吗只有在一个时钟中断周期内发生多次进程调度,才会出现CPU占用率不准的情况.
那么top命令中CPU使用率是否准确与进程调度频率有关.
若HZ的值为250,则ticks值为4ms;若HZ值为1000,则ticks值为1ms.
在HZ为250时,只要进程的调度间隔大于4ms,CPU占用率就准确.
HZ为1000时,调度间隔大于1ms,CPU占用率计算就准确.
进程调度次数少,CPU占用率就准确;调度时间间隔小于时钟中断,就可能不准确.
那么进程调度的时机是怎样的如何观察进程调度次数4.
2.
1进程调度时机进程状态转换的时刻:进程终止、进程睡眠进程要调用sleep()或exit()等函数进行状态转换,这些函数会主动调用调度程序进行进程调度;当前进程的时间片用完时(current->counter=0)由于进程的时间片是由时钟中断来更新的设备驱动程序当设备驱动程序执行长而重复的任务时,直接调用调度程序.
在每次反复循环中,驱动程序都检查need_resched的值,如果必要,则调用调度程序schedule()主动放弃CPU.
进程从中断、异常及系统调用返回到用户态时不管是从中断、异常还是系统调用返回,最终都调用ret_from_sys_call(),由这个函数进行调度标志的检测,如果必要,则调用调度程序.
那么,为什么从系统调用返回时要调用调度程序呢这当然是从效率考虑.
从系统调用返回意味着要离开内核态而返回到用户态,而状态的转换要花费一定的时间,因此,在返回到用户态前,系统把在内核态该处理的事全部做完.
4.
2.
2进程调度次数观察可以通过vmstat命令,来观察系统中进程切换次数,cs域的值就是切换次数.
HZ的值,可以通过内核配置文件来确定,若/proc/config.
gz存在,导出这个文件查看即可.
也可以通过查看/proc/sched_debug文件内容,来观察切换次数(nr_switches).
[root@ssdproc]#watch-d-n1'cat/proc/sched_debug|grepnr_switches'我们系统中的进程调度真的那么频繁吗大多数情况下,Linux中的CPU占用率计算机制是准确的.

onevps:新增(支付宝+中文网站),香港/新加坡/日本等9机房,1Gbps带宽,不限流量,仅需$4/月

onevps最新消息,为了更好服务中国区用户:1、网站支付方式新增了支付宝,即将增加微信;原信用卡、PayPal方式不变;(2)可以切换简体中文版网站,在网站顶部右上角找到那个米字旗,下拉可以换中国简体版本。VPS可选机房有:中国(香港)、新加坡、日本(东京)、美国(纽约、洛杉矶)、英国(伦敦)、荷兰(阿姆斯特丹)、瑞士(苏黎世)、德国(法兰克福)、澳大利亚(悉尼)。不管你的客户在亚太区域、美洲区...

香港 E5-2650 16G 10M 900元首月 美国 E5-2660 V2 16G 100M 688元/月 华纳云

华纳云双11钜惠出海:CN2海外物理服务器终身价688元/月,香港/美国机房,免费送20G DDos防御,50M CN2或100M国际带宽可选,(文内附带测评)华纳云作为一家专业的全球数据中心基础服务提供商,总部在香港,拥有香港政府颁发的商业登记证明,APNIC 和 ARIN 会员单位。主营香港服务器、美国服务器、香港/美国OpenStack云服务器、香港高防物理服务器、美国高防服务器、香港高防I...

PQS彼得巧 年中低至38折提供台湾彰化HiNet线路VPS主机 200M带宽

在六月初的时候有介绍过一次来自中国台湾的PQS彼得巧商家(在这里)。商家的特点是有提供台湾彰化HiNet线路VPS主机,起步带宽200M,从带宽速率看是不错的,不过价格也比较贵原价需要300多一个月,是不是很贵?当然懂的人可能会有需要。这次年中促销期间,商家也有提供一定的优惠。比如月付七折,年付达到38折,不过年付价格确实总价格比较高的。第一、商家优惠活动年付三八折优惠:PQS2021-618-C...

cpu使用率过高怎么办为你推荐
linux虚拟主机如何配置linux虚拟主机vps主机vps主机好吗?是不是垃圾?me域名me域名好不好用?美国vps租用VPS服务器租用哪里的好?香港虚拟空间香港虚拟空间哪家好?网站空间价格普通的网站空间要多少钱一年免备案虚拟主机免备案的虚拟主机在哪买好虚拟主机管理系统推荐几个适合windows的免费虚拟主机管理系统apache虚拟主机apache里面可以在虚拟主机里边设置虚拟目录吗?急,在线等!大连虚拟主机大连建网站哪里好?
虚拟主机评测网 便宜域名注册 高防服务器租用选锐一 花生壳免费域名申请 winhost linkcloud 搜狗抢票助手 刀片服务器的优势 泉州移动 世界测速 免费高速空间 免费申请网站 免费cdn 上海服务器 视频服务器是什么 西安主机 卡巴斯基官网下载 netvigator 双十二促销 重庆联通服务器托管 更多