概述

URL:https://github.com/giampaolo/psutil

psutil模块是一个跨平台库,能够轻松实现获取系统运行的进程和系统资源利用率(包括CPU、内存、磁盘、网络等)信息。

它实现了系统命令行工具提供的类似功能,例如ps、top、ifconfig、who、df、free、iostate等。

支持以下操作系统:

  • Linux
  • Windows
  • OSX
  • FreeBSD
  • OpenBSD
  • NetBSD
  • Sun Solaris
  • AIX

安装

1
pip install psutil

bash命令行与psutil方法的的对比

以内存为例

bash命令行:

1
2
(py3) [root@python3 study]# free -h|grep Mem|awk '{print $2}'
1.8G # 单位为GB

psutil:

1
2
3
4
5
6
>>> import psutil
>>> mem = psutil.virtual_memory()
>>> mem.total
1907802112 # 单位为Byte
>>> mem.total/1024/1024/1024
1.7767791748046875

方法

CPU相关

方法说明

方法 说明
psutil.cpu_count() cpu_count(,[logical]):默认返回逻辑CPU的个数,当设置logical的参数为False时,返回物理CPU的个数。
psutil.cpu_percent() cpu_percent(,[percpu],[interval]):返回CPU的利用率,percpu为True时显示所有物理核心的利用率,interval不为0时,则阻塞时显示interval执行的时间内的平均利用率
psutil.cpu_times() cpu_times(,[percpu]):以命名元组(namedtuple)的形式返回cpu的时间花费,percpu=True表示获取每个CPU的时间花费
psutil.cpu_times_percent() cpu_times_percent(,[percpu]):功能和cpu_times大致相同,看字面意思就能知道,该函数返回的是耗时比例。
psutil.cpu_stats() cpu_stats():以命名元组的形式返回CPU的统计信息,包括上下文切换,中断,软中断和系统调用次数。
psutil.cpu_freq() cpu_freq([percpu]):返回cpu频率

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> import psutil
>>> psutil.cpu_count() # 逻辑CPU个数
2
>>> psutil.cpu_count(logical=False) # 物理CPU个数
2
>>> psutil.cpu_percent() # CPU使用率
0.1
>>> psutil.cpu_percent(percpu=True) # 每颗CPU的使用率
[0.1, 0.1]
>>> psutil.cpu_times() # CPU时间消耗
scputimes(user=190.62, nice=0.0, system=70.92, idle=5535.72, iowait=1.95, irq=0.0, softirq=0.98, steal=0.0, guest=0.0, guest_nice=0.0)
>>> psutil.cpu_times_percent() # CPU时间消耗比例
scputimes(user=0.0, nice=0.0, system=0.1, idle=99.9, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)
>>> psutil.cpu_stats() # CPU上下文切换、中断、系统调用次数
scpustats(ctx_switches=658003, interrupts=625658, soft_interrupts=794512, syscalls=0)
>>> psutil.cpu_freq() # CPU频率
scpufreq(current=3399.998, min=0.0, max=0.0)

内存相关

方法说明

方法 说明
virtual_memory() 以命名元组的形式返回内存使用情况,包括总内存,可用内存,内存利用率,buffer和cache等。单位为字节。
swap_memory() 以命名元组的形式返回swap/memory使用情况,包含swap中页的换入和换出。

示例

1
2
3
4
5
>>> import psutil
>>> psutil.swap_memory()
sswap(total=0, used=0, free=0, percent=0.0, sin=0, sout=0) # 未设置swap
>>> psutil.virtual_memory()
svmem(total=1907802112, available=1515216896, percent=20.6, used=194908160, free=890662912, active=407932928, inactive=384516096, buffers=2154496, cached=820076544, shared=18534400, slab=138489856)

磁盘相关

方法说明

方法 说明
psutil.disk_io_counters() disk_io_counters([perdisk]):以命名元组的形式返回磁盘io统计信息(汇总的),包括读、写的次数,读、写的字节数等。
当perdisk的值为True,则分别列出单个磁盘的统计信息(字典:key为磁盘名称,value为统计的namedtuple)。
psutil.disk_partitions() disk_partitions([all=False]):以命名元组的形式返回所有已挂载的磁盘,包含磁盘名称,挂载点,文件系统类型等信息。
当all等于True时,返回包含/proc等特殊文件系统的挂载信息
psutil.disk_usage() disk_usage(path):以命名元组的形式返回path所在磁盘的使用情况,包括磁盘的容量、已经使用的磁盘容量、磁盘的空间利用率等。

示例说明

1
2
3
4
5
6
7
8
9
10
11
>>> import psutil
>>> psutil.disk_io_counters()
sdiskio(read_count=23752, write_count=48350, read_bytes=741232128, write_bytes=1436610560, read_time=19680, write_time=112982, read_merged_count=3, write_merged_count=2840, busy_time=24556)

>>> psutil.disk_partitions() # CentOS
[sdiskpart(device='/dev/mapper/centos-root', mountpoint='/', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota'), sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota')]
>>> psutil.disk_partitions() # Windows
[sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='E:\\', mountpoint='E:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='F:\\', mountpoint='F:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='G:\\', mountpoint='G:\\', fstype='NTFS', opts='rw,fixed')]

>>> psutil.disk_usage('/') # 查看单个磁盘使用率
sdiskusage(total=30045900800, used=2484969472, free=27560931328, percent=8.3)

网络相关

方法说明

