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信息
>>> import psutil
>>> psutil.cpu_count() # CPU逻辑数量
4
>>> psutil.cpu_count(logical=False) # CPU物理核心
4
>>> psutil.cpu_times() # CPU时间
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. 获取内存信息
>>> import psutil
>>> psutil.virtual_memory() # 总内存/可用内存/内存使用率/已用内存/空闲内存
svmem(total=16926494720, available=10762715136, percent=36.4, used=6163779584, free=10762715136)
3. 获取磁盘信息
>>> import psutil
>>> psutil.disk_partitions() # 磁盘分区信息
[sdiskpart(device='/dev/mapper/vg_tony-lv_root', mountpoint='/', fstype='ext4', opts='rw'), sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='ext4', opts='rw')]
>>> psutil.disk_usage('/') # 磁盘使用情况
sdiskusage(total=18569568256, used=1994440704, free=15631831040, percent=11.3)
>>> psutil.disk_io_counters() # 磁盘IO
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. 获取网络信息
>>> import psutil
>>> psutil.net_io_counters() # 获取网络读写字节/包的个数
snetio(bytes_sent=23277, bytes_recv=134908, packets_sent=226, packets_recv=1865, errin=0, errout=0, dropin=0, dropout=0)
>>> psutil.net_if_addrs() # 获取网络接口信息
{
'lo': [*****],
'eth0': [****)]
}
>>> psutil.net_if_stats() # 获取网络接口状态
{
'lo': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=16436),
'eth0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1000, mtu=1500)
}
4. psutil实例
利用psutil功能获取系统资源信息
import psutil
def cpu_info():
print_str = ''
print_str += "当前系统cpu使用情况:\n"
cpu_per = []
cpu_user = []
cpu_nice = []
cpu_system = []
cpu_idle = []
cpu_iowait = []
cpu_irq = []
cpu_softirq = []
cpu_steal = []
cpu_guest = []
count = 3
while count > 0:
cpu_status = psutil.cpu_times()
cpu_per.append(psutil.cpu_percent(interval=2))
cpu_user.append(cpu_status.user)
cpu_nice.append(cpu_status.nice)
cpu_system.append(cpu_status.system)
cpu_idle.append(cpu_status.idle)
cpu_iowait.append(cpu_status.iowait)
cpu_irq.append(cpu_status.irq)
cpu_softirq.append(cpu_status.softirq)
cpu_steal.append(cpu_status.steal)
cpu_guest.append(cpu_status.guest)
count -= 1
print_str += (" cpu利用率 = " + str(round(sum(cpu_per)/3, 2)) + "%\n")
print_str += (" user = " + str(round(sum(cpu_user)/3, 2)) + "\n")
print_str += (" nice = " + str(round(sum(cpu_nice)/3, 2)) + "\n")
print_str += (" system = " + str(round(sum(cpu_system)/3, 2)) + "\n")
print_str += (" idle = " + str(round(sum(cpu_idle)/3, 2)) + "\n")
print_str += (" iowait = " + str(round(sum(cpu_iowait)/3, 2)) + "\n")
print_str += (" irq = " + str(round(sum(cpu_irq)/3, 2)) + "\n")
print_str += (" softirq = " + str(round(sum(cpu_softirq)/3, 2)) + "\n")
print_str += (" steal = " + str(round(sum(cpu_steal)/3, 2)) + "\n")
print_str += (" guest = " + str(round(sum(cpu_guest)/3, 2)) + "\n")
print_str += "************\n"
return print_str
def mem_info():
print_str = ""
mem_total = []
mem_ava = []
mem_per = []
mem_free = []
mem_ava_per = []
count = 3
while count > 0:
mem = psutil.virtual_memory()
mem_total.append(mem.total)
mem_ava.append(mem.available)
mem_per.append(mem.percent)
mem_free.append(mem.free)
mem_ava_per.append(mem.available*100 / mem.total)
count -= 1
bytes_M = 1024 * 1024
print_str += '当前系统内存使用情况:\n'
print_str += ' 总内存:%sM \n' % round(sum(mem_total)/3/bytes_M, 2)
print_str += ' 可用内存:%sM \n' % round(sum(mem_ava)/3/bytes_M, 2)
print_str += ' 已使用(占比):%s%s \n' % (sum(mem_per)/3, '%')
print_str += ' 剩余内存:%sM\n' % round(sum(mem_free)/3/bytes_M, 2)
percent_ava = round((sum(mem_ava)/3 * 100) / (sum(mem_total)/3), 1)
if percent_ava >= 20:
print_str += ' 当前系统可用内存充足,清放心使用!\n'
else:
print_str += ' 当前系统可用内存不足,请注意!\n'
print_str += (' 当前系统可用内存百分比:' + str(percent_ava) + '%\n')
if psutil.swap_memory().percent <= 0.7:
print_str += ' 虚拟内存空间使用率良好.\n'
else:
print_str += ' 当前虚拟内存使用超出规定上限,请注意!\n'
print_str += (' 当前系统的SWAP交换空间(虚拟内存)利用率为:' + str(psutil.swap_memory().percent) + '%\n')
print_str += '************\n'
return print_str
def bytes2human(n):
symbols = ("K", "M", "G", "T", "P", "E", "Z", "Y")
prefix = {}
for i,s in enumerate(symbols):
prefix[s] = 1 << (i + 1) * 10
for s in reversed(symbols):
if n >= prefix[s]:
value = float(n) / prefix[s]
return "%.1f%s" % (value, s)
return "%sB" % n
def get_dist_info():
disk_total = []
disk_uesd = []
disk_free = []
disk_precent = []
count = 3
while count > 0:
disk_usage = psutil.disk_usage("/")
disk_total.append(disk_usage.total)
disk_uesd.append(disk_usage.used)
disk_free.append(disk_usage.free)
disk_precent.append(disk_usage.percent)
count -= 1
print_str = "当前系统磁盘使用情况:\n"
print_str += (" 磁盘总量 = " + bytes2human(sum(disk_total)/3) + "\n")
print_str += (" 磁盘使用 = " + bytes2human(sum(disk_uesd)/3) + "\n")
print_str += (" 磁盘剩余 = " + bytes2human(sum(disk_free)/3) + "\n")
print_str += (" 磁盘使用率 = " + str(sum(disk_precent)/3) + "%\n")
print_str += "************\n"
return print_str
def write_log(print_info):
time_str = time.strftime("%Y-%m-%d", time.localtime())
file_name = "./" + time_str + ".log"
if not os.path.exists(file_name):
os.mknod(file_name)
with open(file_name, "w") as f:
f.write(print_info)
else:
with open(file_name, "a") as f:
f.write(print_info)
if __name__ == '__main__':
now_time = time.strftime('%H:%M:%S', time.localtime(time.time()))
cpu = cpu_info.cpu_info()
mem = mem_info.mem_info()
disk = disk_io_info.get_dist_info()
print_total = "*******************************\n" + now_time + '\n' + cpu + mem + disk
write_log(print_total)