侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

系统性能模块psutil

zze
zze
2020-07-30 / 0 评论 / 0 点赞 / 374 阅读 / 16072 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

简介

psutil 是一个开源且跨平台的库,其提供了便利的函数用来获取才做系统的信息,比如 CPU,内存,磁盘,网络等。此外,psutil 还可以用来进行进程管理,包括判断进程是否存在、获取进程列表、获取进程详细信息等。而且 psutil 还提供了许多命令行工具提供的功能,包括:pstoplsofnetstatifconfigwhodfkillfreeniceioniceiostatiotopuptimepidofttytasksetpmap

安装:pip3 install psutil

功能函数

下面的示例操作都是在导入模块(import psutil)之后执行的。

CPU 相关

1、查看 CPU 个数:

'''
cpu_count(,[logical]):默认返回逻辑 CPU 的个数,当设置 logical 的参数为 False 时,返回物理 CPU 的个数。
'''
# 查看逻辑 CPU 个数
>>> psutil.cpu_count()
12
# 查看物理 CPU 个数
>>> psutil.cpu_count(logical=False)
6

2、查看 CPU 使用率:

'''
cpu_percent(,[percpu],[interval]):返回 CPU 的利用率,percpu 为 True 时显示所有物理核心的利用率,interval 不为 0 时,则阻塞显示 interval 执行的时间内的平均利用率。
'''
# 查看当前瞬时 CPU 总使用率
>>> psutil.cpu_percent()
4.4
# 查看每颗物理 CPU 的瞬时使用率
>>> psutil.cpu_percent(percpu=True)
[17.1, 0.3, 13.2, 0.2, 9.0, 0.2, 6.0, 0.2, 4.6, 0.2, 2.6, 0.2]
# 查看 3 秒内的总平均使用率
>>> psutil.cpu_percent(interval=3)
3.6

3、查看 CPU 的时间花费:

'''
cpu_times(,[percpu]):以命名元组(namedtuple)的形式返回 cpu 的时间花费,percpu=True 表示获取每个 CPU 的时间花费
'''
# 查看所有 CPU 的总时间花费
>>> psutil.cpu_times()
scputimes(user=21039.0, nice=0.0, system=10302.77, idle=759292.91)
# 查看每颗 CPU 的时间花费
>>> psutil.cpu_times(percpu=True)
[scputimes(user=5772.68, nice=0.0, system=3612.56, idle=56526.15), scputimes(user=108.78, nice=0.0, system=113.75, idle=65679.34), scputimes(user=4985.45, nice=0.0, system=2168.07, idle=58750.86), scputimes(user=107.0, nice=0.0, system=99.41, idle=65695.19), scputimes(user=3556.62, nice=0.0, system=1540.39, idle=60806.82), scputimes(user=106.34, nice=0.0, system=90.61, idle=65704.36), scputimes(user=2569.0, nice=0.0, system=1085.16, idle=62249.11), scputimes(user=106.03, nice=0.0, system=82.99, idle=65711.99), scputimes(user=2064.16, nice=0.0, system=818.36, idle=63020.2), scputimes(user=104.25, nice=0.0, system=75.81, idle=65720.67), scputimes(user=1461.01, nice=0.0, system=550.05, idle=63891.12), scputimes(user=103.14, nice=0.0, system=69.36, idle=65727.93)]

4、查看 CPU 的耗时比例:

'''
cpu_times_percent(,[percpu]):功能和 cpu_times 大致相同,看字面意思就能知道,该函数返回的是耗时比例。
'''
# 查看所有 CPU 的总耗时比例
>>> psutil.cpu_times_percent()
scputimes(user=2.8, nice=0.0, system=1.9, idle=95.4)
# 查看每个 CPU 的耗时比例
>>> psutil.cpu_times_percent(percpu=True)
[scputimes(user=10.3, nice=0.0, system=7.2, idle=82.5), scputimes(user=0.1, nice=0.0, system=0.2, idle=99.7), scputimes(user=8.1, nice=0.0, system=5.6, idle=86.3), scputimes(user=0.1, nice=0.0, system=0.1, idle=99.8), scputimes(user=5.6, nice=0.0, system=3.7, idle=90.8), scputimes(user=0.1, nice=0.0, system=0.1, idle=99.8), scputimes(user=3.8, nice=0.0, system=2.3, idle=93.8), scputimes(user=0.1, nice=0.0, system=0.1, idle=99.8), scputimes(user=2.8, nice=0.0, system=1.7, idle=95.6), scputimes(user=0.1, nice=0.0, system=0.1, idle=99.8), scputimes(user=1.6, nice=0.0, system=0.9, idle=97.5), scputimes(user=0.1, nice=0.0, system=0.1, idle=99.8)]

5、查看 CPU 的上下文切换、中断、系统调用的统计信息:

'''
cpu_stats():以命名元组的形式返回 CPU 的统计信息,包括上下文切换,中断,软中断和系统调用次数。
'''
>>> psutil.cpu_stats()
scpustats(ctx_switches=401323, interrupts=804731, soft_interrupts=89110664, syscalls=1218334)

6、查看 CPU 频率:

>>> psutil.cpu_freq()
scpufreq(current=2600, min=2600, max=2600)

Memory 相关

1、查看内存使用状态:

'''
virtual_memory():以命名元组的形式返回内存使用情况,包括总内存,可用内存,内存利用率,buffer 和 cache 等。单位为字节。
'''
>>> psutil.virtual_memory()
svmem(total=17179869184, available=6575521792, percent=61.7, used=9278017536, free=691372032, active=5878431744, inactive=4949700608, wired=3399585792)

2、以命名元组的形式返回 swap 内存使用情况,包含 swap 中页的换入和换出情况。

>>> psutil.swap_memory()
sswap(total=1073741824, used=487325696, free=586416128, percent=45.4, sin=16433455104, sout=24289280)

补充一个内存单位换算函数:

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

Disk 相关

1、查看磁盘 I/O 统计信息:

'''
disk_io_counters([perdisk]):以命名元组的形式返回磁盘 IO 统计信息(汇总的),包括读、写的次数,读、写的字节数等。
当 perdisk 的值为 True,则分别列出单个磁盘的统计信息(字典:key 为磁盘名称,value 为统计的 namedtuple)。
'''
# 查看当前总 IO 状态
>>> psutil.disk_io_counters()
sdiskio(read_count=2418517, write_count=1276243, read_bytes=53897687552, write_bytes=14554780672, read_time=4113113, write_time=766676)
# 查看每个磁盘的 IO 状态
>>> psutil.disk_io_counters(perdisk=True)
{'disk0': sdiskio(read_count=2053904, write_count=1275515, read_bytes=26361860096, write_bytes=14529286144, read_time=533819, write_time=740558), 'disk2': sdiskio(read_count=364697, write_count=3165, read_bytes=27538506240, write_bytes=40702976, read_time=3579320, write_time=26778)}

2、查看磁盘分区信息:

