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]: []