买卖装备小心中国最危险的电脑病毒毒自动交易,有同遭遇的吗

python使用psutil模块获取系统状态
作者:mindg
字体:[ ] 类型:转载 时间:
作为程序猿,大家可能都熟悉linux系统的基础信息获取方法都是通过shell来获取,但是在python中,我们还可以使用psutil模块来获取系统信息。psutil模块把shell查看系统基础信息的功能都包装了下,使用更加简单,功能丰富。
获取操作系统的当前运行状态和负载情况,是一个系统管理员的基本技能,因为这对我们日常排查故障,定位问题有着非常紧密的联系,比如查看当前系统的基本信息,例如cpu,内存,网络接收包情况,磁盘的使用率等就是我们日常系统管理员经常要关注的内容,既然这些信息如此重要,那能否每次登陆系统的时候自动给我们展示出来呢,其实解决这个问题很简单,我们可以写个脚本,这个脚本打印出我们关注的信息,然后把这个脚本放到.bashrc里,这样每次登陆系统就会自动调用这个脚本来运行,输出当前的系统信息,既然想清楚了,那就动手进入今天的主题,用我们今天的主角python的psutil模块来实现获取系统状态, 该模块可以获取正在运行的进程信息和系统的CPU及内存的利用率,这个模块功能非常强大,另外它还是跨平台的,在其它系统上也能很好的运行,往下我们来看一个实际的例子来展示下如何使用psutil模块:
#!/usr/bin/env python
#coding:utf-8
import psutil
import time
import sys
from optparse import OptionParser
parser = OptionParser()
parser.add_option("-t", "--time", dest="time",
help="此参数可查看当前下载占的带宽,-t是测试时间", metavar="10")
parser.add_option("-d", "--deamon",action="store_false", dest="deamon", default=True,
help="后台运行此脚本")
def Sysinfo():
Boot_Start = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(psutil.boot_time()))
time.sleep(0.5)
Cpu_usage = psutil.cpu_percent()
RAM = int(psutil.virtual_memory().total/())
RAM_percent = psutil.virtual_memory().percent
Swap = int(psutil.swap_memory().total/())
Swap_percent = psutil.swap_memory().percent
Net_sent = psutil.net_io_counters().bytes_sent
Net_recv = psutil.net_io_counters().bytes_recv
Net_spkg = psutil.net_io_counters().packets_sent
Net_rpkg = psutil.net_io_counters().packets_recv
BFH = r'%'
print " \033[1;32m开机时间:%s\033[1;m" % Boot_Start
print " \033[1;32m当前CPU使用率:%s%s\033[1;m" % (Cpu_usage,BFH)
print " \033[1;32m物理内存:%dM\t使用率:%s%s\033[1;m" % (RAM,RAM_percent,BFH)
print "\033[1;32mSwap内存:%dM\t使用率:%s%s\033[1;m" % (Swap,Swap_percent,BFH)
print " \033[1;32m发送:%d Byte\t发送包数:%d个\033[1;m" % (Net_sent,Net_spkg)
print " \033[1;32m接收:%d Byte\t接收包数:%d个\033[1;m" % (Net_recv,Net_rpkg)
for i in psutil.disk_partitions():
print " \033[1;32m盘符: %s 挂载点: %s 使用率: %s%s\033[1;m" % (i[0],i[1],psutil.disk_usage(i[1])[3],BFH)
def Net_io(s):
while True:
if x &= s:
r1 = psutil.net_io_counters().bytes_recv
time.sleep(1)
r2 = psutil.net_io_counters().bytes_recv
y = r2 - r1
print "%.2f Kb/s" % (y / 1024.0)
result = sum / x
print "\033[1;32m%s秒内平均速度:%.2f Kb/s \033[1;m" % (x,result / 1024.0)
if __name__ == "__main__":
(options, args) = parser.parse_args()
if options.time:
Net_io(int(options.time))
脚本运行方式有2种,如果不加参数可以直接输出当前操作系统信息,例如:
[root@test demo_script]# python get_sysinfo.py
开机时间: 15:21:19
当前CPU使用率:2.0%
物理内存:3991M 使用率:22.2%
Swap内存:0M
使用率:0.0%
发送: Byte 发送包数:个
接收: Byte
接收包数:个
盘符: /dev/xvda1 挂载点: / 使用率: 44.2%
另一种方式是加入-t参数,后面跟一个数字,查看给定秒内的平均网络速度,如下:
[root@test demo_script]# python get_sysinfo.py -t 10
10秒内平均速度:0.05 Kb/s
关于psutil模块的更多用法,大家可以查看这个网站,里面写的非常详细。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具android?基于Linux内核?cpu利用率计算总结
我的图书馆
android?基于Linux内核?cpu利用率计算总结
android&基于Linux内核&cpu利用率计算总结
Linux平台Cpu使用率的计算&
proc文件系统&
/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为内核与进程提供通信的接口。用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取/proc目录中的文件时,proc文件系统是动态从系统内核读出所需信息并提交的。&
/proc目录中有一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程在/proc下都对应一个以进程号为目录名的目录/proc/pid,它们是读取进程信息的接口。此外,在Linux&2.6.0-test6以上的版本中/proc/pid目录中有一个task目录,/proc/pid/task目录中也有一些以该进程所拥有的线程的线程号命名的目录/proc/pid/task/tid,它们是读取线程信息的接口。&
/proc/cpuinfo文件&
&&&&&&&&&该文件中存放了有关&cpu的相关信息(型号,缓存大小等)。&
[zhengangen@buick&~]$&cat&/proc/cpuinfo&
processor&&&&&&&:&0&
vendor_id&&&&&&&:&GenuineIntel&
cpu&family&&&&&&:&15&
model&&&&&&&&&&&:&4&
model&name&&&&&&:&Intel(R)&Xeon(TM)&CPU&3.00GHz&
stepping&&&&&&&&:&10&
cpu&MHz&&&&&&&&&:&&
cache&size&&&&&&:&2048&KB&
physical&id&&&&&:&0&
siblings&&&&&&&&:&2&
core&id&&&&&&&&&:&0&
cpu&cores&&&&&&&:&1&
fdiv_bug&&&&&&&&:&no&
hlt_bug&&&&&&&&&:&no&
f00f_bug&&&&&&&&:&no&
coma_bug&&&&&&&&:&no&
fpu&&&&&&&&&&&&&:&yes&
fpu_exception&&&:&yes&
cpuid&level&&&&&:&5&
wp&&&&&&&&&&&&&&:&yes&
flags&&&&&&&&&&&:&fpu&vme&de&pse&tsc&msr&pae&mce&cx8&apic&mtrr&pge&mca&cmov&pat&pse36&clflush&dts&acpi&mmx&fxsr&sse&sse2&ss&ht&tm&pbe&lm&pni&monitor&ds_cpl&cid&xtpr&
bogomips&&&&&&&&:&6004.52&
说明:以下只解释对我们计算Cpu使用率有用的相关参数。&
&&&&&&&&&参数&&&&&&&&&&&&&&&&&&&&&&&&&&&&解释&
processor&(0)&&&&&&&&&&&&&&&&&&&&&&&cpu的一个物理标识&
结论1:可以通过该文件根据processor出现的次数统计cpu的逻辑个数(包括多核、超线程)。&
/proc/stat文件&
&&&&&&&&&该文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。不同内核版本中该文件的格式可能不大一致,以下通过实例来说明数据该文件中各字段的含义。&
实例数据:2.6.24-24版本上的&
fjzag@fjzag-desktop:~$&cat&/proc/stat&
cpu&&38082&627&27594&893908&12256&581&895&0&0&
cpu0&22880&472&16855&430287&10617&576&661&0&0&
cpu1&15202&154&10739&463620&1639&4&234&0&0&
intr&120053&222&2686&0&1&1&0&5&0&3&0&0&0&47302&0&0&34194&29775&0&5019&845&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&
ctxt&1434984&
processes&8113&
procs_running&1&
procs_blocked&0&
第一行的数值表示的是CPU总的使用情况,所以我们只要用第一行的数字计算就可以了。下表解析第一行各数值的含义:&
参数&&&&&&&&&&解析(单位:jiffies)&
(jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数,在linux中,一个节拍大致可理解为操作系统进程调度的最小时间片,不同linux内核可能值有不同,通常在1ms到10ms之间)&
user&(38082)&&&&从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含&nice值为负进程。&
nice&(627)&&&&&&从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间&
system&(27594)&&从系统启动开始累计到当前时刻,处于核心态的运行时间&
idle&(893908)&&&从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间iowait&(12256)&从系统启动开始累计到当前时刻,IO等待时间(since&2.5.41)&
irq&(581)&&&&&&&&&&&从系统启动开始累计到当前时刻,硬中断时间(since&2.6.0-test4)&
softirq&(895)&&&&&&从系统启动开始累计到当前时刻,软中断时间(since&2.6.0-test4)stealstolen(0)&&&&&&&&&&&&&&&&&&&which&is&the&time&spent&in&other&operating&systems&when&running&in&a&virtualized&environment(since&2.6.11)&
guest(0)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&which&is&the&time&spent&running&a&virtual&&CPU&&for&&guest&operating&systems&under&the&control&of&the&Linux&kernel(since&2.6.24)&
结论2:总的cpu时间totalCpuTime&=&user&+&nice&+&system&+&idle&+&iowait&+&irq&+&softirq&+&stealstolen&&+&&guest&
/proc/&pid&/stat文件&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
该文件包含了某一进程所有的活动的信息,该文件中的所有值都是从系统启动开始累计&
到当前时刻。以下通过实例数据来说明该文件中各字段的含义。&
[zhengangen@buick&~]#&cat&/proc/6873/stat&
6873&(a.out)&R&6723&6873&6723&34819&6873&8388608&77&0&0&0&41958&31&0&0&25&0&3&0&5882654&1409024&56&&&&&0&2097798&0&0&0&0&0&0&0&17&0&0&0&
说明:以下只解释对我们计算Cpu使用率有用相关参数&
参数&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&解释&
pid=6873&&&&&&&&&&&&&&&&&&&&&&&&&&&&进程号&
utime=1587&&&&&&&&&&&&&&&&&&&&&&&该任务在用户态运行的时间,单位为jiffies&
stime=41958&&&&&&&&&&&&&&&&&&&&&&该任务在核心态运行的时间,单位为jiffies&
cutime=0&&&&&&&&&&&&&&&&&&&&&&&&&&&&所有已死线程在用户态运行的时间,单位为jiffies&
cstime=0&&&&&&&&&&&&&&&&&&&&&&&&&&&&所有已死在核心态运行的时间,单位为jiffies&
结论3:进程的总Cpu时间processCpuTime&=&utime&+&stime&+&cutime&+&cstime,该值包括其所有线程的cpu时间。&
/proc/&pid&/task/&tid&/stat文件&
该文件包含了某一进程所有的活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。该文件的内容格式以及各字段的含义同/proc/&pid&/stat文件。&
&&&&&&&&&注意,该文件中的tid字段表示的不再是进程号,而是linux中的轻量级进程(lwp),即我们通常所说的线程。&
结论4:线程Cpu时间threadCpuTime&=&utime&+&stime&
系统中有关进程cpu使用率的常用命令&
通过ps命令可以查看系统中相关进程的Cpu使用率的信息。以下在linux&man文档中对ps命令输出中有关cpu使用率的解释:&
CPU&usage&is&currently&expressed&as&the&percentage&of&time&spent&running&during&the&entire&lifetime&of&a&process.&This&is&not&ideal,&and&it&does&not&conform&to&the&standards&that&ps&otherwise&conforms&to.&CPU&usage&is&unlikely&to&add&up&to&exactly&100%.&
%cpu&&&cpu&utilization&of&the&process&in&"##.#"&format.&It&is&the&CPU&time&used&&&&&&&&&&&&&&&&&&&&&&&&&&&divided&by&the&time&the&process&has&been&running&(cputime/realtime&ratio),&&&&&&&&&&&&&&&&&&&&&&&&&&&expressed&as&a&percentage.&It&will&not&add&up&to&100%&unless&you&are&lucky.&
结论5:ps命令算出来的cpu使用率相对于进程启动时的平均值,随着进程运行时间的增大,该值会趋向于平缓。&
通过top命令可以查看系统中相关进程的实时信息(cpu使用率等)。以下是man文档中对top命令输出中有关进程cpu使用率的解释。&
#C&&--&&Last&used&CPU&(SMP)&&&&&&&&&&&&&&&&&&&A&number&representing&the&last&used&processor.&In&a&true&&SMP&&environment&&this&&will&&likely&change&&frequently&&since&&the&&kernel&intentionally&uses&weak&affinity.&&Also,&the&very&act&of&running&top&may&break&this&weak&affinity&and&cause&more&processes&to&&change&&CPUs&&more&&often&(because&of&the&extra&demand&for&cpu&time).&
%CPU&&--&&CPU&usage&&&&&&&&&&&&&&&&&&&The&&task’s&share&of&the&elapsed&CPU&time&since&the&last&screen&update,&expressed&as&a&percent-age&of&total&CPU&time.&&In&a&true&SMP&environment,&if&&Irix&mode&is&Off,&top&will&operate&in&Solaris&mode&where&a&task’s&cpu&usage&will&be&divided&by&the&total&number&of&CPUs.&
结论6:某一个线程在其运行期间其所使用的cpu可能会发生变化。&
结论7:在多核的情况下top命令输出的cpu使用率实质是按cpu个数*100%计算的。&
单核情况下Cpu使用率的计算&
通过读取/proc/stat&、/proc/&pid&/stat、/proc/&pid&/task/&tid&/stat以及/proc/cpuinfo这几个文件获取总的Cpu时间、进程的Cpu时间、线程的Cpu时间以及Cpu的个数的信息,然后通过一定的算法进行计算(采样两个足够短的时间间隔的Cpu快照与进程快照来计算进程的Cpu使用率)。&
总的Cpu使用率计算&
计算方法:&
1、&&采样两个足够短的时间间隔的Cpu快照,分别记作t1,t2,其中t1、t2的结构均为:&
(user、nice、system、idle、iowait、irq、softirq、stealstolen、guest)的9元组;&
2、&&计算总的Cpu时间片totalCpuTime&
a)&&&&&&&&&把第一次的所有cpu使用情况求和,得到s1;&
b)&&&&&&&&&把第二次的所有cpu使用情况求和,得到s2;&
c)&&&&&&&&&s2&-&s1得到这个时间间隔内的所有时间片,即totalCpuTime&=&j2&-&j1&;&
3、计算空闲时间idle&
idle对应第四列的数据,用第二次的第四列&-&第一次的第四列即可&
idle=第二次的第四列&-&第一次的第四列&
6、计算cpu使用率&
pcpu&=100*&(total-idle)/total&
某一进程Cpu使用率的计算&
计算方法:&&
1.&&&&&&&&&&&&&&&采样两个足够短的时间间隔的cpu快照与进程快照,&
a)&&&&&&&&&每一个cpu快照均为(user、nice、system、idle、iowait、irq、softirq、stealstolen、guest)的9元组;&
b)&&&&&&&&&每一个进程快照均为&(utime、stime、cutime、cstime)的4元组;&
2.&&&&&&&&&&&&&&&分别根据结论2、结论3计算出两个时刻的总的cpu时间与进程的cpu时间,分别记作:totalCpuTime1、totalCpuTime2、processCpuTime1、processCpuTime2&
3.&&&&&&&&&&&&&&&计算该进程的cpu使用率pcpu&=&100*(&processCpuTime2&–&processCpuTime1)&/&(totalCpuTime2&–&totalCpuTime1)&(按100%计算,如果是多核情况下还需乘以cpu的个数);&
实验一:&监控一空循环的进程的cpu使用率。&
说明:左边的数据是按以上算法得到的数据,其中采样的时间间隔与top命令刷新屏幕的时间间隔相同。&
按以上方法计算得到的cpu使用率&
通过top命令得到的&
98.333336&
PID&&&&USER&&&&&&PR&&&NI&&&VIRT&&&RES&&&SHR&&&S&&%CPU&%MEM&&TIME+&&COMMAND&
7639&fjzag&&&&&20&&&0&&206m&&10m&7136&S&&&99&&2.2&&&1:00.74&java&&&&&&&&&&&&&&
7639&fjzag&&&&&20&&&0&&206m&&10m&7136&S&&&99&&2.2&&&1:03.71&java&&&&&&&&&&&&&&
7639&fjzag&&&&&20&&&0&&206m&&10m&7136&S&&&99&&2.2&&&1:06.67&java&&&&&&&&&&&&&&
7639&fjzag&&&&&20&&&0&&206m&&10m&7136&S&&&99&&2.2&&&1:09.63&java&&&&&&&&&&&&&&
7639&fjzag&&&&&20&&&0&&206m&&10m&7136&S&&&98&&2.2&&&1:12.59&java&&&&&&&&&&&&&&
7639&fjzag&&&&&20&&&0&&206m&&10m&7136&S&&&99&&2.2&&&1:15.55&java&&&&&&&&&&&&&&
7639&fjzag&&&&&20&&&0&&206m&&10m&7136&S&&100&&2.2&&&1:18.55&java&&&&&&&&&&&&&&
7639&fjzag&&&&&20&&&0&&206m&&10m&7136&S&&100&&2.2&&&1:21.54&java&&&&&&&&&&&&&&
7639&fjzag&&&&&20&&&0&&206m&&10m&7136&S&&&99&&2.2&&&1:24.52&java&&&&&&&&&&&&&&
7639&fjzag&&&&&20&&&0&&206m&&10m&7136&S&&&98&&2.2&&&1:27.46&java&
实验二:&监控jconsole进程的cpu使用率。&
说明:左边的数据是按以上算法得到的数据,其中采样的时间间隔与top命令刷新屏幕的时间间隔相同。&
按以上方法计算得到的cpu使用率&
通过top命令得到的&
10.350584&
7.6539097&
7.6539097&
13.021703&
PID&&&USER&&&&&&PR&&&NI&&VIRT&&&RES&&&SHR&&S&&%CPU&%MEM&&TIME+&&COMMAND&
7753&fjzag&&&&&20&&&0&&252m&&72m&&22m&S&&&10&14.4&&&0:18.70&jconsole&&&&&&&&&&
7753&fjzag&&&&&20&&&0&&252m&&72m&&22m&S&&&12&14.4&&&0:19.07&jconsole&&&&&&&&&&
7753&fjzag&&&&&20&&&0&&252m&&72m&&22m&S&&&11&14.4&&&0:19.39&jconsole&&&&&&&&&&
7753&fjzag&&&&&20&&&0&&252m&&72m&&22m&S&&&&7&14.4&&&0:19.61&jconsole&&&&&&&&&&
7753&fjzag&&&&&20&&&0&&252m&&72m&&22m&S&&&&7&14.4&&&0:19.83&jconsole&&&&&&&&&&
7753&fjzag&&&&&20&&&0&&252m&&72m&&22m&S&&&&5&14.4&&&0:19.97&jconsole&&&&&&&&&&
7753&fjzag&&&&&20&&&0&&252m&&72m&&22m&S&&&14&14.4&&&0:20.38&jconsole&&&&&&&&&&
7753&fjzag&&&&&20&&&0&&252m&&72m&&22m&S&&&10&14.4&&&0:20.68&jconsole&&&&&&&&&&
7753&fjzag&&&&&20&&&0&&252m&&72m&&22m&S&&&&9&14.5&&&0:20.96&jconsole&
某一线程Cpu使用率的计算&
计算方法:&&
1.&&&&&&&&&&&&&&&采样两个足够短的时间隔的cpu快照与线程快照,&
a)&&&&&&&&&每一个cpu快照均为(user、nice、system、idle、iowait、irq、softirq、stealstealon、guest)的9元组;&
b)&&&&&&&&&每一个线程快照均为&(utime、stime)的2元组;&
2.&&&&&&&&&&&&&&&分别根据结论2、结论4计算出两个时刻的总的cpu时间与线程的cpu时间,分别记作:totalCpuTime1、totalCpuTime2、threadCpuTime1、threadCpuTime2&
3.&&&&&&&&&&&&&&&计算该线程的cpu使用率pcpu&=&100*(&threadCpuTime2&–&threadCpuTime1)&/&(totalCpuTime2&–&totalCpuTime1)&(按100%计算,如果是多核情况下还需乘以cpu的个数);&
实验一:&监控一空循环的线程的cpu使用率。&
说明:左边的数据是按以上算法得到的数据,其中采样的时间间隔与top命令刷新屏幕的时间间隔相同。&
按以上方法计算得到的cpu使用率&
通过top命令得到的&
98.169716&
97.333336&
PID&&&&USER&&&&&&PR&&&NI&&&VIRT&&&RES&&&SHR&&&S&&%CPU&%MEM&&TIME+&&COMMAND&
7649&fjzag&&&&&20&&&0&&206m&&10m&7136&R&&&97&&2.2&&&7:22.94&java&&&&&&&&&&&&&&
7649&fjzag&&&&&20&&&0&&206m&&10m&7136&R&&&97&&2.2&&&7:25.86&java&&&&&&&&&&&&&&
7649&fjzag&&&&&20&&&0&&206m&&10m&7136&R&&&97&&2.2&&&7:28.76&java&&&&&&&&&&&&&&
7649&fjzag&&&&&20&&&0&&206m&&10m&7136&R&&&99&&2.2&&&7:31.72&java&&&&&&&&&&&&&&
7649&fjzag&&&&&20&&&0&&206m&&10m&7136&R&&&98&&2.2&&&7:34.65&java&&&&&&&&&&&&&&
7649&fjzag&&&&&20&&&0&&206m&&10m&7136&R&&&96&&2.2&&&7:37.53&java&&&&&&&&&&&&&&
7649&fjzag&&&&&20&&&0&&206m&&10m&7136&R&&&98&&2.2&&&7:40.47&java&&&&&&&&&&&&&&
7649&fjzag&&&&&20&&&0&&206m&&10m&7136&R&&&96&&2.2&&&7:43.34&java&&&&&&&&&&&&&&
7649&fjzag&&&&&20&&&0&&206m&&10m&7136&R&&&97&&2.2&&&7:46.25&java&
实验二:&监控jconsole程序某一线程的cpu使用率。&
说明:左边的数据是按以上算法得到的数据,其中采样的时间间隔与top命令刷新屏幕的时间间隔相同。&
按以上方法计算得到的cpu使用率&
通过top命令得到的&
1.3400335&
1.3333334&
0.6677796&
0.6666667&
1.3333334&
1.3333334&
PID&&&&USER&&&&&&PR&&&NI&&&VIRT&&&RES&&SHR&&S&&%CPU&%MEM&&TIME+&&COMMAND&
7755&fjzag&&&&&20&&&0&&251m&&72m&&22m&S&&&&1&14.4&&&0:11.92&jconsole&&&&&&&&&&
7755&fjzag&&&&&20&&&0&&251m&&72m&&22m&S&&&&7&14.4&&&0:12.12&jconsole&&&&&&&&&&
7755&fjzag&&&&&20&&&0&&251m&&72m&&22m&S&&&&2&14.4&&&0:12.18&jconsole&&&&&&&&&&
7755&fjzag&&&&&20&&&0&&251m&&72m&&22m&S&&&&0&14.4&&&0:12.18&jconsole&&&&&&&&&&
7755&fjzag&&&&&20&&&0&&251m&&72m&&22m&S&&&&1&14.4&&&0:12.20&jconsole&&&&&&&&&&
7755&fjzag&&&&&20&&&0&&251m&&72m&&22m&S&&&&1&14.4&&&0:12.24&jconsole&&&&&&&&&&
7755&fjzag&&&&&20&&&0&&251m&&72m&&22m&S&&&&1&14.4&&&0:12.28&jconsole&
多核情况下cpu使用率的计算&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
以下通过实验数据来说明多核情况下某一进程cpu使用率是按cpu个数*100%计算的.&
在双核的情况下作的一组实验,第一组数据是通过ps&&-eLo&pid,lwp,pcpu&|&grep&9140命令查看进程号为9140的进程中各线程的详细信息。第二组数据是通过&ps命令查看进程号为9140进程的cpu使用率。&
pid&&&lwp&&%cpu&
9140&&9140&&0.0&
9140&&9141&&0.0&
9140&&9142&&0.0&
9140&&9143&&0.0&
9140&&9144&&0.0&
9140&&9149&&0.0&
9140&&9150&&0.0&
9140&&9151&&0.0&
9140&&9152&&0.1&
9140&&9153&96.6&&&&&&&&&&&&&&&&&&&&&&&&&该线程是一个空循环&
9140&&9154&95.9&&&&&&&&&&&&&&&&&&&&&&&&&该线程是一个空循环&
以上除了红色标注出来的两个线程以外,其他的线程都是后台线程。&
pid&&&%cpu&
9140&&193&
在单核的情况下作的一组实验,第一组数据是通过ps&&-eLo&pid,lwp,pcpu&|&grep&6137命令查看进程号为6137的进程中各线程的详细信息。第二组数据是通过&ps命令查看进程号为6137进程的cpu使用率。&
pid&&&&lwp&&&%cpu&
6137&&6137&&0.0&
6137&&6138&&0.1&
6137&&6143&&0.0&
6137&&6144&&0.0&
6137&&6145&&0.0&
6137&&6146&&0.0&
6137&&6147&&0.0&
6137&&6148&&0.0&
6137&&6149&&0.0&
6137&&6150&46.9&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&空循环线程&
6137&&6151&46.9&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&空循环线程&
以上除了红色标注出来的两个线程以外,其他的线程都是后台线程。&
6137&92.9&
主要问题:&
1.&&&&&&&不同内核版本/proc/stat文件格式不大一致。/proc/stat文件中第一行为总的cpu使用情况。&
各个版本都有的4个字段:&user、nice、system、idle&
2.5.41版本新增字段:iowait&
2.6.0-test4新增字段:irq、softirq&
2.6.11新增字段:stealstolen&:&&&&&&&&&&&&&&&&&&&&which&is&the&time&spent&in&other&operating&
systems&when&running&in&a&virtualized&environment&
2.6.24新增字段:guest:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&which&is&the&time&spent&running&a&virtual&&CPU&&for&&guest&operating&systems&under&the&control&of&the&Linux&kernel&
2./proc/pid/task目录是Linux&2.6.0-test6之后才有的功能。&
3.关于出现cpu使用率为负的情况,目前想到的解决方案是如果出现负值,连续采样计算cpu使用率直到为非负。&
4.&有些线程生命周期较短,可能在我们采样期间就已经死掉了.&
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&浅谈Linux下CPU利用率和CPU负载及其代码实现原理 - 推酷
浅谈Linux下CPU利用率和CPU负载及其代码实现原理
编者注: 本来想写个简单的程序测试CPU利用率,后来代码实现后与top(ps)命令测试的结果做对比,疑惑了,疑惑后有了此文……
第一节 & 祸起
本来就是想通过写个小程序测试CPU利用率从而可以检验其他的工具性能之类的数据,后来参照IPbench中的cpu_target_lukem插件实现我们的功能,简单描述下原理:我们运行一个优先级很低的进程,它占有了CPU的闲暇时间,我们用CPU某段循环内闲暇时间除以该时段总时间则可得到CPU利用率。主要功能实现代码如下:
x0 = get_cycles();
//last cycle count values
while (calc) {
//last cycle count values gives to x1
x0 = get_cycles();
//the current
count values
delta = x0 - x1;
//adds ?t to a running total
/* If the delta looks like less than a context switch,a otherwise add it to busy time */
if (delta & PROFILE_CONTEXT_COST)
timer_buffer.idle =
timer_buffer.total =
从而本程序中的
CPU利用率 = (1- timer_buffer.idle/timer_buffer.total)*100 %,
之后我们编译运行本程序,程序输出为:
[11:43.32] dbg: Average CPU time is 5.2
这时候我们使用 &
&命令,会找到这一条信息: &
long & & 11741
&0.0 &19668 & 520 pts/16 & SNl+ 11:40 & 2:58 ./a.out
熟悉ps命令的童鞋们知道,
该进程所属用户;
该进程的PID号;
表示该进程的CPU占用率为95.7%;
表示该进程的物理内存占用率为0%;
表示该进程占用了多少虚拟内存量;
表示该进程占用了多少固定内存量;
表示登陆端口;
和上面介绍的进程状态一样(R/S/D/T/Z进程);
该进程触发启动的时间;
表示该进程占用CPU的时间;
表示触动该进程的命令 。
所以ps命令显示的是我们a.out的CPU利用率高达95.7%。
接着,我做了第二个测试,我把a.out拷贝了一份b.out,同时运行他们我们会看到如下信息:
a.out 显示的 :
[11:47.50] dbg: Average CPU time is 6.1
b.out 显示的s :
[11:48.20] dbg: Average CPU time is 10.2
这时候我使用 &
& 再查看a.out和b.out信息如下:
long & & 11741
&0.0 &19668 & 520 pts/16 & SNl+ 11:40 & 7:26 ./a.out
<span style="color:#.0 &19668 & 516 pts/17 & SNl+ 11:46 & 2:08 ./b.out
卧槽,顿时崩溃啊!到了这,我产生了三个疑问:第一、
为毛运行a.out和b.out显示的CPU利用率不一样……第二、为毛在ps中显示的
a.out和b.out的CPU利用率不一样?第三、为毛ps中
a.out和b.out的CPU利用率分别为94.1%和90.0%,而两者加一起远远大于100%?!!我晕了,那Linux到底是如何定义CPU利用率的呢?
第二节 & CPU利用率和CPU负载
& & & 在Linux/Unix下,CPU利用率(CPU utilization)分为用户态,系统态和空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间。平时所说的CPU利用率是指:CPU执行非系统空闲进程的时间 / CPU总的执行时间。(上述代码中使用的方法为:
1 - CPU空闲运行时间/总运行时间
&,与这个计算方法原理上是一样的)
& & & 在Linux的内核中,有一个全局变量:Jiffies。 Jiffies代表时间。它的单位随硬件平台的
不同而不同,系统里定义了一个常数HZ----代表每秒种最小时间间隔的数目。这样jiffies的单位就是1/HZ。Intel平台jiffies的单位是1/100秒,这就是系统所能分辨的最小时间间隔了。每个CPU时间片,Jiffies都要加1。 CPU的利用率就是用执行用户态+系统态的Jiffies除以总的Jifffies来表示。
& & & 那么,还有一个经常容易与CPU利用率
CPU utilization
混淆的词 -- CPU负载(CPU load)。
CPU负载取决于
CPU队列长度而不是
CPU利用率,因为一个主机负载过重时,它的CPU利用率会接近100%,从而无法准确反应负载状况,而使用CPU队列长度则可以很直接反应CPU的负载量。比如说两个系统,其中一个系统有3个进程在队列中,而另一台有6个进程在队列,如果使用CPU利用率表示负载水平,他们可能都是接近100%,而使用CPU队列长度他们的负载量完全不同。
& & & 实际上Linux系统中很多都是用CPU负载均值(load average)来代表当前系统的负载状况,比如使用
long@long-Ubuntu:~$ top
top - 20:12:45 up
load average: 1.16, 1.27, 1.14
Tasks: 208 total,
1 running, 206 sleeping,
0 stopped,
%Cpu(s): 11.8 us,
0.0 ni, 84.4 id,
2067372 total,
1998832 used,
68540 free,
54104 buffers
2095100 total,
25540 used,
2069560 free,
449612 cached
11:31.39 rhythmbox
61m 4804 S
8:34.14 Xorg
6:01.53 pulseaudio
0:23.38 gnome-terminal
在第一行的最后显示的为 “
load average: 1.16 , &1.27 &,1.14
”命令,效果也是类似:
long@long-Ubuntu:~$ uptime
20:15:01 up
load average: 0.43, 0.97, 1.05
这三个数分别是:一分钟内、五分钟内、十五分钟内的系统负载均值。也就是说,从右向左看这几个数据,我们可以判断系统负载的发展趋势。
事实上,这正是CPU负载所需要测量的,因为负载均值不包括那些等待I/O、网络、数据或者其他不依赖CPU的进程或线程,它关注的仅仅是积极要求CPU时间的进程或线程。这与CPU利用率是有很大不同的。
负载均值与CPU利用率在两个方面有很大的区别:
& & 1)&负载均值用来估量CPU利用率的发展趋势,而不是某一时刻的状况
& & 2) 负载均值包括所有CPU的需求,而不仅仅是在测量时活跃的
第三节 & 如何计算CPU利用率
在Linux系统中,可以用/proc/stat文件来计算cpu的利用率(
)。这个文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。
long@long-Ubuntu:~$ cat /proc/stat
4 557 0 0 0
0 0 0 1 1 0 0 0 0 0 0 0 0
156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
processes 10118
procs_running 1
procs_blocked 0
8 92 0 8 7
输出解释:
(CPU 以及CPU0、CPU1、CPU2、CPU3每行的每个参数意思(以第一行为例))
& && & & & & & &&
user (426215)&
从系统启动开始累计到当前时刻,
用户态的CPU时间
(单位:jiffies) ,不包含 nice值为负进程。1jiffies=0.01秒
nice (701)
从系统启动开始累计到当前时刻,
nice值为负的进程所占用的CPU时间
(单位:jiffies)
system (115732)
从系统启动开始累计到当前时刻,
(单位:jiffies)
idle (2023866)
从系统启动开始累计到当前时刻,除硬盘IO等待时间以外
其它等待时间
(单位:jiffies)
iowait (27329)
从系统启动开始累计到当前时刻,
硬盘IO等待时间
(单位:jiffies) ,
从系统启动开始累计到当前时刻,
硬中断时间
(单位:jiffies)
softirq (557)&
从系统启动开始累计到当前时刻,
软中断时间
(单位:jiffies)
CPU时间=user+system+nice+idle+iowait+irq+softirq
“intr”这行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。
“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。
“btime”给出了从系统启动到现在为止的时间,单位为秒。
“processes (total_forks) 自系统启动以来所创建的任务的个数目。
“procs_running”:当前运行队列的任务的数目。
“procs_blocked”:当前被阻塞的任务的数目。
那么CPU利用率可以使用以下两个方法。先取两个采样点,然后计算其差值:
cpu usage=(idle2-idle1)/(cpu2-cpu1)*100
cpu usage=[(user_2 +sys_2+nice_2) - (user_1 + sys_1+nice_1)]/(total_2 - total_1)*100
第四节 & Linux提供的一些查看系统信息的工具
使用下面这些命令我们可以查询总的CPU使用率、单独的CPU使用率(对于对称多处理机器SMP)、从你上次启动后的平均CPU使用率等。
老当益壮的top命令
使用top命令可以动态的查看CPU使用率。它会现实当前内核管理着的任务信息,它还会显示上线时间、负载均值、物理和交换内存使用状况。使用如下:
& & & & & & $ top
按Q键推出top。
4.2 & 使用&mpstat&命令
使用这个命令,你需要先安装sysstat工具,对于Debian或Ubuntu用户,可以通过apt-get直接安装:
& & & & & & $ apt-get install sysstat
使用如下命令查看CPU使用率信息:
& & & & & & $ mpstat
使用如下命令可以监控单独的CPU使用率信息:
& & & & & & $ mpstat -P ALL
4.3 & 使用&sar&命令
使用sar命令显示CPU使用率的语法如下:
& & & & & & $ sar -u 2 5 &( sar [ 选项 ] [ &时间间隔& [ &次数& ] ])
这条命令会现实2秒内的CPU使用率,总共显示5次。
4.4 & 使用&iostat&命令
&iostat&命令可以用来查询从系统启动以来的是CPU平均使用率以及设备或者分区的I/O状况:
& & & & & & $ iostat
4.5 & GUI Tools 一些有图形界面的工具
KDE桌面环境有一些系统监控器一类的工具可以用来监控CPU使用率甚至更多的系统信息(比如说CPU负载状况、物理内存以及交换分区的数据占用信息),你还可以使用它来杀死一些进程。
下表总结了若干Linux下的工具:
& & &&& & & & & 简单介绍
查看进程活动状态以及一些系统状况
查看系统状态、硬件和系统信息等
查看CPU 负载,硬盘状况
综合工具,查看系统状况
查看多处理器状况
查看网络状况
实时网络状况监测
抓取网络数据包,详细分析
查看多处理器状况
&数据包分析工具
网络带宽工具
综合工具,综合了 vmstat, iostat, ifstat, netstat 等多个信息
& & & & & & & &[1] &
& & & & & & & &[2] &
& & & & & & & &[3] &
& & & & & & & &[4] &
& & & & & & & &[5] &
&([4]的中文翻译版)
& & & & & & & &[6] &
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 最恐怖的电脑病毒 的文章

 

随机推荐