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() # 磁盘IOsdiskio(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 psutildef 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 = 3while 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 -= 1print_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_strdef mem_info():print_str = ""mem_total = []mem_ava = []mem_per = []mem_free = []mem_ava_per = []count = 3while 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 -= 1bytes_M = 1024 * 1024print_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_strdef bytes2human(n):symbols = ("K", "M", "G", "T", "P", "E", "Z", "Y")prefix = {}for i,s in enumerate(symbols):prefix[s] = 1 << (i + 1) * 10for s in reversed(symbols):if n >= prefix[s]:value = float(n) / prefix[s]return "%.1f%s" % (value, s)return "%sB" % ndef get_dist_info():disk_total = []disk_uesd = []disk_free = []disk_precent = []count = 3while 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 -= 1print_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_strdef 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 + diskwrite_log(print_total)
