Python入门之——系统性能信息模块psutil

偏执的太偏执、 2022-12-27 12:37 292阅读 0赞
  1. psutil是一个跨平台库,能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要应用于系统监控,分析和限制系统资源及进程的管理。它实现了同等命令行工具提供的功能,如pstoplsofnetstatifconfigwhodfkillfreeniceioniceiostatiotopuptimepidofttytasksetpmap等。目前支持32位和64位的LinuxWindowsOS XFreeBSDSun Solaris等操作系统,支持从2.43.4Python版本。**通常我们获取操作系统信息往往采用编写shell来实现**,如获取当前物理内存总大小及已使用大小,shell命令如下:
  2. 物理内存total值:free -m | grep Mem | awk '{print $2}'
  3. 物理内存used值:free -m | grep Mem | awk '{print $3}'

相比较而言,使用psutil库实现的代码如下,psutil大小单位一般都采用字节,如下:

  1. >>> import psutil
  2. >>> mem = psutil.virtul_memory()
  3. >>> mem.total,mem.used
  4. (506277888L, 500367360L)

获取系统性能信息

采集系统的基本性能信息包括CPU、内存、磁盘、网络等,可以完整描述当前系统的运行状态及质量,psutil模块已经封装了这些方法。
Linux操作系统的CPU利用率有以下几个部分:

  • User Time,执行用户进程的时间百分比
  • System Time,执行内核进程和中断的时间百分比
  • Wait IO,由于IO等待而使CPU处于idle状态的时间百分比
  • Idle,CPU处于idle状态的时间百分比
    psutil.cpu_times()方法可以简单地得到这些信息,同时也可以获取CPU的硬件相关信息,比如CPU的物理个数与逻辑个数。

    import psutil
    psutil.cpu_times() # 获取CPU完整信息,需要显示所有逻辑CPU信息,指定方法变量percpu=True即可
    scputimes(user=38.0399999999999, nice=0.01, system=110.88, idle=177062.59, iowait=53.399999999999, irq=2.91000000000001, softirq=79.5799999999999998, steal=0.0, quest=0.0)
    psutil.cpu_times().user # 获取单项数据信息,如用户user的CPU时间比
    38.0
    psutil.cpu_count() # 获取cpu的逻辑个数,默认logical=True4
    psutil.cpu_count(logical=False) # 获取CPU的物理个数
    2

Linux系统的内存利用率信息涉及total(内存总数)、used(已使用的内存数)、free(空间内存数)、buffers(缓冲使用数)、cache(缓存使用数)、swap(交换分区使用数)等,分别使用psutil.virtual_memory()与psutil.swap_memory()方法获取这些信息。

  1. >>> import psutil
  2. >>> mem = psutil.virtual_memory() #使用psutil.virtual_memory方法获取内存完整信息
  3. >>> mem
  4. svmem(total=506277888L, available=20495152L, percent=59.5, used=499867648L, free=641024L, active=245858304, inactive=163733504, buffers=117035008L, cached=81506304)
  5. >>> mem.total #获取内存总数
  6. 506277888L
  7. >>> mem.free #获取空闲内存数
  8. 6410240L
  9. >>> psutil.swap_memory() #获取SWAP分区信息sswap(total=1073733632L, used=0L, free=1073733632L, percent=0.0, sin=0, sout=0)

在系统的所有磁盘信息中,我们更加关注磁盘的利用率及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()获取。

  1. >>> psutil.disk_partitions() #使用psutil.disk_partitions方法获取磁盘完整信息
  2. [sdiskpart(device='/dev/sda1',mountpoint='/',fstype='ext4',opts='rw'),
  3. sdiskpart(device='/dev/sda3',mountpoint='/data',fstype='ext4',opts='rw')]
  4. >>>
  5. >>> psutil.disk_usage('/') #使用psutil.disk_usage方法获取分区(参数)的使用情况
  6. sdiskusage(total=15481577472, used=4008087552, free=10687057920, precengt=25.8999999999)
  7. >>> psutil.disk_io_counters() #使用psutil.disk_io_counters获取硬盘总的IO个数、读写信息
  8. sdiskio(read_count=9424, write_count=35824, read_bytes=128006144, write_bytes=204312576, read_time=72266, write_time=182485)
  9. >>> pstuil.disk_io_counters(perdisk=True) # 获取单个分区IO个数、读写信息

