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

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

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
Tags: