Python–系统性能信息模块psutil

psutil模块介绍

在Python中,我们可以使用psutil这个第三方模块去获取信息的信息。

psutil模块可以跨平台使用,支持Linux/UNIX/Windows等,它主要用来做系统监控,性能分析,进程管理等。

psutil模块安装

Windows安装

安装以后方便使用python软件PyCharm来调用模块

pip3 install psutil  # 在Windows的命令行输入命令即可

Linux安装

安装依赖

yum install -y gcc libffi-devel python3-devel openssl-devel

安装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
python3 setup.py install  # 安装psutil

psutil模块使用

前提:模块在使用之前一定要先声明调用

import psutil

1.获取CPU的信息

CPU相关函数

函数

描述

psutil.cpu_count()

cpu_count(,[logical]):默认返回逻辑CPU的个数,当设置logical的参数为False时,返回物理CPU的个数。

psutil.cpu_percent()

cpu_percent(,[percpu],[interval]):返回CPU的利用率,percpu为True时显示所有物理核心的利用率,interval不为0时,则阻塞时显示interval执行的时间内的平均利用率

psutil.cpu_times()

cpu_times(,[percpu]):以命名元组(namedtuple)的形式返回cpu的时间花费,percpu=True表示获取每个CPU的时间花费

psutil.cpu_times_percent()

cpu_times_percent(,[percpu]):功能和cpu_times大致相同,看字面意思就能知道,该函数返回的是耗时比例。

(1)获取CPU时间

psutil.cpu_times()函数

In [3]: psutil.cpu_times()
Out[3]:scputimes(user=12.39, nice=0.0, system=23.7, idle=17256.04, iowait=0.92, irq=0.0, softirq=0.37, steal=0.0, guest=0.0, guest_nice=0.0)

(2)查看单项数据信息

In [4]:psutil.cpu_times().user
Out[4]:12.39

(3)查看CPU的个数

psutil.cpu_count()获取CPU的逻辑个数;psutil.cpu_count(logical=False)获取CPU的物理个数;默认logical值为True;

In [9]: psutil.cpu_count()  # 获取逻辑CPU个数是1
Out[9]: 1
In [10]: psutil.cpu_count(logical=False)  # 获取物理CPU个数是1
Out[10]: 1

(4)查看CPU利用率

psutil获取系统CPU使用率的方法是cpu_percent(),其有两个参数,分别是interval和percpu;interval指定的是计算cpu使用率的时间间隔,percpu则指定是选择总的使用率还是每个cpu的使用率;

In [20]: psutil.cpu_percent()  # 查询当前CPU使用率
Out[20]: 0.1
In [21]: psutil.cpu_percent(interval=2,percpu=True)  3 查询2秒内CPU的使用率
Out[21]: [0.0]

2.获取内存信息

(1)获取内存使用情况

在获取内存信息的时候需要创建对象

psutil.virtual_memory()函数

In [26]: mem = psutil.virtual_memory()
In [26]: print(mem) 
Out[27]: svmem(total=1019793408, available=627859456, percent=38.4, used=771510272, free=248283136, active=406474752, inactive=235048960, buffers=2158592, cached=377417728)

(2)获取内存使用百分比

In [9]: mem.percent
Out[9]: 38.7

(3)获取交换分区信息

psutil.swap_memory()函数

In [5]: psutil.swap_memory()
Out[5]: sswap(total=2147479552, used=0, free=2147479552, percent=0.0, sin=0, sout=0)

3.获取磁盘信息

磁盘相关

函数

描述

psutil.disk_io_counters()

disk_io_counters([perdisk]):以命名元组的形式返回磁盘io统计信息(汇总的),包括读、写的次数,读、写的字节数等。 当perdisk的值为True,则分别列出单个磁盘的统计信息(字典:key为磁盘名称,value为统计的namedtuple)。

psutil.disk_partitions()

disk_partitions([all=False]):以命名元组的形式返回所有已挂载的磁盘,包含磁盘名称,挂载点,文件系统类型等信息。 当all等于True时,返回包含/proc等特殊文件系统的挂载信息

psutil.disk_usage()

disk_usage(path):以命名元组的形式返回path所在磁盘的使用情况,包括磁盘的容量、已经使用的磁盘容量、磁盘的空间利用率等。

(1)获取磁盘分区信息

psutil.disk_partitions()函数

