psutil是一个跨平台库,能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)。它主要应用于系统监控,分析和限制系统资源及进程的管理。它实现了同等命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、nice、ionice、iostat、iotop、uptime等,下面我们来安装psutil模块,学着使用它吧。
一、psutil模块下载安装
wget https://pypi.python.org/packages/source/p/psutil/psutil-3.2.1.tar.gz --no-check-certificatetar zxvf psutil-3.2.1.tar.gz cd psutil-3.2.1sudo python setup.py install
安装过程可能会报错:
error: command 'gcc' failed with exit status 1
解决办法:
yum install gcc python-devel
二、获取系统基本信息的使用
CPU信息
使用cpu_times方法获取cpu的完整信息
>>> import psutil>>> psutil.cpu_times()scputimes(user=3447309.53, nice=21.43, system=980580.99, idle=45362374.85, iowait=1788.68, irq=1111.98, softirq=265913.85, steal=0.0, guest=0.0)>>>
获取单个数据,如用户的cpu时间比
>>> psutil.cpu_times().user3447363.5
获取cpu物理和逻辑个数,默认logical值为True
>>> psutil.cpu_count()16>>>psutil.cpu_count(logical=True)16>>>
内存信息
内存信息的获取主要使用virtual_memory方法。swap使用就用swap_memory方法。
>>> mem=psutil.virtual_memory()>>> memsvmem(total=67556536320L, available=55213682688L, percent=18.3, used=31624036352L, free=35932499968L, active=12532486144, inactive=17918431232, buffers=338460672L, cached=18942722048)>>> mem.total67556536320L>>> print (mem.total/1024/1024)64426>>> mem.percent18.3
其中percent表示实际已经使用的内存占比,即(67556536320-55213682688)/67556536320*100% 。available表示还可以使用的内存。
磁盘信息
磁盘信息主要有两部分,一个是磁盘的利用率,一个是io,他们分别可以通过disk_usage和disk_io_counters方法获取。
如下先获取分区信息,然后看下根分区的使用情况。>>> psutil.disk_partitions()[sdiskpart(device='/dev/vda1', mountpoint='/', fstype='ext4', opts='rw,barrier=0'), sdiskpart(device='/dev/mapper/a8data-a8data01', mountpoint='/a8root', fstype='ext4', opts='rw')]>>>psutil.disk_usage('/a8root') sdiskusage(total=517878185984, used=17773596672, free=473797914624, percent=3.4)
默认disk_io_counters方法获取的是硬盘总的io数和读写信息,如果需要获取单个分区的io和读写信息加上"perdisk=True"参数。
>>> psutil.disk_io_counters()sdiskio(read_count=21014, write_count=20875975, read_bytes=590727680, write_bytes=130111663616, read_time=50976, write_time=2089073404)>>> psutil.disk_io_counters(perdisk=True){'vda1': sdiskio(read_count=19997, write_count=1408898, read_bytes=586012672, write_bytes=11122278400, read_time=38319, write_time=7592934), 'vdb1': sdiskio(read_count=528, write_count=4942088, read_bytes=2715136, write_bytes=59495226880, read_time=6220, write_time=69064717), 'dm-0': sdiskio(read_count=489, write_count=14525203, read_bytes=1999872, write_bytes=59495215104, read_time=6437, write_time=2012416185)}>>>
网络信息
网络io和磁盘io使用方法差不多,主要使用net_io_counters方法,如果需要获取单个网卡的io信息,加上pernic=True参数。
>>> psutil.net_io_counters()snetio(bytes_sent=1027533635976, bytes_recv=10363004808910, packets_sent=18875716061, packets_recv=34977009187, errin=0, errout=0, dropin=0, dropout=0)>>> psutil.net_io_counters(pernic=True){'lo': snetio(bytes_sent=14576204221, bytes_recv=14576204221, packets_sent=131553294, packets_recv=131553294, errin=0, errout=0, dropin=0, dropout=0), 'eth1': snetio(bytes_sent=63177055, bytes_recv=5816278780, packets_sent=672307, packets_recv=86605286, errin=0, errout=0, dropin=0, dropout=0), 'eth0': snetio(bytes_sent=1012900174490, bytes_recv=10342662275409, packets_sent=18743598665, packets_recv=34759041422, errin=0, errout=0, dropin=0, dropout=0)}
其他系统信息
除了前面介绍的几个获取系统基本信息的方法,psutil模块还支持获取用户登录、开机时间等信息
>>> import psutil>>> import datetime>>> psutil.users()[suser(name='root', terminal='pts/0', host='10.46.176.245', started=1465088896.0)]>>> psutil.boot_time()1461928264.0>>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")'2016-04-29 19:11:04'
三、编写脚本,展示系统信息
#!/usr/bin/env python#-*- coding:UTF-8 -*-import psutilimport timedef Sysinfo(): #CPU User_Num = psutil.cpu_times().user/100000 CPU_Num1 = psutil.cpu_count() CPU_Num2 = psutil.cpu_count(logical=False) CPU_percent = psutil.cpu_percent() #Boot_time Boot_start = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(psutil.boot_time())) #Memory RAM_Total = int(psutil.virtual_memory().total/(1024*1024)) Total_percent = psutil.virtual_memory().percent RAM_Free = int(psutil.swap_memory().total/(1024*1024)) Free_percent = psutil.swap_memory().percent #Net Net_Bytes_sent = psutil.net_io_counters().bytes_sent Net_Bytes_recv = psutil.net_io_counters().bytes_recv Net_Pack_sent = psutil.net_io_counters().packets_sent Net_Pack_recv = psutil.net_io_counters().packets_recv BFH = r'%' print " \033[1;32m开机时间:%s\033[1;m" % Boot_start print " \033[1;32muser的CPU时间比:%s%s\033[1;m" % (User_Num,BFH) print " \033[1;32mCPU的物理个数:%s\033[1;m" % CPU_Num1 print " \033[1;32mCPU的逻辑个数:%s\033[1;m" % CPU_Num2 print " \033[1;32mCPU使用百分比:%s%s\033[1;m" % (CPU_percent,BFH) print " \033[1;32m物理内存:%sM\t 使用率:%s%s\033[1;m" % (RAM_Total,Total_percent,BFH) print " \033[1;32mswap内存:%sM\t 使用率:%s%s\033[1;m" % (RAM_Free,Free_percent,BFH) print " \033[1;32m发送字节:%s Byte\t 发送包数:%s 个\033[1;m" % (Net_Bytes_sent,Net_Pack_sent) print " \033[1;32m接收字节:%s Byte\t 接收包数:%s 个\033[1;m" % (Net_Bytes_recv,Net_Pack_recv) #disk 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)if __name__ == "__main__": Sysinfo()
运行结果:
[root@iZ253hr56zqZ scripts]# python test.py 开机时间:2016-04-29 19:11:04 user的CPU时间比:34.4929039% CPU的物理个数:16 CPU的逻辑个数:16 CPU使用百分比:50.0% 物理内存:64426M 使用率:18.6% swap内存:16383M 使用率:0.0% 发送字节:1027740820366 Byte 发送包数:18879505652 个 接收字节:10364859088754 Byte 接收包数:34983813008 个 盘符:/dev/vda1 挂载点:/ 使用率:26.6% 盘符:/dev/mapper/a8data-a8data01 挂载点:/a8root 使用率:3.4%