python自动化运维1--psutil模块详解

声明:此系列文章为《python自动化运维:技术与最佳实践》一书的总结。

前言

用python做自动化运维有一个非常重要的模块就是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等操作系统。

获取系统性能信息

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

1.获取内存信息

#当前物理内存总大小及已使用大小
import psutil
mem=psutil.virtual_memory()
print(mem)
print("-----")
print(mem.total,mem.used)

输出:
svmem(total=4174942208, available=1167245312, percent=72.0, used=3007696896, free=1167245312)
-----
4174942208 3007696896

注意:
psutil大小单位一般都采用字节,也是上面输出的内存大小的单位为字节。上面的total表示总共的内存大小,used表示已用大小,free表示空闲内存大小。另外还可以使用psutil.swap_memory()来获取SWAP分区信息。

2.获取CPU信息

import psutil
cpu_times=psutil.cpu_times()
print(cpu_times)

输出:
scputimes(user=8614.4375, system=3908.328125, idle=144469.296875, interrupt=379.066828250885, dpc=189.21362352371216)

其中user表示:用户user的CPU时间比,idle:CPU处于idle状态的时间百分比,另外,要想获取完整的信息,可以指定percpu参数为True,如下:

cpu_times=psutil.cpu_times(percpu=True)
print(cpu_times)

输出:
[scputimes(user=3308.391357421875, system=1515.50390625, idle=34674.125, interrupt=22.542144775390625, dpc=50.762725830078125),
scputimes(user=1589.650146484375, system=913.19921875, idle=36994.59375, interrupt=340.28497314453125, dpc=120.80716705322266), 
scputimes(user=2743.74560546875, system=1175.53125,idle=35578.0390625, interrupt=10.935670852661133, dpc=5.491235256195068), 
scputimes(user=1045.8619384765625, system=345.3671875, idle=38105.9453125, interrupt=7.878050327301025,dpc=14.196091651916504)]

获取cpu的逻辑个数和物理个数:

import psutil
#获取CPU的逻辑个数
cpu_counts=psutil.cpu_count()
print(cpu_counts)

#获取CPU的物理个数
cpu_counts2=psutil.cpu_count(logical=False)
print(cpu_counts2)

输出:
4
2

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()获取。

#获取磁盘利用率以及分区(参数)的使用情况
use=psutil.disk_usage("e://")
print(use)

输出:
sdiskusage(total=144956190720, used=40917671936, free=104038518784, percent=28.2)

其中disk_usage()方法需要指定一个路径参数。

#使用psutil.disk_partitions方法获取磁盘完整信息
print(psutil.disk_partitions())
输出:
[sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed'), 
sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed'), 
sdiskpart(device='E:\\', mountpoint='E:\\', fstype='NTFS', opts='rw,fixed'), 
sdiskpart(device='F:\\', mountpoint='F:\\', fstype='NTFS', opts='rw,fixed'), 
sdiskpart(device='G:\\', mountpoint='G:\\', fstype='', opts='cdrom')]

##使用psutil.disk_io_counters获取硬盘总的IO个数
print(psutil.disk_io_counters())
输出:(读写信息)
sdiskio(read_count=248511, write_count=195977, 
read_bytes=8709219840,write_bytes=6364844032, 
read_time=706904190,write_time=897144360)

4.网络信息

系统的网络信息,包括bytes_sent(发送字节数)、bytes_recv=28220119(接收字节数)、packets_sent=200978(发送数据包数)、packets_recv=212672(接收数据包数)等。这些网络信息使用psutil.net_io_counters()方法获取。

#使用psutil.net_io_counters获取网络总的IO信息,默认函数的参数:pernic=False
print(psutil.net_io_counters())

#设置参数pernic=True,输出每个网络接口的IO信息
psutil.net_io_counters(pernic=True)

输出:
snetio(bytes_sent=846710, bytes_recv=6802737, packets_sent=6806, packets_recv=7262, errin=0, errout=0, dropin=0, dropout=0)

5.其他系统信息

psutil模块还支持很多其他信息的获取,像获取用户登录、开机时间等信息

import psutil
import datetime

#使用psutil.users方法返回当前登录系统的用户信息
print(psutil.users())

##使用psutil.boot_time方法获取开机时间,以Linux时间戳格式返回
print(psutil.boot_time())

#将上面的时间戳转为正常时间格式
print(datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S"))

输出:
[suser(name='Administrator', terminal=None, host='0.0.0.0', started=1550626085.0)]
1550626066.0
2019-02-20 09:27:46

系统进程信息

获得当前系统的进程信息,可以让运维人员得知应用程序的运行状态,包括进程的启动时间、查看或设置CPU亲和度、内存使用率、IO信息、socket连接、线程数等,这些信息可以呈现出指定进程是否存活、资源利用情况,为开发人员的代码优化、问题定位提供很好的数据参考。
psutil模块在获取进程信息方面也提供了很好的支持,包括使用psutil.pids()方法获取所有进程PID,使用psutil.Process()方法获取单个进程的名称、路径、状态、系统资源利用率等信息。

#获取所有进程id
print(psutil.pids())

输出:
[0, 4, 380, 556, 656, 676, 740, 748, 776, 788, 884, 944, 984, 456,...]
import psutil
import datetime

#实例化一个Process对象,参数为一进程PID
p = psutil.Process(2320)

#1.进程名
print(p.name())

##2.进程bin路径
print(p.exe())

##3.进程工作目录绝对路径
print(p.cwd())

#4.进程状态
print(p.status())

#5.进程创建时间,时间戳格式
print(p.create_time())

#6.进程下有哪些线程
print(p.threads())

##7.进程CPU时间信息,包括user、system两个CPU时间
print(p.cpu_times())

#8.进程CPU亲和度,如要设置进程CPU亲和度,将CPU号作为参数即可
print(p.cpu_affinity())

#9.进程内存利用率
print(p.memory_percent())

#10.进程IO信息,包括读写IO数及字节数
print(p.io_counters())

#11.返回打开进程socket的namedutples列表,包括fs、family、laddr等信息
print(p.connections())

#12.进程开启的线程数
print(p.num_threads())

输出:
360tray.exe
C:\Program Files (x86)\360\360Safe\safemon\360tray.exe
C:\Program Files (x86)\360\360Safe\Config\newui\themes\default
running
1550626100.0
[pthread(id=2312, user_time=7.0980455, system_time=4.6800299999999995), pthread(id=2792, user_time=0.015600099999999999, system_time=0.0780005), ....]
pcputimes(user=75.3952833, system=75.0052808, children_user=0, children_system=0)
[0, 1, 2, 3]
0.7136459025207182
pio(read_count=82443, write_count=7048, read_bytes=1258206165, write_bytes=15432956)
[pconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=1, laddr=('192.168.0.103', 49210), raddr=('223.167.166.57', 80), status='ESTABLISHED'), ....]
130
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值