In [7]: psutil.disk_partitions()
Out[7]: 
[sdiskpart(device='/dev/mapper/centos-root', mountpoint='/', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota'),
 sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota')]

(2)获取磁盘使用情况

psutil.disk_usage(PATH)函数

In [8]: psutil.disk_usage('/')
Out[8]: sdiskusage(total=18238930944, used=3416072192, free=14822858752, percent=18.7)
In [10]: psutil.disk_usage('/dev/sda1')
Out[10]: sdiskusage(total=497487872, used=0, free=497487872, percent=0.0)

(3)获取磁盘的I/O统计信息

psutil.disk_io_counters()函数

In [11]: psutil.disk_io_counters()
Out[11]: sdiskio(read_count=14058, write_count=23619, read_bytes=646045184, write_bytes=340295680, read_time=8313, write_time=5902)

(4)分别列出每个磁盘的I/O信息

psutil.disk_io_counters(perdisk=True)函数

In [13]: psutil.disk_io_counters(perdisk=True)
Out[13]: 
{'sda1': sdiskio(read_count=1887, write_count=10, read_bytes=6466048, write_bytes=2117632, read_time=240, write_time=11),
 'sda2': sdiskio(read_count=6115, write_count=11593, read_bytes=320348672, write_bytes=169241088, read_time=4024, write_time=2753),
 'sr0': sdiskio(read_count=18, write_count=0, read_bytes=1052672, write_bytes=0, read_time=26, write_time=0),
 'dm-0': sdiskio(read_count=5948, write_count=12088, read_bytes=315658752, write_bytes=169241088, read_time=4008, write_time=3150),
 'dm-1': sdiskio(read_count=90, write_count=0, read_bytes=2519040, write_bytes=0, read_time=15, write_time=0)}

4.网络相关信息

网络相关函数

函数

详情

psutil.net_io_counter([pernic])

以命名元组的形式返回当前系统中每块网卡的网络io统计信息,包括收发字节数,收发包的数量、出错的情况和删包情况。当pernic为True时,则列出所有网卡的统计信息。

psutil.net_connections([kind])

以列表的形式返回每个网络连接的详细信息(namedtuple)。命名元组包含fd, family, type, laddr, raddr, status, pid等信息。kind表示过滤的连接类型,支持的值如下:(默认为inet)

psutil.net_if_addrs()

以字典的形式返回网卡的配置信息,包括IP地址和mac地址、子网掩码和广播地址。

psutil.net_if_stats()

返回网卡的详细信息,包括是否启动、通信类型、传输速度与mtu。

psutil.users()

以命名元组的方式返回当前登陆用户的信息,包括用户名,登陆时间,终端,与主机信息

psutil.boot_time()

以时间戳的形式返回系统的启动时间

(1)获取总的网络IO信息

psutil.net_io_counters()函数

In [10]: psutil.net_io_counters()
Out[10]: snetio(bytes_sent=801203, bytes_recv=18340409, packets_sent=8522, packets_recv=16805, errin=0, errout=0, dropin=0, dropout=0)

(2)获取每个网卡的配置信息

psutil.net_if_addrs()函数

In [14]: psutil.net_if_addrs()
Out[14]: 
{'lo': [snic(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast=None, ptp=None),
  snic(family=<AddressFamily.AF_INET6: 10>, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None),
  snic(family=<AddressFamily.AF_PACKET: 17>, address='00:00:00:00:00:00', netmask=None, broadcast=None, ptp=None)],
 'ens33': [snic(family=<AddressFamily.AF_INET: 2>, address='10.0.0.143', netmask='255.255.255.0', broadcast='10.0.0.255', ptp=None),
  snic(family=<AddressFamily.AF_INET6: 10>, address='fe80::c3f0:c510:317d:a428%ens33', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None),
  snic(family=<AddressFamily.AF_PACKET: 17>, address='00:0c:29:8e:7d:fd', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]}

(3)显示网卡的详细信息

包括是否启动、通信类型、传输速度与mtu

psutil.net_if_stats()函数

In [15]: psutil.net_if_stats()
Out[15]: 
{'lo': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=65536),
 'ens33': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1000, mtu=1500)}

(4)获取当前登录的用户信息

psutil.user()函数

In [13]: psutil.users()
Out[13]: [suser(name='root', terminal='pts/0', host='10.0.0.1', started=1614303232.0)]

(5)查看系统启动时间

psutil.boot_time()函数

In [18]: psutil.boot_time()
Out[18]: 1614303176.0
# 将时间转化为自然格式
In [22]: import datetime
In [23]: datetime.datetime.fromtimestamp(psutil.boot_time ()).strftime("%Y-%m-%d %H: %M: %S")
Out[23]: '2021-02-25 20: 32: 56'

5.进程信息

(1)列出所有的进程号

psutil.pids()函数

In [29]: psutil.pids()
Out[29]: [1,2,...,7401,7407,7413]

(2)实例化一个Process对象,参数为一进程PID

In [32]: p = psutil.Process(进程号)  # 如果不写进程号则表示当今的进程
In [33]: print(p)
psutil.Process(pid=7378, name='ipython')
查看进程的名字l
In [39]: p.name()
Out[39]: 'ipython
查看进程的路径
In [40]: p.exe()
Out[40]: '/usr/local/bin/python3.7'
获取进入或启动该进程的路径
In [41]: p.cwd()
Out[41]: '/root
获取进程的状态
In [42]: p.status()
Out[42]: 'running'
获取进程的创建时间
In [48]: p.create_time()
Out[48]: 1614323535.25
In [48]: import datetime
In [50]: datetime.datetime.fromtimestamp(p.create_time()).strftime("%F")
Out[50]: '2021-02-26'
获取UID及GID信息
In [52]: p.uids()
Out[52]: puids(real=0, effective=0, saved=0)
In [53]: p.gids()
Out[53]: pgids(real=0, effective=0, saved=0)
获取进程的CPU时间信息
In [55]: p.cpu_times()
Out[55]: pcputimes(user=5.07, system=0.5)
获取内存使用率
In [56]: p.memory_percent()
Out[56]: 4.598088949404152  # 单位是B
# 输出进程占用内存的百分比
In [83]: m = p.memory_percent()
In [86]: s = round(m,2)  # round()函数是保留几位小数的函数,使用格式a=round(小数,保留位数)
In [87]: print("内存使用率是%s%%"%s)  # 小时使用百分比输出
内存使用率是4.63%
获取进程的IO信息
In [88]: p.io_counters()
Out[88]: pio(read_count=3037, write_count=3369, read_bytes=0, write_bytes=1658880)
获取进程开启的线程数
In [90]: p.num_threads()
Out[90]: 2
获取进程的socket连接数
In [91]: p.connections()
Out[91]: []