系统网络信息与磁盘IO类似,涉及几个关键点,包括bytes_sent发送字节数、bytes_recv接收字节数、packets_sent发送数据包数、packets_recv接收数据包数等。这些网络信息使用psutil.net_io_counters()方法获取。

  1. >>> psutil.net_io_counters() #使用psutil.net_io_counters获取网络总的IO信息,默认pernic=False
  2. snetio(bytes_sent=27098178, bytes_recv=28220119, packets_sent=200978, packets_recv=212672, errin=0, errout=0, dropin=0, dropout=0)
  3. >>> psutil.net_io_counters(pernic=True) #pernic=True输出每个网络接口的IO信息
  4. { 'lo': snetio(bytees_sent=26406824, bytes_recv=26406824, packets_sent=198526, packets_recv=198526, errin=0, errout=0, dropin=0, dropout=0), 'eth0': snetio(bytes_sent=694750, bytes_recv=1816743, packets_sent=2478, packets_recv=14175, errin=0, errout=0, dropin=0, dropout=0)}

其他系统信息,psutil模块支持获取用户登录、开机时间等信息

  1. >>> psutil.users() #使用psutil.users方法返回当前登录系统的用户信息
  2. [suser(name='root', terminal='pts/0', host='192.168.1.103', started=1394638720.0)]
  3. >>> import psutil, datetime
  4. >>>> psutil.boot_time() #使用psutil.boot_time方法获取开机时间,以Linux时间戳格式返回
  5. 1389563460.0
  6. >>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")
  7. '2014-01-12 22:51:00'

系统进程管理方法

获取当前系统的进程信息,可以让运维人员得知应用程序的运行状态,包括进程的启动时间、查看或设置CPU亲和度、内存使用率、IO信息、socket连接、线程数等,这些信息可以呈现出指定进程是否存活、资源利用情况,为开发人员的代码优化、问题定位提供很好的数据参考。
psutil模块在获取进程信息方面提供了很好的支持,包括使用psutil.pids方法获取所有进程PID,使用psutil.Process方法获取单个进程的名称、路径、状态、系统资源利用率等信息。

  1. >>> import psutil
  2. >>> psutil.pids() # 列出所有进程PID
  3. [1, 2, 3, 4...]
  4. >>> p = psutil.Process(2424) #实例化一个Process对象,参数为一进程PID
  5. >>> p.name() #进程名
  6. 'java'
  7. >>> p.exe() #进程bin路径
  8. '/usr/java/jdk1.6.0_45/bin/java'
  9. >>> p.cwd() #进程工作目录绝对路径
  10. '/usr/local/hadoop-1.2.1'
  11. >>> p.status() #进程状态
  12. 'sleeping'
  13. >>> p.create_time() #进程创建时间,时间戳格式
  14. 1394852592.6900001
  15. >>> p.uids() #进程uid信息
  16. puids(real=0, effective=0, saved=0)
  17. >>> p.gids() #进程gid信息
  18. pgids(real=0, effective=0, saved=0)
  19. >>> p.cpu_times() #进程CPU时间信息,包括user、system两个CPU时间
  20. pcputimes(user=9.0500000000, system=20.25)
  21. >>> p.cpu_affinity() #get进程CPU亲和度,如要设置进程CPU亲和度,将CPU号作为参数即可
  22. [0,1]
  23. >>> p.memory_percent() #进程内存利用率
  24. 14.147714861289776
  25. >>> p.memory_info() #进程内存rss,vms信息
  26. pmem(rss=71626752, vms=1575665664)
  27. >>> p.io_counters() #进程IO信息,包括读写IO数及字节数
  28. pio(read_count=41133, write_count=16811, read_bytes=37023744, write_bytes=4722688)
  29. >>> p.connects() #返回打开进程socket的namedutples列表,包括fs、family、laddr等信息
  30. [pconn(fd=65, family=10, type=1, laddr={ '::ffff:192.168.1.20',9000},raddr=(),...)]
  31. >>> p.num_threads() #进程开启的线程数
  32. 33

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,292人围观)

还没有评论,来说两句吧...

相关阅读