2022-02-27 21:02:51

python第三方模块psutil系统管理工具介绍

python第三方模块psutil系统管理工具介绍

[TOC]

psutil安装

pustil可以通过pip install psutil简单的安装。

接下来就是举例,用psutil完成的一些功能。

psutil使用

获取物理内存总大小和已使用大小

>>> import psutil >>> mem = psutil.virtual_memory() >>> mem.total,mem.used (8589934592, 7704367104) >>>

good,我的系统是mac,没有free命令。拿到结果了,做为一个兼容的系统管理工具不错。

CPU信息

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

  • Used Time, 执行用户进程的时间百分比;
  • System Time, 执行内核进程和中断的时间百分比;
  • WaitIO, 由于IO等待而使CPU处于idle(空闲)状态的时间百分比;
  • Idle, CPU处于idle状态的时间百分比。
>>> import psutil >>> psutil.cpu_times() scputimes(user=1402284.92, nice=0.0, system=1469626.9, idle=12627047.52) >>> psutil.cpu_times(percpu=True) [scputimes(user=502393.89, nice=0.0, system=562658.91, idle=2809843.07), scputimes(user=184752.81, nice=0.0, system=125993.21, idle=3564001.33), scputimes(user=525198.26, nice=0.0, system=645489.72, idle=2704061.18), scputimes(user=189962.29, nice=0.0, system=135537.72, idle=3549245.73)] >>> psutil.cpu_count() 4 >>> psutil.cpu_count(logical=False) 2

在开发的时候,我time命令来衡量程序的性能。

time python test.py > /dev/null
python test.py > /dev/null  4.31s user 0.16s system 98% cpu 4.534 total

我这里test.py只是简单地循环输出,当system占比比较高的时候,可能是系统调用过多。系统调用涉及到用户态和内核态的切换,消耗会高。优化的方向之一是减少系统调用。

内存信息

Linux系统的内存利用率信息有:

  • total 内存总数
  • used 已使用内存数
  • free 空闲的内存数
  • buffers 缓冲使用数
  • cache 缓存使用数
  • wap 交换分区使用数
>>> import psutil >>> psutil.virtual_memory() svmem(total=8589934592, available=2058379264, percent=76.0, used=8028037120, free=20783104, active=2052898816, inactive=2037596160, wired=3937542144) >>> psutil.swap_memory() sswap(total=8589934592, used=7281311744, free=1308622848, percent=84.8, sin=618526040064, sout=25876324352) >>>

磁盘信息

在系统的所有磁盘信息中,我们更加关注磁盘的利用率及IO信息,其中磁盘利用率使用psutil.disk_usage方法获取。
磁盘IO信息包括:

  • read_count 读IO数
  • write_count 写IO数
  • read_bytes IO读字节数
  • write_bytes IO写字节数
  • read_time 磁盘读时间
  • write_time 磁盘写时间
>>> psutil.disk_partitions() #获得磁盘分区信息 [sdiskpart(device='/dev/disk1', mountpoint='/', fstype='hfs', opts='rw,local,rootfs,dovolfs,journaled,multilabel')] >>> psutil.disk_usage('/')#获取分区的使用情况 sdiskusage(total=249769230336, used=226267439104, free=23239647232, percent=90.7) >>> psutil.disk_io_counters() sdiskio(read_count=58295513, write_count=57111574, read_bytes=3269424444416, write_bytes=3475279374848, read_time=83685913, write_time=38281762) >>> psutil.disk_io_counters(perdisk=True) {'disk0': sdiskio(read_count=58294822, write_count=57111574, read_bytes=3269288018432, write_bytes=3475279374848, read_time=83656259, write_time=38281762), 'disk2': sdiskio(read_count=104, write_count=0, read_bytes=19758592, write_bytes=0, read_time=3970, write_time=0), 'disk7': sdiskio(read_count=94, write_count=0, read_bytes=19736064, write_bytes=0, read_time=4853, write_time=0), 'disk3': sdiskio(read_count=105, write_count=0, read_bytes=19719680, write_bytes=0, read_time=3505, write_time=0), 'disk4': sdiskio(read_count=104, write_count=0, read_bytes=19535360, write_bytes=0, read_time=3881, write_time=0), 'disk5': sdiskio(read_count=100, write_count=0, read_bytes=19777024, write_bytes=0, read_time=4920, write_time=0), 'disk6': sdiskio(read_count=100, write_count=0, read_bytes=19525120, write_bytes=0, read_time=4214, write_time=0), 'disk8': sdiskio(read_count=94, write_count=0, read_bytes=19455488, write_bytes=0, read_time=4365, write_time=0)} >>>

在负载高的时候,需要分析出cpu问题还是io问题。cpu密集型问题和io密集型问题解决方案不一样。

网络信息

系统的网络信息与磁盘IO累死,涉及几个关键点

  • bytes_sent 发送节字数
  • bytes_recv 接收字节数
  • packets_sent 发送数据包数
  • packets_recv 接收数据包数

可以通过psutil.net_io_counters()方法获取

>>> psutil.net_io_counters() snetio(bytes_sent=18564432940, bytes_recv=80575424616, packets_sent=96109565, packets_recv=105568905, errin=0, errout=0, dropin=0, dropout=0)

其它系统信息

除了前面介绍的几个获取系统基本信息的方法,psutil模块还支持获取用户登录、开机时间等信息,如下:

>>> psutil.users() [suser(name='maynard', terminal='console', host=None, started=1474462720.0), suser(name='maynard', terminal='ttys000', host=None, started=1487756672.0), suser(name='maynard', terminal='ttys001', host=None, started=1488096000.0), suser(name='maynard', terminal='ttys002', host=None, started=1488118272.0), suser(name='maynard', terminal='ttys003', host=None, started=1487824512.0), suser(name='maynard', terminal='ttys004', host=None, started=1487917312.0)] >>> import datetime >>> psutil.boot_time() 1474462336.0 >>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S") '2016-09-21 20:52:16' >>>

进程信息

psutil模块在获取进程信息方面提供了很好的支持,包括使用psutil.pids()方法获取所有进程PID,使用psutil.Process()方法获取单个进程的名称、路径、状态、系统资源利用率等信息。

>>> import psutil >>> psutil.pids() #列出所有进程PID,可以通过ps命令得到 [69242, 69241, 69238, 69113 68615...] >>> p = psutil.Process(69113) #实例化一个Process对象,参数为一进程PID >>> p.name() #进程名 'swcd' >>> p.exe() #进程bin路径 '/usr/libexec/swcd' >>> p.cwd() #进程工作目录绝对路径 '/' >>> p.status() #进程状态 'running' >>> p.create_time() 1488189481.269264 >>> p.uids()#进程uid信息 puids(real=501, effective=501, saved=501) >>> p.gids()#进程gid信息 puids(real=20, effective=20, saved=20) >>> p.cpu_times() pcputimes(user=0.057164948, system=0.037118848, children_user=0, children_system=0) >>> p.memory_percent() 0.07877349853515625 >>> p.memory_info() pmem(rss=6766592, vms=2573402112, pfaults=3232, pageins=22) >>> p.connections() [] >>> p.num_threads() 4

本文链接:http://blog.go2live.cn/post/psutil.html

-- EOF --