python自动化运维笔记1 —— 系统性能信息模块psutil
一.系统基础信息模块
1.1 系统性能信息模块psutil
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和Sun Solaris等操作系统,支持从2.4到3.4的python版本。
相对shell而言,使用psutil库实现则更加简单明了。psutil大小单位一般都采用字节,如下:
>>> import psutil >>> mem=psutil.virtual_memory() >>> mem.total,mem.used (506081280L, 224522240L)
psutil的源码安装步骤为:
1.下载源码包psutil-*.tar.gz
2.tar -xf psutil-*.tar.gz
3.cd psutil-*
4.python setup.py install
1.1.1 获取系统性能信息
采集系统的基本性能信息包括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()#使用cpu_times方法获取cpu完整信息,需要显示所有逻辑cpu信息 scputimes(user=5.46, nice=0.0, system=14.949999999999999, idle=6876.1300000000001, iowait=32.549999999999997, irq=0.57999999999999996,
softirq=5.7699999999999996, steal=0.0, guest=0.0) >>> psutil.cpu_times().user #获取用户user的cpu时间比 5.4699999999999998 >>> psutil.cpu_count() #获取cpu的逻辑个数,默认logical=True4 1 >>> psutil.cpu_count(logical=False) #获取cpu的物理个数 >>>
(2)内存信息
linux系统的内存利用率信息涉及到的total、used、free、buffers、cache、swap等,分别使用psutil.virtual_memory()与psutil.swap_memory()方法获取这些信息。如下:
>>> import psutil >>> mem=psutil.virtual_memory() #获取内存完整信息 >>> mem svmem(total=506081280L, available=426848256L, percent=15.699999999999999, used=224903168L, free=281178112L, active=100843520, inactive=62648320,
buffers=20275200L, cached=125394944) >>> mem.total #获取内存总数 506081280L >>> mem.free #获取内存空闲数 281178112L >>> psutil.swap_memory() #获取swap分区信息 sswap(total=1073733632L, used=0L, free=1073733632L, percent=0.0, sin=0, sout=0) >>>
(3)磁盘信息
在系统的所有磁盘信息中,我们更加关注磁盘的利用率及IO信息,其中磁盘利用率使用psutil.disk_usage方法获取。磁盘IO信息包括read_count(读IO数)、write_count(写IO数)、read_bytes(IO读字节数)、write_bytes(IO写字节数)、read_time(磁盘读时间)、write_time(磁盘写时间)等。这些信息可以使用psutil.disk_io_counters()获取,如下:
>>> psutil.disk_partitions() #获取磁盘完整信息 [sdiskpart(device='/dev/sda3', mountpoint='/', fstype='ext4', opts='rw'), sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='ext4', opts='rw')
, sdiskpart(device='/dev/sr0', mountpoint='/mnt/cdrom', fstype='iso9660', opts='ro')]
>>> psutil.disk_usage('/') #获取分区/的使用情况 sdiskusage(total=51579129856, used=1919442944, free=47039557632, percent=3.7000000000000002)
>>> psutil.disk_io_counters() #获取磁盘总的IO个数、读写信息 sdiskio(read_count=5349, write_count=2021, read_bytes=137484288, write_bytes=28660736, read_time=46320, write_time=130772)
>>> psutil.disk_io_counters(perdisk=True) #参数perdisk=Ture获取单个分区IO个数、读写信息 {'sda2': sdiskio(read_count=332, write_count=0, read_bytes=1486848, write_bytes=0, read_time=417, write_time=0), 'sda3': sdiskio(read_count=4433,
write_count=2019, read_bytes=133624832, write_bytes=28655616, read_time=44745, write_time=130803), 'sda1': sdiskio(read_count=584, write_count=4,
read_bytes=2372608, write_bytes=13312, read_time=1158, write_time=5)}
(4)网络信息
系统的网络信息与磁盘IO类似,涉及几个关键点,包括bytes_send(发送字节数)、bytes_recv(接收字节数)、packets_send(发送数据包数)、packets_recv(接收数据包数)等,这些网络信息使用psutil.net_io_counters()方法获取。
>>> psutil.net_io_counters() #获取网络总的io信息,默认pernic=False snetio(bytes_sent=10996033, bytes_recv=745015181, packets_sent=134047, packets_recv=535137, errin=0, errout=0, dropin=0, dropout=0)
>>> psutil.net_io_counters(pernic=True) #获取每个网络接口的io信息 {'lo': snetio(bytes_sent=507772, bytes_recv=507772, packets_sent=3874, packets_recv=3874, errin=0, errout=0, dropin=0, dropout=0),
'eth0': snetio(bytes_sent=10493255, bytes_recv=744516466, packets_sent=130220, packets_recv=531361, errin=0, errout=0, dropin=0, dropout=0)}
(5)其他系统信息
除以上几个获取系统基本信息的方法,psutil模块还支持获取用户登录数、开机时间信息等
>>> psutil.users() #返回当前登录系统的用户信息 [suser(name='danny', terminal='pts/0', host='192.168.0.151', started=1516339712.0)]
>>> import psutil,datetime
>>> psutil.boot_time() #获取开机时间,以linux时间戳格式返回 1516330008.0 >>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S") #转换为自然时间格式 '2018-01-19 10:46:48'
1.1.2 系统进程管理方法
获取当前系统的进程信息,可以让运维人员得知应用程序的运行状态,包括进程的启动时间、查看或设置CPU亲和度、内存使用率、IO信息、socket连接、线程数等,这些信息可以呈现出指定进程是否存活、资源利用情况。
(1)进程信息
psutil模块在获取进程信息方面也提供了很好的支持,包括使用psutil.pids()方法获取所有进程PID,使用psutil.Process()方法获取单个进程的名称、路径、状态、系统资源利用率等信息,具体如下:
>>> psutil.pids() #列出所有进程PID [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,... 3301, 3322, 3323, 3571, 3775, 3782, 4126, 4135] >>> p=psutil.Process(3323) #实例化一个Process对象 >>> p.name() #进程名 'bash' >>> p.exe() #进程bin路径 '/bin/bash' >>> p.cwd() #进程工作目录绝对路径 '/home/danny' >>> p.status() #进程状态 'sleeping' >>> p.create_time() #进程创建时间 1516339775.1600001 >>> p.uids() #进程uid信息 puids(real=0, effective=0, saved=0) >>> p.gids() #进程gid信息 pgids(real=0, effective=0, saved=0) >>> p.cpu_times() #进程CPU时间信息,包括user、system两个CPU时间 pcputimes(user=0.059999999999999998, system=0.16) >>> p.cpu_affinity() #get进程CPU亲和度,如要设置进程CPU亲和度,将CPU号作为参数即可 [0] #该进程可以被CPU0调度 >>> p.memory_percent() #进程内存利用率 0.27356238112581438 >>> p.memory_info() #进程内存rss、vms信息 pmem(rss=1384448, vms=110899200) >>> p.io_counters() #进程IO信息,包括读写IO数及字节数 pio(read_count=4565, write_count=1281, read_bytes=24219648, write_bytes=0) >>> p.connections() #返回打开进程socket的namedutples列表,包括fs、family、laddr等信息 [] >>> p.num_threads() #进程开启的线程数 1
(2)popen类的使用
psutil提供的popen类的作用是获取用户启动的应用程序进程信息,以便跟踪程序进程的运行状态。
>>> from subprocess import PIPE
#通过psutil的Popen方法启动的应用程序,可以跟踪该程序运行的所有相关信息 >>> p=psutil.Popen(["/usr/bin/python","-c","print('hello')"],stdout=PIPE) >>> p.name() #进程的名称 'python' >>> p.username() #进程的用户 'root' >>> p.communicate() ('hello\n', None)