1. psutil简介

  • psutil是一个开源切跨平台的库,其提供了便利的函数用来获取才做系统的信息,比如CPU,内存,磁盘,网络等。此外,psutil还可以用来进行进程管理,包括判断进程是否存在、获取进程列表、获取进程详细信息等。
  • psutil是一个跨平台的库,在官方网站上查到其支持如下操作系统。
    • Linux
    • Windows
    • OSX
    • FreeBSD
    • OpenBSD
    • NetBSD
    • Sun Solaris
    • AIX
  • psutil包含了异常、类、功能函数和常量,其中功能函数用来获取系统的信息,如CPU、磁盘、内存、网络等。类用来实现进程的管理功能

    2. psutil安装

    $ pip install psutil

3. psutil使用

1. 获取CPU信息

  1. >>> import psutil
  2. >>> psutil.cpu_count() # CPU逻辑数量
  3. 4
  4. >>> psutil.cpu_count(logical=False) # CPU物理核心
  5. 4
  6. >>> psutil.cpu_times() # CPU时间
  7. scputimes(user=1.92, nice=0.0, system=4.64, idle=297.77, iowait=0.56, irq=0.0, softirq=0.0, steal=0.0, guest=0.0)

2. 获取内存信息

  1. >>> import psutil
  2. >>> psutil.virtual_memory() # 总内存/可用内存/内存使用率/已用内存/空闲内存
  3. svmem(total=16926494720, available=10762715136, percent=36.4, used=6163779584, free=10762715136)

3. 获取磁盘信息

  1. >>> import psutil
  2. >>> psutil.disk_partitions() # 磁盘分区信息
  3. [sdiskpart(device='/dev/mapper/vg_tony-lv_root', mountpoint='/', fstype='ext4', opts='rw'), sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='ext4', opts='rw')]
  4. >>> psutil.disk_usage('/') # 磁盘使用情况
  5. sdiskusage(total=18569568256, used=1994440704, free=15631831040, percent=11.3)
  6. >>> psutil.disk_io_counters() # 磁盘IO
  7. sdiskio(read_count=6118, write_count=897, read_bytes=107744256, write_bytes=5440512, read_time=3123, write_time=367, read_merged_count=1704, write_merged_count=432, busy_time=1984)

4. 获取网络信息

  1. >>> import psutil
  2. >>> psutil.net_io_counters() # 获取网络读写字节/包的个数
  3. snetio(bytes_sent=23277, bytes_recv=134908, packets_sent=226, packets_recv=1865, errin=0, errout=0, dropin=0, dropout=0)
  4. >>> psutil.net_if_addrs() # 获取网络接口信息
  5. {
  6. 'lo': [*****],
  7. 'eth0': [****)]
  8. }
  9. >>> psutil.net_if_stats() # 获取网络接口状态
  10. {
  11. 'lo': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=16436),
  12. 'eth0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1000, mtu=1500)
  13. }

4. psutil实例

