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-certificate
tar zxvf psutil-3.2.1.tar.gz
cd psutil-3.2.1
sudo 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().user
3447363.5
获取cpu物理和逻辑个数,默认logical值为True
>>> psutil.cpu_count()
16
>>>psutil.cpu_count(logical=True)
16
>>>
内存信息
内存信息的获取主要使用virtual_memory方法。swap使用就用swap_memory方法。
>>> mem=psutil.virtual_memory()
>>> mem
svmem(total=67556536320L, available=55213682688L, percent=18.3, used=31624036352L, free=35932499968L, active=12532486144, inactive=17918431232, buffers=338460672L, cached=18942722048)
>>> mem.total
67556536320L
>>> print (mem.total/1024/1024)
64426
>>> mem.percent
18.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 psutil
import time
def 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 " 33[1;32m开机时间:%s33[1;m" % Boot_start
print " 33[1;32muser的CPU时间比:%s%s33[1;m" % (User_Num,BFH)
print " 33[1;32mCPU的物理个数:%s33[1;m" % CPU_Num1
print " 33[1;32mCPU的逻辑个数:%s33[1;m" % CPU_Num2
print " 33[1;32mCPU使用百分比:%s%s33[1;m" % (CPU_percent,BFH)
print " 33[1;32m物理内存:%sM 使用率:%s%s33[1;m" % (RAM_Total,Total_percent,BFH)
print " 33[1;32mswap内存:%sM 使用率:%s%s33[1;m" % (RAM_Free,Free_percent,BFH)
print " 33[1;32m发送字节:%s Byte 发送包数:%s 个33[1;m" % (Net_Bytes_sent,Net_Pack_sent)
print " 33[1;32m接收字节:%s Byte 接收包数:%s 个33[1;m" % (Net_Bytes_recv,Net_Pack_recv)
#disk
for i in psutil.disk_partitions():
print " 33[1;32m盘符:%s 挂载点:%s 使用率:%s%s33[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%