一. 介绍

1
2
3
4
5
6
介绍
● process and system utilities
● 能够轻松的实现获取系统运行的进程和系统利用率(CPU、内存、磁盘、网络等)信息,主要应用于系统监控
● 实现了同等命令命令行实现的功能:ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等
● 跨平台:linux、windows、OS X、FreeBSD和Sun Solaris等
● 主要功能包含:CPU、磁盘、内存、网络、进程

二. 安装

1
2
3
4
5
6
7
8
9
10
11
安装
● 源码安装:git clone https://github.com/giampaolo/psutil.git
cd psutil
python3 setup.py install
● 先安装相关库:yum install python3-devel,(用yum list |grep python|grep dev 找到包名), pip3 install psutil
● 导入使用模块: import psutil

[root@cPen_B ~]# yum list |grep python |grep dev
python36-devel.x86_64 3.6.8-2.module_el8.1.0+245+c39af44f @AppStream
[root@cPen_B ~]# yum install python36-devel.x86_64
[root@cPen_B ~]# pip3 install psutil

三. 获取系统基本信息

CPU

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
1、cpu
● psutil.cpu_count(,[logical]):默认返回逻辑CPU的个数,当设置logical的参数为False时,返回物理CPU的个数
● psutil.cpu_percent(,[percpu],[interval]):返回CPU的利用率,percpu为True时显示所有物理核心的利用率,interval不为0时,则阻塞时显示interval执行的时间内的平均利用率
● psutil.cpu_times(,[percpu]):以命名元组(namedtuple)的形式返回cpu的时间花费,percpu=True表示获取每个CPU的时间花费
user:执行用户进程的时间
system:执行内核进程时间
idle:闲置的时间
iowait:等待io操作的时间
irp:硬中断时间
softirq:软中断时间
● psutil.cpu_times_percent(,[percpu]):功能和cpu_times大致相同,返回耗时比例
● psutil.cpu_stats(): 以命名元组的形式返回CPU的统计信息,包括上下文切换,中断,软中断和系统调用次数
ctx_switches:上下文切换次数
interrupts:中断次数
soft_interrupts:软中断次数
syscalls:系统调用次数,linux上始终为0
● psutil.cpu_freq(): 返回cpu频率

# 示例1:返回CPU个数
>>> import psutil
>>> psutil.cpu_count() # 注:返回逻辑CPU个数
2
>>> psutil.cpu_count(logical=False) # 注:返回物理CPU个数
2
# 示例2:CPU使用率 百分比利用率
>>> psutil.cpu_percent()
0.1
# 示例3:cpu_times
>>> psutil.cpu_times() # 注:花费的时间占用总时间的百分比
scputimes(user=105.27, nice=0.1, system=81.87, idle=69229.05, iowait=11.17, irq=0.0, softirq=5.25, steal=0.0, guest=0.0, guest_nice=0.0)
# 示例4:返回每个核的利用率
>>> psutil.cpu_percent(percpu = True)
[0.1, 0.1]

memory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2、memory
● virtual_memory():以命名元组的形式返回内存使用情况,单位为字节
total:总物理内存
available:可用内存,available ~free + buffers + cached
percent:使用率: percent = (total - available) / total * 100
used:使用的内存: used = total - free - buffers - cache
free:完全没用使用内存
active:最近被访问的内存
inactive:长时间未被访问的内存
buffers:缓存
cached:缓存
slab:内核数据结构缓存的内存
● swap_memory:以命名元组的形式返回swap/memory使用情况,包含swap中页的换入和换出

# 示例1:virtual_memory
>>> psutil.virtual_memory()
svmem(total=3953979392, available=3447025664, percent=12.8, used=249577472, free=3045027840, active=350208000, inactive=329723904, buffers=2162688, cached=657211392, shared=12365824, slab=117297152)