'''
disk_partitions([all=False]):以命名元组的形式返回所有已挂载的磁盘,包含磁盘名称,挂载点,文件系统类型等信息。
当 all 等于 True 时,返回包含 /proc 等特殊文件系统的挂载信息。
'''
# 查看普通分区的文件系统信息
>>> psutil.disk_partitions()
[sdiskpart(device='/dev/sda3', 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(all=True)
[sdiskpart(device='rootfs', mountpoint='/', fstype='rootfs', opts='rw'), sdiskpart(device='sysfs', mountpoint='/sys', fstype='sysfs', opts='rw,nosuid,nodev,noexec,relatime'), sdiskpart(device='proc', mountpoint='/proc', fstype='proc', opts='rw,nosuid,nodev,noexec,relatime'), sdiskpart(device='devtmpfs', mountpoint='/dev', fstype='devtmpfs', opts='rw,nosuid,size=487140k,nr_inodes=121785,mode=755'), sdiskpart(device='securityfs', mountpoint='/sys/kernel/security', fstype='securityfs', opts='rw,nosuid,nodev,noexec,relatime'), sdiskpart(device='tmpfs', mountpoint='/dev/shm', fstype='tmpfs', opts='rw,nosuid,nodev'), sdiskpart(device='devpts', mountpoint='/dev/pts', 
... 
opts='rw,nosuid,nodev,relatime,size=99572k,mode=700')]

3、查看指定挂载点对应分区的磁盘容量使用状态:

'''
disk_usage(path):以命名元组的形式返回path所在磁盘的使用情况,包括磁盘的容量、已经使用的磁盘容量、磁盘的空间利用率等。
'''
# 查看根分区的磁盘容量状态
>>> psutil.disk_usage('/')
sdiskusage(total=20414726144, used=2030575616, free=18384150528, percent=9.9)

Network 相关

1、查看网卡网络 I/O 统计信息:

'''
psutil.net_io_counter([pernic]):以命名元组的形式返回当前系统中每块网卡的网络 IO 统计信息,包括收发字节数,收发包的数量、出错的情况和删包情况。
当 pernic 为 True 时,则列出所有网卡的统计信息。
'''
# 查看所有网卡总的网络 IO 统计信息
>>> psutil.net_io_counters()
snetio(bytes_sent=878118, bytes  _recv=24884715, packets_sent=4904, packets_recv=20549, errin=0, errout=0, dropin=0, dropout=0)
# 查看每块网卡的网络 IO 统计信息
>>> psutil.net_io_counters(pernic=True)
{'eth0': snetio(bytes_sent=688953, bytes_recv=389810, packets_sent=1998, packets_recv=3565, errin=0, errout=0, dropin=0, dropout=0), 'eth1': snetio(bytes_sent=1016, bytes_recv=17738, packets_sent=14, packets_recv=130, errin=0, errout=0, dropin=0, dropout=0), 'eth2': snetio(bytes_sent=188633, bytes_recv=24477655, packets_sent=2894, packets_recv=16858, errin=0, errout=0, dropin=0, dropout=0), 'lo': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0)}

2、查看网络连接信息:

'''
psutil.net_connections([kind]):以列表的形式返回每个网络连接的详细信息(namedtuple)。命名元组包含 fd, family, type, laddr, raddr, status, pid等 信息。kind 表示过滤的连接类型,支持的值如下:(默认为 inet)
    +------------+----------------------------------------------------+
    | Kind Value | Connections using                                  |
    +------------+----------------------------------------------------+
    | inet       | IPv4 and IPv6                                      |
    | inet4      | IPv4                                               |
    | inet6      | IPv6                                               |
    | tcp        | TCP                                                |
    | tcp4       | TCP over IPv4                                      |
    | tcp6       | TCP over IPv6                                      |
    | udp        | UDP                                                |
    | udp4       | UDP over IPv4                                      |
    | udp6       | UDP over IPv6                                      |
    | unix       | UNIX socket (both UDP and TCP protocols)           |
    | all        | the sum of all the possible families and protocols |
    +------------+----------------------------------------------------+
'''
>>> psutil.net_connections('tcp')
[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=1275), 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=1176), sconn(fd=4, family=<AddressFamily.AF_INET6: 10>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='::', port=22), raddr=(), status='LISTEN', pid=1176), sconn(fd=3, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='10.0.1.200', port=22), raddr=addr(ip='10.0.1.1', port=62739), status='ESTABLISHED', pid=2733), sconn(fd=11, family=<AddressFamily.AF_INET6: 10>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='::', port=111), raddr=(), status='LISTEN', pid=557), sconn(fd=8, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='0.0.0.0', port=111), raddr=(), status='LISTEN', pid=557), sconn(fd=14, family=<AddressFamily.AF_INET6: 10>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='::1', port=25), raddr=(), status='LISTEN', pid=1275)]

