Python系统信息模块Psutil介绍

[attach]336[/attach]         psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU 、内存、磁盘、网络等)信息,它主要应用于系统监控,分析和限制系统资源以及进程的管理。它可以实现等同于命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。目前支持32位和64位的Linux、Windows、OS X、FreeBSD和SunSolaris等操作系统,支持从2.4到3.4的python版本,目前最新版本为2.0.0。       通常我们获取操作系统信息往往采用编写shell脚本来实现,如获取当前系统的物理内存总大小和使用大小,shell命令如下:
物理内存total值: free -m |grep Mem |awk ‘{print $2}’
物理内存used值:free -m |grep Mem | awk ‘{print $3}’
    相比较而言,使用psutil库实现起来就更加简单了。psutil大小单位一般采用字节(Byte),如下:
>>> import psutil
[quote]>> mem = psutil.virtual_memory()
>>> mem.total,mem.used
(8361156608L, 8215703552L)
转换成M为单位的话可以如下:
>>> print mem.total/1024/1024,mem.used/1024/1024
7973 7835

psutil的安装

    centos下:
[root@crh]#yum search python |grep psutil
python26-psutil.x86_64 : A process and system utilities module for Python
所以我只需要yum -y install python26-psutil 就可以了
    源码安装:
[root@crh]#wget https://pypi.python.org/packages/source/p/psutil/psutil-2.0.0.tar.gz
[root@crh]#tar zxf psutil-2.0.0.tar.gz
[root@crh]#cd psutil-2.0.0
[root@crh]#python setup.py install
安装完成后,进入到python交互模式你可以导入试试。。。。

