Python的系统性能模块psutil

1.1系统性能模块psutil

​ 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、FreeBSD和Sun Solaris等操作系统,支持从2.4到3.4的Python版本,目前最新版本为2.0.0。通常我们获取操作系统信息往往采用编写shell来实现,如获取当前物理内存总大小及使用大小,shell命令如下:

物理内存total值:free -m | grep Mem | awk '{print $2}'
物理内存used值:free -m | grep Mem | awk '{print $3}'

相比较而言,使用psutil库实现则更加简单明了。psutil大小单位一般都采用字节,如下:

import psutil
mem = psutil.virual_memory()
mem.total,mem.used

psutil的源码安装步骤如下:

wget https://pypi.python.org/packages/source/p/psutil/psutil-2.0.0.tar.gz --no-check-certificate
tar -zxvf psutil-2.0.0.tar.gz
cd psutil-2.0.0
python setup.py install

1.1.1 获取系统性能信息

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

1)CPU信息

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

  • User Time ,执行用户进程的时间百分比

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

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

  • Idle,CPU处于idle状态的时间百分比

    我们使用Python的psutil.cpu_times()方法可以非常简单的得到这些信息,同时也可以获取CPU的硬件相关信息,比如CPU的物理个数与逻辑个数,具体见下面的操作例子:

    import psutil
    # 使用cpu_times()方法获取CPU完整信息,需要显示所有逻辑CPU信息,指定方法变量percpu=True即可,如psutil.cpu_times(percpu=True)
    psutil.cpu_times() 
    #获取CPU的逻辑个数,默认logical=True
    psutil.cpu_count() 
    # 获取CPU的物理个数
    psutil.cpu_count(logical=False) 
    

2)内存信息

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

import psutil
# 获取内存完整信息
mem = psutil.viartual_memory()
# 获取内存总数
mem.total
# 获取空闲内存数
mem.free
# 获取SWAP分区信息
psutil.swap_memory()

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()获取,具体见下面的操作例子:

# 获取磁盘完整信息
psutil.disk_partitions()
# 获取分区(参数)的使用情况
psutil.disk_usege('/')
# 获取硬盘总的IO个数、读写信息
psutil.disk_io_counters()
# perdisk=True 参数获取单个分区IO个数、读写信息
psutil.disk_io_counters(perdisk=True)

4)网络信息

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

# 获取网络总的IO信息,默认pernic=False
psutil.net_io_counters()
# pernic=True输出每个网络接口的IO信息
psutil.net_io_counters(pernic=True)

5)其他系统信息

​ psutil模块还支持获取用户登录、开机时间等信息,具体见下面的操作例子:

# 返回当前登录系统的用户信息
psutil.users()
# 获取开机时间,以Linux时间戳格式返回
import psutil,datetime
psutile.boot_time()
datatime.datatime.formtimesamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")

1.1.2 系统进程管理方法

​ 获得当前系统的进程信息,可以让运维人员得知应用程序的运行状态,包括进程的启动时间、查看或设置CPU亲和度、内存使用率、IO信息、socket连接、线程数等,这些信息可以呈现出指定进程是否存货、资源利用情况,为开发人员的代码优化、问题定位提供很好的数据参考。

1)进程信息

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

# 列出所有进程pid
psutil.pids()
# 实例化一个Process对象,参数为进程pid
p = psutil.Process(2424)
# 进程名
p.name()
# 进程bin路径
p.exe()
# 进程工作目录绝对路径
p.cwd()
# 进程状态
p.status()
# 进程创建时间,时间戳格式
p.create_time()
# 进程uid信息
p.uids
# 进程gid信息
p.gids()
# 进程cpu时间信息,包括user、system两个cpu时间
p.cpu_times()
# get进程CPU亲和度,入药设置进程CPU亲和度,将CPU号作为参数即可
p.cpu_affinity()
# 进程内存利用率
p.memory_percent()
# 进程内存rss、vms信息
p.memory_info()
# 进程io信息,包括读写数及字节数
p.io_counters()
# 返回打开进程socket的namedutples列表,包括fs、family、laddr等信息
p.connections()
# 进程开启的线程数
p.num_threads()

2)popen类的使用

​ pustil提供了popen类的作用是获取用户启动的应用程序进程信息,以便跟踪程序进程的运行状态。具体实现方法如下:

import psutil
from subprocess import PIPE
# 通过psutil的Popen方法启动的应用程序,可以跟踪该程序运行的所有相关信息
p = psutil.Popen({"/usr/bin/python","-c","print('hello')"},stdout=PIPE)
p.name()
'python'
p.username()
'root'
p.communicate()
('hello\n',None)
# 得到进程运行的cpu时间
p.cpu_times()

发布了104 篇原创文章 · 获赞 33 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/WangTaoTao_/article/details/105095211
今日推荐