3、查看网卡配置信息:

'''
psutil.net_if_addrs():以字典的形式返回网卡的配置信息,包括 IP 地址和 mac 地址、子网掩码和广播地址。
'''
>>> 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)], 'eth0': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='10.0.1.200', netmask='255.255.255.0', broadcast='10.0.1.255', ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 10>, address='fe80::20c:29ff:fef1:23cf%eth0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_PACKET: 17>, address='00:0c:29:f1:23:cf', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)], 'eth1': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='172.16.1.200', netmask='255.255.255.0', broadcast='172.16.1.255', ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 10>, address='fe80::20c:29ff:fef1:23d9%eth1', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_PACKET: 17>, address='00:0c:29:f1:23:d9', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)], 'eth2': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='10.4.7.100', netmask='255.255.255.0', broadcast='10.4.7.255', ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 10>, address='fe80::20c:29ff:fef1:23e3%eth2', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_PACKET: 17>, address='00:0c:29:f1:23:e3', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]}

4、查看网卡的状态信息:

'''
psutil.net_if_stats():	返回网卡的详细信息,包括是否启动、通信类型、传输速度与 mtu。
'''
>>> psutil.net_if_stats()
{'eth0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1000, mtu=1500), 'eth1': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1000, mtu=1500), 'eth2': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1000, mtu=1500), 'lo': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=65536)}

Process 相关

1、查看正在运行的进程的 PID 列表:

>>> psutil.pids()
[1, 2, 4, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 30, 31, 32, 33, 41, 43, 44, 45, 47, 60, 95, 233, 234, 235, 236, 242, 243, 246, 248, 249, 251, 255, 256, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 367, 392, 429, 431, 433, 434, 435, 436, 438, 439, 440, 442, 443, 444, 518, 522, 523, 545, 551, 554, 557, 560, 573, 576, 686, 719, 1176, 1178, 1180, 1275, 1279, 2123, 2618, 2733, 2735, 2755, 2801, 2815, 2829, 2830, 2883, 2884]

2、判断是否存在给定 PID 对应的正在运行的进程:

>>> psutil.pid_exists(2884)
True

3、迭代当前正在运行的进程:

'''
psutil.process_iter():迭代当前正在运行的进程,返回的是每个进程的 Process 对象。
'''
>>> process_iter = psutil.process_iter()
>>> next(process_iter)
psutil.Process(pid=1, name='systemd', status='sleeping', started='15:20:48')
>>> next(process_iter)
psutil.Process(pid=2, name='kthreadd', status='sleeping', started='15:20:48')
>>> next(process_iter)
psutil.Process(pid=4, name='kworker/0:0H', status='sleeping', started='15:20:48')
>>> next(process_iter)
psutil.Process(pid=6, name='ksoftirqd/0', status='sleeping', started='15:20:48')

4、获取指定进程信息:

'''
psutil.Process():对进程进行封装,可以使用该类的方法获取进行的详细信息,或者给进程发送信号。
'''
# 传入 PID 获取指定进程对象
>>> psutil.Process(1)
psutil.Process(pid=1, name='systemd', status='sleeping', started='15:20:48')

补充进程对象相关属性或方法:

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

其它

1、查看当前的用户连接信息:

'''
psutil.users():以命名元组的方式返回当前登陆用户的信息,包括用户名,登陆时间,终端,与主机信息。
'''
>>> psutil.users()
[suser(name='root', terminal='pts/0', host='10.0.1.1', started=1596110592.0, pid=2735)]

2、查看系统启动时间:

'''
psutil.boot_time():以时间戳的形式返回系统的启动时间。
'''
>>> psutil.boot_time()
1596093648.0

补充一个时间戳转日期函数:

def stamp_to_time(timeStamp):
    import time
    timeArray = time.localtime(timeStamp)
    return time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
0

评论区