python自动化运维学习------使用模块psutil获取系统cpu、内存、磁盘、网络、进程等信息

不想你离开。 提交于 2019-11-27 10:59:28

     系统基础信息采集模块作为监控模块的重要组成部分,能够帮助运维人员了解当前系统的健康程度,同事也是衡量业务的服务质量的依据,比如系统资源吃紧,会直接影响业务的服务质量及用户体验,另外获取设备的流量信息,也可以让运维人员更好地评估宽带、设备资源是否应该扩容。Python中存在第三方系统基础模块,可以帮助自动化运维的成员获取服务运营指标数据,包括Linux基本性能、块设备、网卡接口、系统信息、网络地址库等信息。在采集到这些数据后,我们就可以全方位了解系统服务的状态,再结合告警机制,可以在第一时间响应,将异常出现在苗头时就得以处理。

    系统性能信息模块psutil

    psutil是一个跨平台库,能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要应用于系统监控,分析和限制系统资源及进程的管理。它实现了同等命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。目前支持32位和64位的Linux、Windows、OS X、FreeBSD和Sun Solaris等操作系统,支持从2.4到3.4的Python版本。

   采集系统的基本性能信息包括CPU、内存、磁盘、网络等,可以完整描述当前系统运行状态及质量。psutil模块已经封装了这些方法,用户可以根据自身的应用场景,调用相应的方法来满足需求,非常简单实用。

1、获取CPU信息

Linux操作系统的CPU利用率有几下部分:

User Time:执行用户进程的时间百分比;

System Time:执行内核进程和中断的时间百分比;

Wait IO:由于IO等待而使CPU处于idle(空闲)状态的时间百分比;

Idle:CPU处于idle状态的时间百分比;

具体操作案例如下:

import psutil
print "--------------cpu---------------"
cpuinfo=psutil.cpu_times();
print 'cpu 完整的基本信息:', cpuinfo
print 'cpu单项数据信息,用户user的cpu时间比',
cpuinfo.user;                                                                                                                                          
print '获取cpu的逻辑个数:', psutil.cpu_count();
print '获取cpu的物理个数:', psutil.cpu_count(logical=False)

执行结果

root@sdap:/home/test# python testlinux.py 
--------------cpu---------------
cpu 完整的基本信息: scputimes(user=380.96, nice=0.0, system=65.17, idle=16296.11, iowait=107.84, irq=0.01, softirq=4.12, steal=0.0, guest=0.0, guest_nice=0.0)
cpu单项数据项,用户user的cpu时间占用比 380.96
获取cpu的逻辑个数: 8
获取cpu的物理个数: 8

2、内部信息

Linux系统的内存利用率信息涉及total(内存总数)、used(已使用的内存数)、free(空闲内存数)、buffers(缓冲使用数)、cache(缓存使用数)、swap(交换分区使用数)等,分别使用psutil.virtual_memory()与psutil.swap_memory()方法获取这些信息,具体操作如下:

#!/usr/bin/python2.7
#encoding:utf-8
import psutil
print '--------------内存----------------'
mem=psutil.virtual_memory();
print '获取内存完整信息:', mem;
print '获取内存总数:', mem.total/(1024*1024*1024),'G';
print '获取内存空闲总数:', mem.free/(1024*1024*1024),'G';
print '获取swap分区的内存信息:', psutil.swap_memory();

执行结果:

root@sdap:/home/test# python testlinux.py
--------------内存----------------
获取内存完整信息: svmem(total=16869101568, available=7678144512, percent=54.5, used=8991158272, free=7058620416, active=9241264128, inactive=414801920, buffers=92192768, cached=727130112, shared=6668288)
获取内存总数: 15 G
获取内存空闲总数: 6 G
获取swap分区的内存信息: sswap(total=11152650240, used=0, free=11152650240, 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(磁盘写时间)等,这些IO信息可以使用psutil.disk_io_counters()获取,具体操作如下:

#!/usr/bin/python2.7
#encoding:utf-8
import psutil
print '-----------磁盘信息----------------'
print '获取磁盘完整信息:', psutil.disk_partitions();
print '获取分区的使用情况:', psutil.disk_usage('/');
print '获取硬盘总的IO个数、读写信息:', psutil.disk_io_counters();
print '获取单个分区IO个数:', psutil.disk_io_counters(perdisk=True);

执行结果:

root@sdap:/home/test# python testlinux.py
-----------磁盘信息----------------
获取磁盘完整信息: [sdiskpart(device='/dev/mapper/lvg-root', mountpoint='/', fstype='ext4', opts='rw,relatime,errors=remount-ro,user_xattr,barrier=1,data=ordered'), sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='ext2', opts='rw,relatime,errors=continue')]
获取分区的使用情况: sdiskusage(total=259331371008, used=11394555904, free=234763554816, percent=4.6)
获取硬盘总的IO个数、读写信息: sdiskio(read_count=64015, write_count=44542, read_bytes=1252658176, write_bytes=486617088, read_time=532772, write_time=6596096, read_merged_count=3431, write_merged_count=22608, busy_time=163732)
获取单个分区IO个数: {'sr0': sdiskio(read_count=0, write_count=0, read_bytes=0, write_bytes=0, read_time=0, write_time=0, read_merged_count=0, write_merged_count=0, busy_time=0), 'sda5': sdiskio(read_count=29934, write_count=10767, read_bytes=625271808, write_bytes=243306496, read_time=178204, write_time=647080, read_merged_count=3428, write_merged_count=22608, busy_time=81656), 'sda2': sdiskio(read_count=2, write_count=0, read_bytes=2048, write_bytes=0, read_time=12, write_time=0, read_merged_count=0, write_merged_count=0, busy_time=12), 'sda1': sdiskio(read_count=594, write_count=4, read_bytes=2436096, write_bytes=4096, read_time=376, write_time=12, read_merged_count=3, write_merged_count=0, busy_time=384), 'dm-0': sdiskio(read_count=33353, write_count=33771, read_bytes=624407552, write_bytes=243306496, read_time=354020, write_time=5949004, read_merged_count=0, write_merged_count=0, busy_time=81520), 'dm-1': sdiskio(read_count=132, write_count=0, read_bytes=540672, write_bytes=0, read_time=160, write_time=0, read_merged_count=0, write_merged_count=0, busy_time=160)}