利用psutil功能获取系统资源信息

  1. import psutil
  2. def cpu_info():
  3. print_str = ''
  4. print_str += "当前系统cpu使用情况:\n"
  5. cpu_per = []
  6. cpu_user = []
  7. cpu_nice = []
  8. cpu_system = []
  9. cpu_idle = []
  10. cpu_iowait = []
  11. cpu_irq = []
  12. cpu_softirq = []
  13. cpu_steal = []
  14. cpu_guest = []
  15. count = 3
  16. while count > 0:
  17. cpu_status = psutil.cpu_times()
  18. cpu_per.append(psutil.cpu_percent(interval=2))
  19. cpu_user.append(cpu_status.user)
  20. cpu_nice.append(cpu_status.nice)
  21. cpu_system.append(cpu_status.system)
  22. cpu_idle.append(cpu_status.idle)
  23. cpu_iowait.append(cpu_status.iowait)
  24. cpu_irq.append(cpu_status.irq)
  25. cpu_softirq.append(cpu_status.softirq)
  26. cpu_steal.append(cpu_status.steal)
  27. cpu_guest.append(cpu_status.guest)
  28. count -= 1
  29. print_str += (" cpu利用率 = " + str(round(sum(cpu_per)/3, 2)) + "%\n")
  30. print_str += (" user = " + str(round(sum(cpu_user)/3, 2)) + "\n")
  31. print_str += (" nice = " + str(round(sum(cpu_nice)/3, 2)) + "\n")
  32. print_str += (" system = " + str(round(sum(cpu_system)/3, 2)) + "\n")
  33. print_str += (" idle = " + str(round(sum(cpu_idle)/3, 2)) + "\n")
  34. print_str += (" iowait = " + str(round(sum(cpu_iowait)/3, 2)) + "\n")
  35. print_str += (" irq = " + str(round(sum(cpu_irq)/3, 2)) + "\n")
  36. print_str += (" softirq = " + str(round(sum(cpu_softirq)/3, 2)) + "\n")
  37. print_str += (" steal = " + str(round(sum(cpu_steal)/3, 2)) + "\n")
  38. print_str += (" guest = " + str(round(sum(cpu_guest)/3, 2)) + "\n")
  39. print_str += "************\n"
  40. return print_str
  41. def mem_info():
  42. print_str = ""
  43. mem_total = []
  44. mem_ava = []
  45. mem_per = []
  46. mem_free = []
  47. mem_ava_per = []
  48. count = 3
  49. while count > 0:
  50. mem = psutil.virtual_memory()
  51. mem_total.append(mem.total)
  52. mem_ava.append(mem.available)
  53. mem_per.append(mem.percent)
  54. mem_free.append(mem.free)
  55. mem_ava_per.append(mem.available*100 / mem.total)
  56. count -= 1
  57. bytes_M = 1024 * 1024
  58. print_str += '当前系统内存使用情况:\n'
  59. print_str += ' 总内存:%sM \n' % round(sum(mem_total)/3/bytes_M, 2)
  60. print_str += ' 可用内存:%sM \n' % round(sum(mem_ava)/3/bytes_M, 2)
  61. print_str += ' 已使用(占比):%s%s \n' % (sum(mem_per)/3, '%')
  62. print_str += ' 剩余内存:%sM\n' % round(sum(mem_free)/3/bytes_M, 2)
  63. percent_ava = round((sum(mem_ava)/3 * 100) / (sum(mem_total)/3), 1)
  64. if percent_ava >= 20:
  65. print_str += ' 当前系统可用内存充足,清放心使用!\n'
  66. else:
  67. print_str += ' 当前系统可用内存不足,请注意!\n'
  68. print_str += (' 当前系统可用内存百分比:' + str(percent_ava) + '%\n')
  69. if psutil.swap_memory().percent <= 0.7:
  70. print_str += ' 虚拟内存空间使用率良好.\n'
  71. else:
  72. print_str += ' 当前虚拟内存使用超出规定上限,请注意!\n'
  73. print_str += (' 当前系统的SWAP交换空间(虚拟内存)利用率为:' + str(psutil.swap_memory().percent) + '%\n')
  74. print_str += '************\n'
  75. return print_str
  76. def bytes2human(n):
  77. symbols = ("K", "M", "G", "T", "P", "E", "Z", "Y")
  78. prefix = {}
  79. for i,s in enumerate(symbols):
  80. prefix[s] = 1 << (i + 1) * 10
  81. for s in reversed(symbols):
  82. if n >= prefix[s]:
  83. value = float(n) / prefix[s]
  84. return "%.1f%s" % (value, s)
  85. return "%sB" % n
  86. def get_dist_info():
  87. disk_total = []
  88. disk_uesd = []
  89. disk_free = []
  90. disk_precent = []
  91. count = 3
  92. while count > 0:
  93. disk_usage = psutil.disk_usage("/")
  94. disk_total.append(disk_usage.total)
  95. disk_uesd.append(disk_usage.used)
  96. disk_free.append(disk_usage.free)
  97. disk_precent.append(disk_usage.percent)
  98. count -= 1
  99. print_str = "当前系统磁盘使用情况:\n"
  100. print_str += (" 磁盘总量 = " + bytes2human(sum(disk_total)/3) + "\n")
  101. print_str += (" 磁盘使用 = " + bytes2human(sum(disk_uesd)/3) + "\n")
  102. print_str += (" 磁盘剩余 = " + bytes2human(sum(disk_free)/3) + "\n")
  103. print_str += (" 磁盘使用率 = " + str(sum(disk_precent)/3) + "%\n")
  104. print_str += "************\n"
  105. return print_str
  106. def write_log(print_info):
  107. time_str = time.strftime("%Y-%m-%d", time.localtime())
  108. file_name = "./" + time_str + ".log"
  109. if not os.path.exists(file_name):
  110. os.mknod(file_name)
  111. with open(file_name, "w") as f:
  112. f.write(print_info)
  113. else:
  114. with open(file_name, "a") as f:
  115. f.write(print_info)
  116. if __name__ == '__main__':
  117. now_time = time.strftime('%H:%M:%S', time.localtime(time.time()))
  118. cpu = cpu_info.cpu_info()
  119. mem = mem_info.mem_info()
  120. disk = disk_io_info.get_dist_info()
  121. print_total = "*******************************\n" + now_time + '\n' + cpu + mem + disk
  122. write_log(print_total)