获取系统性能信息

    采集系统的基本性能信息包括(cpu、内存、磁盘、网络等,可以完整描述当前系统的运行的状态以及质量。psutil模块已经封装好了这些方法,用户可以根据自身的应用场景,调用相应的方法来满足需求,非常简单实用,那我们就开始来学习吧。走起。。。。。   1.CPU信息     Linux操作系统的CPU利用率主要有以下几个部分:
    []User Time, 执行用户进程的时间百分比;[/][]System Time,执行内核进程和中断的时间百分比;[/][]Wait IO, 由于IO等待而让CPU处于idle(空闲)状态的时间百分比;[/][]Idle, CPU处于idle状态的时间百分比。[/]
    我们使用Python的psutil.cpu_times()方法可以非常简单的获取到这些信息,同时也可以获取到CPU的硬件相关的信息,比如CPU的物理个数和逻辑个数,具体看下面的操作例子:
>>> import psutil
>>> psutil.cpu_times() [size=16]使用cpu_items方法获取CPU完整信息[/size]
cputimes(user=202656.94, nice=0.85999999999999999, system=83652.119999999995, idle=10823517.810000001, iowait=1242.27, irq=632.41999999999996, softirq=8720.3500000000004)[/quote]

[quote]>> psutil.cpu_times(percpu=True)  #[size=16]#显示所有逻辑CPU的信息,指定percpu=True就好[/size]
[cputimes(user=8798.4200000000001, nice=0.029999999999999999, system=4920.2399999999998, idle=1376294.9399999999, iowait=40.539999999999999, irq=0.01, softirq=24.239999999999998), cputimes(user=35990.419999999998, nice=0.20000000000000001, system=13513.059999999999, idle=1338291.54, iowait=431.29000000000002, irq=95.420000000000002, softirq=1756.3499999999999), cputimes(user=23382.98, nice=0.080000000000000002, system=9391.4300000000003, idle=1356101.8899999999, iowait=102.27, irq=48.829999999999998, softirq=1050.73), cputimes(user=36171.690000000002, nice=0.28999999999999998, system=13764.790000000001, idle=1337939.1399999999, iowait=383.88, irq=91.719999999999999, softirq=1726.6199999999999), cputimes(user=9241.1200000000008, nice=0.070000000000000007, system=5088.5100000000002, idle=1375672.72, iowait=36.68, irq=0.01, softirq=38.950000000000003), cputimes(user=35656.849999999999, nice=0.089999999999999997, system=13522.209999999999, idle=1339042.3700000001, iowait=114.27, irq=84.890000000000001, softirq=1657.29), cputimes(user=17315.099999999999, nice=0.0, system=9599.6100000000006, idle=1362112.8, iowait=28.25, irq=224.88999999999999, softirq=797.25999999999999), cputimes(user=36109.360000000001, nice=0.070000000000000007, system=13855.99, idle=1338251.4299999999, iowait=105.06999999999999, irq=86.640000000000001, softirq=1669.28)][/quote]

[quote]>> psutil.cpu_times().user [size=16]# 获取CPU的但单项数据,如用户的CPU时间比[/size]
202673.82000000001[/quote]

[quote]>> psutil.cpu_count()   [size=16]#获取cpu逻辑个数,默认logical=True       ****注释如果你的psutil的版本不对的话可能没有cpu_count这个方法[/size][/quote]

8

[quote]>> psutil.cpu_count(logical=False)  [size=16]#获取cpu的物理个数[/size][/quote]

1
2.内存信息     Linux 系统的内存信息涉及total(内存总数)、used(已使用的内存数)、free(空闲内存数)、buffers(缓冲使用数)、cache(缓存使用数)、swap(交换分区使用数)等,分别使用psutil.virtual_memory()与psutil.swap_memory()方法获取到这些信息。
>>> mem = psutil.virtual_memory()  #使用psutil.virtual_memory方法获取内存完整信息

[quote]>> mem[/quote]

svmem(total=8361156608L, available=5626871808L, percent=32.700000000000003, used=8166158336L, free=194998272L, active=2812674048, inactive=4402806784, buffers=290136064L, cached=5141737472)

[quote]>>[/quote]

[quote]>> mem.total/1024/1024  #获取内存总数[/quote]

7973L

[quote]>> mem.free/1024/1024  #获取内存空闲数[/quote]

185L

[quote]>> psutil.swap_memory() #获取swap分区信息[/quote]

sswap(total=8587182080L, used=143360L, free=8587038720L, percent=0.0, sin=0, sout=143360)
3.磁盘信息     在系统磁盘信息中我们比较关注的是磁盘的利用率和IO信息,其中磁盘利用率使用psutil.disk_usage方法获取。磁盘IO信息包括read_count(读IO数)、write_count(写IO数)、read_bytes(IO读字节数)、write_bytes(IO写字节数)、read_time(磁盘读时间)、write_time(磁盘写时间)等。这些IO信息可以使用psutil.disk_io_counters()获取。
>>> psutil.disk_partitions()        #使用psutil.disk_partions()获取磁盘完整信息

[sdiskpart(device=’/dev/sda2′, mountpoint=’/’, fstype=’ext3′, opts=’rw’), sdiskpart(device=’/dev/sda5′, mountpoint=’/data’, fstype=’ext3′, opts=’rw’), sdiskpart(device=’/dev/sda1′, mountpoint=’/boot’, fstype=’ext3′, opts=’rw’)]

[quote]>> psutil.disk_usage(‘/’)     [size=16]使用disk_usage方法指定参数获取指定分区的使用情况。[/size][/quote]

sdiskusage(total=52005134336, used=3963228160, free=45357588480, percent=7.5999999999999996)

[quote]>> psutil.disk_usage(‘/data’)   [size=16]使用disk_usage方法指定参数获取指定分区的使用情况。[/size][/quote]

sdiskusage(total=423282647040, used=32194187264, free=369240064000, percent=7.5999999999999996)

[quote]>> psutil.disk_io_counters()   #使用psutil.disk_io_counters获取硬盘总的IO个数读写信息[/quote]

sdiskio(read_count=95397, write_count=3333898, read_bytes=1524504064, write_bytes=90824263168, read_time=256049, write_time=20039375)

[quote]>> psutil.disk_io_counters(perdisk=True)   [size=16]”perdisk=True” 参数获取单个分区IO个数读写信息[/size][/quote]

{‘sda4′: sdiskio(read_count=5, write_count=0, read_bytes=5120, write_bytes=0, read_time=50, write_time=0), ‘sda5′: sdiskio(read_count=29679, write_count=1161203, read_bytes=594831360, write_bytes=46546737152, read_time=79547, write_time=12518375), ‘sda2′: sdiskio(read_count=65407, write_count=2172728, read_bytes=927507456, write_bytes=44279271424, read_time=175431, write_time=7521025), ‘sda3′: sdiskio(read_count=39, write_count=3, read_bytes=831488, write_bytes=143360, read_time=158, write_time=10), ‘sda1′: sdiskio(read_count=267, write_count=26, read_bytes=1328640, write_bytes=28160, read_time=863, write_time=32)}
4.网络信息     系统的网络信息和磁盘信息类似,涉及几个关键的点,包括bytes_sent(发送字节数)、bytes_recv(接受字节数)、packets_sent(发送数据包数)、packets_recv(接受数据包数)等。这些网络信息可以使用psutil.net_io_counters()方法获取。
>>> psutil.net_io_counters()     [size=16]使用psutil.net_io_counters获取到网络总的IO信息,默认pernic=False[/size]

snetio(bytes_sent=98373481869, bytes_recv=630483790117, packets_sent=869376956, packets_recv=894221315, errin=0, errout=0, dropin=0, dropout=0)

[quote]>> psutil.net_io_counters(pernic=True)   [size=16]pernic=True,输出每个网络接口的IO信息[/size][/quote]

{‘lo': snetio(bytes_sent=1064059797, bytes_recv=1064059797, packets_sent=6473544, packets_recv=6473544, errin=0, errout=0, dropin=0, dropout=0), ‘sit0′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth3′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth2′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth1′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth0′: snetio(bytes_sent=97313244366, bytes_recv=629446229973, packets_sent=862937674, packets_recv=887781757, errin=0, errout=0, dropin=0, dropout=0)}
5.其他一些系统信息      除了前面介绍的几个获取系统的基本信息的方法,psutil模块还支持获取用户登录、开机时间信息
>>> psutil.users()    #使用psutil.users方法获取当前登陆用户的信息

[suser(name=’root’, terminal=’pts/0′, host=’111.206.162.94′, started=1417013248.0)]

[quote]>> psutil.boot_time()   #使用psutil.boot_time方法获取开机时间,默认以linux时间戳返回[/quote]

1415455455.0

[quote]>> import datetime     [size=16]#导入datetime模块,格式化时间戳,转换成自然时间格式[/size][/quote]

[quote]>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime(“%Y-%M-%d %H:%M:%S”)[/quote]

‘2014-04-08 22:04:15′

系统进程管理方法

      获取当前系统的进程信息,可以让运维得知当前应用程序的运行状态,包括进程的启动时间,查看或设置CPU亲和度,内存使用率,IO信息,socket链接,线程数等。这些信息可以呈现出指定进程是否存活,资源利用情况,为开发人员的代码优化,问题定位提供了很好的数据参考。    1.进程信息     psutil模块在获取进程信息方面也提供了很好的支持,包括使用psutil.pids()方法获取所有进程PID,使用psutil.Process()方法获取单个进程的名称、路径、状态、系统资源利用率等信息。
>>> psutil.pids()  #获取所有进程的PID

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 105, 116, 117, 118, 119 …… ]

[quote]>> p = psutil.Process(5926)  #实例化一个Process对象,参数为一个进程PID[/quote]

[quote]>> p.name()  #进程名[/quote]

‘httpd’

[quote]>> p.exe()  #进程bin路径[/quote]

‘/usr/local/apache2/bin/httpd’

[quote]>> p.cwd()    #进程工作绝对路径目录[/quote]

‘/data/www/crh/monitor’

[quote]>> p.status()  #进程状态[/quote]

‘sleeping’

[quote]>> p.create_time()  #进程创建时间,时间戳格式[/quote]

1417019136.6400001

[quote]>> p.uids()    #进程uid信息[/quote]

puids(real=2, effective=2, saved=2)

[quote]>> p.gids()   #进程gid信息[/quote]

pgids(real=2, effective=2, saved=2)

[quote]>> p.cpu_times()  # 进程cpu时间信息[/quote]

pcputimes(user=0.68000000000000005, system=0.13)

[quote]>> p.memory_info()  #进程内存利用率[/quote]

pmem(rss=9306112, vms=147357696)

[quote]>> p.io_counters()  # 进程io信息,包括读写io数以及字节数[/quote]

pio(read_count=8390, write_count=1282, read_bytes=0, write_bytes=311296)

[quote]>> p.connections()  #返回打开进程socket的namedutples列表[/quote]

[pconn(fd=3, family=10, type=1, laddr=(‘::’, 8001), raddr=(), status=’LISTEN’)]

[quote]>> p.num_threads()   #进程开启线程数[/quote]

1
2.popen类的使用     psutil提供的popen类的作用是获取用户启动应用程序的信息,以便跟踪程序进程的允许状态。
>>> import psutil

[quote]>> from subprocess import PIPE[/quote]

[size=16]通过psutil的Popen方法启动应用程序,可以跟着应用程序的相关信息[/size]

[quote]>> p = psutil.Popen([“/usr/bin/python”, “-c”, “print (‘hello’)”], stdout=PIPE)[/quote]

[quote]>> p.name()[/quote]

‘python’

[quote]>> p.username()[/quote]

‘root’

[quote]>> p.communicate()[/quote]

(‘hello\n’, None)

[quote]>> p.cpu_times()[/quote]

pcputimes(user=0.02, system=0.060000000000000001)
 psutile更多方法参考:
https://github.com/giampaolo/psutil

模块说明官网:http://pythonhosted.org/psutil/


0 个评论

要回复文章请先登录注册