4、网络信息

系统的网络信息与磁盘IO类似,涉及几个关键点,包括bytes_sent(发送字节数)、bytes_recv(接收字节数)、packets_sent(发送数据包数)、packets_recv(接收数据包数)等,这些网络信息使用psutil.net_io_counters()方法获取,具体操作如下

#!/usr/bin/python2.7
#encoding:utf-8
import psutil
print '--------------网络信息--------------'
print '获取网络总的IO信息:', psutil.net_io_counters();
print '输出每个网络接口的IO信息', psutil.net_io_counters(pernic=True);
print '----------------其它信息-------------'
print '获取当前登陆系统的用户信息:', psutil.users();
print '获取开机时间:', psutil.boot_time();
执行结果:

root@sdap:/home/test# python testlinux.py
--------------网络信息--------------
获取网络总的IO信息: snetio(bytes_sent=436566026, bytes_recv=686674641, packets_sent=388228, packets_recv=524485, errin=0, errout=0, dropin=0, dropout=0)
输出每个网络接口的IO信息 {'lo': snetio(bytes_sent=246045456, bytes_recv=246045456, packets_sent=81802, packets_recv=81802, errin=0, errout=0, dropin=0, dropout=0), 'eth0': snetio(bytes_sent=190521824, bytes_recv=440629185, packets_sent=306427, packets_recv=442683, errin=0, errout=0, dropin=0, dropout=0)}
----------------其它信息-------------
获取当前登陆系统的用户信息: [suser(name='(unknown)', terminal='tty7', host='localhost', started=1498614016.0), suser(name='root', terminal='pts/1', host='192.168.8.111', started=1498618496.0)]
获取开机时间: 1498614020.0

5、进程信息

psutil模块在获取进程信息方面也提供了很好的支持,包括使用psutil.pids()方法获取所有进程PID,使用psutil.Process()方法获取单个进程的名称、路径、状态、系统资源利用率等信息,具体如下

#!/usr/bin/python2.7
#encoding:utf-8
import psutil, sys
print "------------------进程信息--------------"
plist=psutil.pids()
print '进程名     进程bin路径   进程工作目录绝对路径 进程状态  进程内存利用率  进程内存rss vms信息 进程开启的线程数'
for p in plist:
    ps=psutil.Process(p);
    if ps.name() == 'java':
       print ps.name()+' '+ps.exe()+' '+ps.cwd()+' '+ps.status()+' '+str(ps.memory_percent())+' '+str(ps.memory_info())+' '+str(ps.num_threads())

执行结果:

------------------进程信息--------------
进程名     进程bin路径   进程工作目录绝对路径 进程状态  进程内存利用率  进程内存rss vms信息 进程开启的线程数
java /usr/jdk1.7.0_76/bin/java /home/cecgw/display-u3_3 sleeping 36.1837135629 pmem(rss=6103867392, vms=7654350848, shared=19324928, text=4096, lib=0, data=7576641536, dirty=0) 144
java /usr/jdk1.7.0_76/jre/bin/java /home/cecgw/apache-tomcat-cas/bin sleeping 6.67872950707 pmem(rss=1126641664, vms=4807155712, shared=12210176, text=4096, lib=0, data=4746444800, dirty=0) 36
java /usr/jdk1.8.0_131/jre/bin/java /usr/apache-tomcat-8.0.44 sleeping 8.78455470806 pmem(rss=1481875456, vms=6117425152, shared=14290944, text=4096, lib=0, data=6050725888, dirty=0) 80


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!