系统性能信息模块之psutil模块
一、psutil模块介绍
psutil模块安装:https://github.com/giampaolo/psutil/blob/master/INSTALL.rst
官方介绍:https://pypi.org/project/psutil/#downloads
概要
plutil(进程和系统实用程序)是一个跨平台的库,用于在Python中检索有关运行进程和系统资源利用率(CPU,内存,磁盘,网络)的信息。它主要用于系统监视,分析和限制系统资源及运行进程的管理。它实现了Linux命令工具提供的许多功能,例如:ps,top,lsof,netstat,ifconfig,who,df,kill,nice,ionice,iostat,iotop,uptime,pidos,tty,tasket,pmap等。psutil目前支持以下平台:linux、Windows、OSX、FreeBSD,OpenBSD、NETBSD、sun Solaris、AIX操作系统。
二、获取系统性能信息
获取CPU信息
Linux操作系统的CPU利用率有以下几个部分:
- User Time,执行用户进程的时间百分比
- System Time,执行内核进程和中断的时间百分比
- Wait IO,由于IO等待而使CPU处于idle(空闲)状态的时间百分比;
- Idle,CPU处于idle状态的时间百分比。
使用Python的psutil.cpu_times()方法可以非常简单地得到这些信息,同时也可以获取CPU的硬件相关信息,比如CPU的物理个数与逻辑个数,示例如下:
>>> import psutil >>> psutil.cpu_times() scputimes(user=5046.13, nice=0.0, system=7241.73, idle=106233.48) >>> psutil.cpu_times(percpu=True) #显示所有逻辑CPU信息,指定方法变量percpu=True [scputimes(user=1915.16, nice=0.0, system=3071.14, idle=24700.29), scputimes(user=612.52, nice=0.0, system=552.06, idle=28520.87), scputimes(user=1907.31, nice=0.0, system=3077.95, idle=24700.2), scputimes(user=628.63, nice=0.0, system=545.3, idle=28511.51)] >>> psutil.cpu_times().user #获取单项数据信息,如用户user的CPU时间比 5116.06 >>> psutil.cpu_count() #获取CPU的逻辑个数,默认logical=True 4 >>> psutil.cpu_count(logical=False) #获取CPU的物理个数 2 >>> psutil.cpu_stats() scpustats(ctx_switches=128761, interrupts=473080, soft_interrupts=19603638, syscalls=595993) >>> psutil.cpu_freq() scpufreq(current=3100, min=3100, max=3100)
获取内存信息
Linux系统的内存利用率涉及total(内存总数)、used(以使用的内存数)、free(空闲内存数)、buffers(缓冲使用数)、cache(缓存使用数)、swap(交换分区使用数)等,分别使用
psutil.virtual_memory()与psutil.swap_memory()方法获取这些信息,示例如下:
>>> import psutil >>> psutil.virtual_memory() #使用psutil.virtaul_memory方法获取内存完整信息 svmem(total=8589934592, available=2785501184, percent=67.6, used=7854592000, free=346370048, active=3651194880, inactive=2439131136, wired=1764265984) >>> psutil.swap_memory() #获取SWAP分区信息 sswap(total=0, used=0, free=0, percent=0, sin=11696345088, sout=231964672) >>> psutil.virtual_memory().total #获取内存总数 8589934592 >>> psutil.virtual_memory().free #获取空闲内存数 318025728
获取磁盘信息
磁盘IO信息包括read_count(读IO数)、write_count(写IO数)、read_bytes(IO读字节书)、write_bytes(IO写字节数)、read_time(磁盘读时间)、write_time(磁盘写时间)等,
使用psutil.disk_io_counters()获取
>>> import psutil >>> psutil.disk_partitions() #psutil.disk_partitions方法获取磁盘完整信息 [sdiskpart(device='/dev/disk1', mountpoint='/', fstype='hfs', opts='rw,local,rootfs,dovolfs,journaled,multilabel')] >>> psutil.disk_usage('/') #psutil.disk_usage方法获取分区(参数) sdiskusage(total=249664372736, used=90747437056, free=158654791680, percent=36.4) >>> psutil.disk_io_counters() #psutil.disk_io_counters获取磁盘总的IO个数、读写信息 sdiskio(read_count=375539, write_count=149398, read_bytes=9541869056, write_bytes=5333078016, read_time=135111, write_time=94994) >>> psutil.disk_io_counters(perdisk=True) #perdisk=True 参数获取单个分区IO个数、读写信息 {'disk0': sdiskio(read_count=375543, write_count=149432, read_bytes=9541934592, write_bytes=5333483008, read_time=135115, write_time=95009)}
获取网络信息
系统的网络信息与磁盘IO类似,涉及几个关键点,包括bytes_set(发送字节数)、bytes_recv(接收字节数)、packets_set(发送数据包数)、packets_recv(接收数据包数)
>>> psutil.net_io_counters() #psutil.net_io_counters获取网络总的IO信息,默认pernice=False snetio(bytes_sent=53240820, bytes_recv=2436823493, packets_sent=510560, packets_recv=2321776, errin=0, errout=49, dropin=0, dropout=0) >>> psutil.net_io_counters(pernic=True) #pernice=True 参数 输出每个网络接口的IO信息 {'lo0': snetio(bytes_sent=170312, bytes_recv=170312, packets_sent=1271, packets_recv=1271, errin=0, errout=0, dropin=0, dropout=0), 'gif0': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'stf0': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'en0': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'en2': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'en4': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'en1': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'en3': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'bridge0': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'p2p0': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'awdl0': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'en6': snetio(bytes_sent=434385, bytes_recv=810643, packets_sent=2798, packets_recv=2942, errin=0, errout=0, dropin=0, dropout=0), 'utun0': snetio(bytes_sent=268, bytes_recv=0, packets_sent=3, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'en10': snetio(bytes_sent=52635963, bytes_recv=2435926406, packets_sent=506490, packets_recv=2317673, errin=0, errout=49, dropin=0, dropout=0), 'vmnet1': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'vmnet8': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0)} >>> psutil.net_if_addrs() {'lo0': [snic(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast=None, ptp=None), snic(family=<AddressFamily.AF_INET6: 30>, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None), snic(family=<AddressFamily.AF_INET6: 30>, address='fe80::1%lo0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None)], 'en10': [snic(family=<AddressFamily.AF_INET: 2>, address='192.168.12.119', netmask='255.255.255.0', broadcast='192.168.12.255', ptp=None), snic(family=<AddressFamily.AF_LINK: 18>, address='d4:3a:65:07:2a:e2', netmask=None, broadcast=None, ptp=None), snic(family=<AddressFamily.AF_INET6: 30>, address='fe80::18a7:9f11:40a7:c7f4%en10', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None)], 'vmnet1': [snic(family=<AddressFamily.AF_INET: 2>, address='192.168.75.1', netmask='255.255.255.0', broadcast='192.168.75.255', ptp=None), snic(family=<AddressFamily.AF_LINK: 18>, address='00:50:56:c0:00:01', netmask=None, broadcast=None, ptp=None)], 'vmnet8': [snic(family=<AddressFamily.AF_INET: 2>, address='192.168.121.1', netmask='255.255.255.0', broadcast='192.168.121.255', ptp=None), snic(family=<AddressFamily.AF_LINK: 18>, address='00:50:56:c0:00:08', netmask=None, broadcast=None, ptp=None)], 'en0': [snic(family=<AddressFamily.AF_LINK: 18>, address='8c:85:90:3c:fa:20', netmask=None, broadcast=None, ptp=None)], 'en2': [snic(family=<AddressFamily.AF_LINK: 18>, address='5a:00:24:a0:8d:04', netmask=None, broadcast=None, ptp=None)], 'en4': [snic(family=<AddressFamily.AF_LINK: 18>, address='5a:00:24:a0:8d:05', netmask=None, broadcast=None, ptp=None)], 'en1': [snic(family=<AddressFamily.AF_LINK: 18>, address='5a:00:24:a0:8d:00', netmask=None, broadcast=None, ptp=None)], 'en3': [snic(family=<AddressFamily.AF_LINK: 18>, address='5a:00:24:a0:8d:01', netmask=None, broadcast=None, ptp=None)], 'bridge0': [snic(family=<AddressFamily.AF_LINK: 18>, address='5a:00:24:a0:8d:00', netmask=None, broadcast=None, ptp=None)], 'p2p0': [snic(family=<AddressFamily.AF_LINK: 18>, address='0e:85:90:3c:fa:20', netmask=None, broadcast=None, ptp=None)], 'awdl0': [snic(family=<AddressFamily.AF_LINK: 18>, address='62:46:b9:22:e2:44', netmask=None, broadcast=None, ptp=None)], 'en6': [snic(family=<AddressFamily.AF_LINK: 18>, address='ac:de:48:00:11:22', netmask=None, broadcast=None, ptp=None), snic(family=<AddressFamily.AF_INET6: 30>, address='fe80::aede:48ff:fe00:1122%en6', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None)], 'utun0': [snic(family=<AddressFamily.AF_INET6: 30>, address='fe80::37a7:ebf5:f72a:6017%utun0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None)]} >>> >>> psutil.net_if_stats() {'lo0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=16384), 'gif0': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1280), 'stf0': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1280), 'en0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1500), 'en2': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500), 'en4': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500), 'en1': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500), 'en3': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500), 'bridge0': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1500), 'p2p0': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=2304), 'awdl0': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1484), 'en6': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1500), 'utun0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=2000), 'en10': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=100, mtu=1500), 'vmnet1': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1500), 'vmnet8': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1500)}
other system info
>>> import psutil >>> psutil.users() #psutil.users方法返回当前登录系统的用户信息 [suser(name='root', terminal='pts/0', host='192.168.121.1', started=1527069184.0)] >>> psutil.boot_time() #psutil.boot_time方法获取开机时间,以Linux时间戳格式返回 1527069188.0 >>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S") #转换成自然时间格式 '2018-05-23 17:53:08'