函数 详情
psutil.net_io_counter([pernic]) 以命名元组的形式返回当前系统中每块网卡的网络io统计信息,包括收发字节数,收发包的数量、出错的情况和删包情况。当pernic为True时,则列出所有网卡的统计信息。
psutil.net_connections([kind]) 以列表的形式返回每个网络连接的详细信息(namedtuple)。命名元组包含fd, family, type, laddr, raddr, status, pid等信息。kind表示过滤的连接类型,支持的值如下:(默认为inet)
psutil.net_if_addrs() 以字典的形式返回网卡的配置信息,包括IP地址和mac地址、子网掩码和广播地址。
psutil.net_if_stats() 返回网卡的详细信息,包括是否启动、通信类型、传输速度与mtu。
psutil.users() 以命名元组的方式返回当前登陆用户的信息,包括用户名,登陆时间,终端,与主机信息
psutil.boot_time() 以时间戳的形式返回系统的启动时间

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> psutil.net_io_counters()
snetio(bytes_sent=516102, bytes_recv=40080757, packets_sent=5633, packets_recv=30276, errin=0, errout=0, dropin=0, dropout=0)

>>> psutil.net_if_addrs()
{'lo': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 10>, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_PACKET: 17>, address='00:00:00:00:00:00', netmask=None, broadcast=None, ptp=None)], 'ens33': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.10.20', netmask='255.255.255.0', broadcast='192.168.10.255', ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 10>, address='fe80::af1b:e785:a3f6:76ee%ens33', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_PACKET: 17>, address='00:0c:29:ac:7b:d8', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]}

>>> psutil.net_if_stats()
{'lo': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=65536), 'ens33': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1000, mtu=1500)}

>>> psutil.net_connections()
[sconn(fd=13, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='127.0.0.1', port=25), raddr=(), status='LISTEN', pid=1728), sconn(fd=4, family=<AddressFamily.AF_INET6: 10>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='::', port=22), raddr=(), status='LISTEN', pid=1402), sconn(fd=3, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='192.168.10.20', port=22), raddr=addr(ip='192.168.10.1', port=56457), status='ESTABLISHED', pid=10844), sconn(fd=3, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='192.168.10.20', port=22), raddr=addr(ip='192.168.10.1', port=57415), status='ESTABLISHED', pid=10411), sconn(fd=3, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='192.168.10.20', port=22), raddr=addr(ip='192.168.10.1', port=56456), status='ESTABLISHED', pid=10842), sconn(fd=6, family=<AddressFamily.AF_INET6: 10>, type=<SocketKind.SOCK_DGRAM: 2>, laddr=addr(ip='::1', port=323), raddr=(), status='NONE', pid=976), sconn(fd=3, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='0.0.0.0', port=22), raddr=(), status='LISTEN', pid=1402), sconn(fd=14, family=<AddressFamily.AF_INET6: 10>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='::1', port=25), raddr=(), status='LISTEN', pid=1728), sconn(fd=5, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_DGRAM: 2>, laddr=addr(ip='127.0.0.1', port=323), raddr=(), status='NONE', pid=976), sconn(fd=3, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='192.168.10.20', port=22), raddr=addr(ip='192.168.10.1', port=57325), status='ESTABLISHED', pid=25106), sconn(fd=3, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='192.168.10.20', port=22), raddr=addr(ip='192.168.10.1', port=57324), status='ESTABLISHED', pid=25104)]

>>> psutil.users() # 查看当前用户的信息
[suser(name='root', terminal='tty1', host='', started=1580717824.0, pid=987), suser(name='root', terminal='pts/0', host='192.168.10.1', started=1580717952.0, pid=10414), suser(name='root', terminal='pts/1', host='192.168.10.1', started=1598920704.0, pid=10846), suser(name='root', terminal='pts/2', host='192.168.10.1', started=1598921856.0, pid=25108)]

>>> psutil.boot_time()
1527819435.0 # 时间戳

进程相关

方法说明

函数 详情
psutil.pids() 以列表的形式返回当前正在运行的进程
psutil.pid_exists(1) 判断给点定的pid是否存在
psutil.process_iter() 迭代当前正在运行的进程,返回的是每个进程的Process对象
psutil.Process() 对进程进行封装,可以使用该类的方法获取进行的详细信息,或者给进程发送信号。

psutil.Process()相关的方法:

  • name:获取进程的名称
  • cmdline:获取启动进程的命令行参数
  • create_time:获取进程的创建时间(时间戳格式)
  • num_fds:进程打开的文件个数
  • num_threads:进程的子进程个数
  • is_running:判断进程是否正在运行
  • send_signal:给进程发送信号,类似与os.kill等
  • kill:发送SIGKILL信号结束进程
  • terminate:发送SIGTEAM信号结束进程

示例

1
2
3
4
5
6
7
>>> psutil.pids() # 查看正在运行的进程PID
[1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 35, 36, 37, 38, 46, 49, 50, 51, 53, 66, 101, 272, 273, 274, 275, 310, 312, 317, 319, 320, 321, 323, 325, 399, 400, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 507, 527, 529, 673, 682, 683, 689, 694, 701, 704, 705, 851, 953, 954, 956, 957, 959, 960, 961, 965, 967, 976, 987, 1402, 1404, 1405, 1728, 1747, 2224, 9617, 10842, 10844, 10846, 10863, 10928, 24116, 24117, 25104, 25106, 25108, 25277, 26188, 26384, 44410, 44421, 44435, 44442, 44443, 44444]

>>> psutil.Process(1) # 查看PID为1的进程状态
psutil.Process(pid=1, name='systemd', status='sleeping', started='08:28:47')
>>> psutil.Process(1).name() # 获取PID为1的进程名称
'systemd'