Python系统性能信息模块psutil

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python系统性能信息模块psutil相关的知识,希望对你有一定的参考价值。

通常linux系统的基础信息如内存、cpu等这些都是通过shell来获取。不过python的psutil模块把shell查看系统基础信息的功能都包装了下,使用更加简单,功能丰富。

shell
命令如下:
物理内存total 值: free -m | grepMem | awk ‘{print $2}‘
物理内存used 值: free -m | grepMem | awk ‘{print $3}‘
相比较而言,使用psutil 库实现则更加简单明了。psutil 大小单位一般都采用字节,如下:
>>> import psutil
>>>mem = psutil.virtual_memory()
>>>mem.total,mem.used
(506277888L, 500367360L)
psutil 的源码安装步骤如下:

  1. wget https://pypi.python.org/packages/source/p/psutil/psutil-3.2.1.tar.gz --no-check-certificate  
  2. tar zxvf psutil-3.2.1.tar.gz   
  3. cd psutil-3.2.1  
  4. sudo python setup.py install  

注意执行脚本一定要以root权限执行,否则会用些方法导入不进去,无法使用。

安装过程中,若提示如下错误:
psutil/_psutil_linux.c:12:20: fatal error: Python.h: 没有那个文件或目录
#include <Python.h>
^
compilation terminated.
error: command ‘x86_64-linux-gnu-gcc‘ failed with exit status 1
 
解决办法:
安装python的依赖包 python-dev
apt-get install python-dev
 
python-dev是干什么用的呢:
linux发行版通常会把类库的头文件和相关的pkg-config分拆成一个单独的xxx-dev(el)包.
以python为例, 以下情况是需要python-dev的:
你需要自己安装一个源外的python类库, 而这个类库内含需要编译的调用python api的c/c++文件。
你自己写的一个程序编译需要链接libpythonXX.(a|so)
(注:以上不含使用ctypes/ffi或者裸dlsym方式直接调用libpython.so)
其他正常使用python或者通过安装源内的python类库的不需要python-dev.

 

获取系统基本信息的使用

CPU信息

linux系统中的cpu主要有几个部分组成,可以参考之前《Linux系统查看CPU使用率的几个命令》这篇文章。

使用cpu_times方法获取cpu的完整信息,如下所示。

>>> psutil.cpu_times()
scputimes(user=406604.31, nice=9686.8199999999997, system=664003.88, idle=19646386.609999999, iowait=715788.23999999999, irq=165388.04000000001, softirq=47710.230000000003, steal=0.0, guest=0.0)

获取单个数据,如用户的cpu时间

>>> psutil.cpu_times().user
406604.59999999998

获取cpu物理和逻辑个数,默认logical值为True 。

>>> psutil.cpu_count()
4
>>> psutil.cpu_count(logical=False)
2

内存信息

内存信息的获取主要使用virtual_memory方法。swap使用就用swap_memory方法。

>>> mem=psutil.virtual_memory()
>>> mem
svmem(total=1047543808L, available=717537280L, percent=31.5, used=1018589184L, free=28954624L, active=441827328, inactive=449007616, buffers=218214400L, cached=470368256)
>>> mem.total
1047543808L
>>> print (mem.total/8/1024)
127874
>>> print (mem.total/1024/1024) 
999

其中percent表示实际已经使用的内存占比,即(1047543808-717537280)/1047543808*100% 。available表示还可以使用的内存。

磁盘信息

磁盘信息主要有两部分,一个是磁盘的利用率,一个是io,他们分别可以通过disk_usage和disk_io_counters方法获取。

如下先获取分区信息,然后看下根分区的使用情况。

>>> psutil.disk_partitions()
[sdiskpart(device=‘/dev/mapper/zhang-root‘, mountpoint=‘/‘, fstype=‘ext4‘, opts=‘rw,errors=remount-ro‘), sdiskpart(device=‘/dev/sda1‘, mountpoint=‘/boot‘, fstype=‘ext2‘, opts=‘rw‘)]
>>> psutil.disk_usage(‘/‘) 
sdiskusage(total=43785617408, used=15221456896, free=26339921920, percent=34.799999999999997)
>>>

默认disk_io_counters方法获取的是硬盘总的io数和读写信息,如果需要获取单个分区的io和读写信息加上"perdisk=True"参数。

>>> psutil.disk_io_counters()
sdiskio(read_count=11722336, write_count=136652693, read_bytes=263345571840, write_bytes=848806625280, read_time=66298670, write_time=2741668730)
>>> psutil.disk_io_counters(perdisk=True)
{‘dm-1‘: sdiskio(read_count=71443, write_count=102745, read_bytes=292630528, write_bytes=420843520, read_time=684480, write_time=44471270), ‘sda5‘: sdiskio(read_count=5305289, write_count=29095024, read_bytes=131662169088, write_bytes=424404525056, read_time=28226110, write_time=641655840), ‘sda2‘: sdiskio(read_count=2, write_count=0, read_bytes=2048, write_bytes=0, read_time=30, write_time=0), ‘dm-0‘: sdiskio(read_count=6343081, write_count=107455225, read_bytes=131369276416, write_bytes=423983681536, read_time=37361670, write_time=2055542540), ‘sda1‘: sdiskio(read_count=2521, write_count=166, read_bytes=21493760, write_bytes=172032, read_time=26380, write_time=1810)}
>>>

网络信息

网络io和磁盘io使用方法差不多,主要使用net_io_counters方法,如果需要获取单个网卡的io信息,加上pernic=True参数。

>>> psutil.net_io_counters()
snetio(bytes_sent=470306251621, bytes_recv=504672135942, packets_sent=1231438305, packets_recv=1243021636, errin=0, errout=0, dropin=0, dropout=0)
>>> psutil.net_io_counters(pernic=True)
{‘lo‘: snetio(bytes_sent=53311613686, bytes_recv=53311613686, packets_sent=121127899, packets_recv=121127899, errin=0, errout=0, dropin=0, dropout=0), ‘eth1‘: snetio(bytes_sent=209756860205, bytes_recv=193733233062, packets_sent=356636797, packets_recv=391137413, errin=0, errout=0, dropin=0, dropout=0), ‘eth0‘: snetio(bytes_sent=207237886306, bytes_recv=257627387945, packets_sent=753674621, packets_recv=730757206, errin=0, errout=0, dropin=0, dropout=0)}
>>>

以上是psutil模块获取linux系统基础信息的几个方法,大概常用的数据就这些。当然其他用法还有很多,详情可以参考他的官方文档。











以上是关于Python系统性能信息模块psutil的主要内容,如果未能解决你的问题,请参考以下文章

python3之模块psutil系统性能信息

系统性能信息模块之psutil模块

系统性能信息模块 psutil

Python--系统信息模块psutil

python - psutil 系统信息模块

《Python自动化运维之路》 系统基础信息模块