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%