disk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
3、disk(linux命令:iostat,df)
● psutil.disk_io_counters([perdisk]):以命名元组的形式返回磁盘io统计信息(汇总的),包括读、写的次数,读、写的字节数等
● psutil.disk_partitions():磁盘挂载分区信息
device:分区
mountpoint:挂载点
fstype:文件系统格式(fat、ext4、 xfs)
opts:挂载参数
● disk_usage:磁盘使用情况,需要传入一个路径参数
>>> psutil.disk_usage('/')
sdiskusage(total=250685575168, used=103938019328, free=134242258944, percent=43.6)
● iostat : %util 数值越大越忙碌,到达了io瓶颈(安装包:yum install sysstat)

# 示例1:磁盘挂载分区信息 disk_partitions
>>> psutil.disk_partitions()
[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')]
# 示例2:磁盘使用情况 disk_usage
>>> psutil.disk_usage("/") # 注:需要接挂载点
sdiskusage(total=18238930944, used=2300264448, free=15938666496, percent=12.6)

Network

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
4、Network(linux命令:ifconfig、who、uptime,netstat)
● psutil.net_io_counters([pernic]):以命名元组的形式返回当前系统中每块网卡的网络io统计信息,包括收发字节数,收发包的数量、出错的情况和删包情况。当pernic为True时,则列出所有网卡的统计信息
● psutil.net_connections([kind]):以列表的形式返回每个网络连接的详细信息(namedtuple)
fd:文件描述符
family:地址簇,ipv4(AF_INET),ipv6
type:SOCK_STREAM(tcp)、udp
laddr:本地ip地址
raddr
status
pid
● psutil.net_if_addrs():以字典的形式返回网卡的配置信息,包括IP地址和mac地址、子网掩码和广播地址
● psutil.net_if_stats():返回网卡的详细信息,包括是否启动、通信类型、传输速度与mtu
mtu:最大传输单元
● psutil.users():以命名元组的方式返回当前登陆用户的信息,包括用户名,登陆时间,终端
● psutil.boot_time():以时间戳的形式返回系统的启动时间

# 示例1:psutil.users 以命名元组的方式返回当前登陆用户的信息,包括用户名,登陆时间,终端
>>> psutil.users() # 注:w、who命令
[suser(name='root', terminal='tty1', host='', started=1606217600.0, pid=708), suser(name='root', terminal='pts/0', host='192.168.0.42', started=1606361216.0, pid=5921), suser(name='root', terminal='pts/2', host='192.168.0.42', started=1606361216.0, pid=5942), suser(name='root', terminal='pts/6', host='192.168.0.42', started=1606354816.0, pid=5239), suser(name='root', terminal='pts/7', host='192.168.0.42', started=1606357120.0, pid=5312)]
# 示例2:net_if_addrs
>>> psutil.net_if_addrs() # 注:lo本地回环地址 127.0.0.1
{'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.0.21', netmask='255.255.255.0', broadcast='192.168.0.255', ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 10>, address='fe80::22d8:5740:d6d7:d1ff%ens33', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_PACKET: 17>, address='00:0c:29:d1:80:fa', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]}

进程管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
5、进程管理(linux命令:ps、kill)
● psutil.pids():以列表的形式返回当前正在运行的进程
● psutil.pid_exists(1):判断给点定的pid是否存在
● psutil.Process(1):对进程进行封装,可以使用该类的方法获取进行的详细信息,或者给进程发送信号
● psutil.process_iter():迭代当前正在运行的进程,返回的是每个进程的Process对象
name:获取进程的名称
cmdline:获取启动进程的命令行参数
create_time:获取进程的创建时间
uids:进程uid信息
num_threads:开启的线程数
exe:进程工作的绝对路径
kill:发送SIGKILL信号结束进程

示例:process_iter 迭代当前正在运行的进程
>>> psutil.process_iter()
<generator object process_iter at 0x7f56eb912888>
>>> p = psutil.process_iter()
>>> next(p)
psutil.Process(pid=1, name='systemd', status='sleeping', started='01:52:52')