目录
psutil 简介
psutil 的五个功能函数
CPU 相关:
Memory 内存相关:
Disk 相关:
Network 相关:
进程管理
psutil 简介
psutil 是一个开源切跨平台的库, 其提供了便利的函数用来获取才做系统的信息, 比如 CPU, 内存, 磁盘, 网络等. 此外, psutil 还可以用来进行进程管理, 包括判断进程是否存在, 获取进程列表, 获取进程详细信息等. 而且 psutil 还提供了许多命令行工具提供的功能, 包括: ps,top,lsof,netstat,ifconfig, who,df,kill,free,nice,ionice,iostat,iotop,uptime,pidof,tty,taskset,pmap.
psutil 是一个跨平台的库, 在官方网站上查到其支持如下操作系统.
- Linux
- Windows
- OS X
- FreeBSD
- OpenBSD
- NetBSD
- Sun Solaris
- AIX
- Works with Python versions from 2.6 to 3.X.
psutil 包含了异常, 类, 功能函数和常量, 其中功能函数用来获取系统的信息, 如 CPU, 磁盘, 内存, 网络等. 类用来实现进程的管理功能
psutil 的功能函数 (五个)
根据函数的功能, 主要分为 CPU, 磁盘, 内存, 网络几类, 下面将会总几个方面来介绍 psutil 提供的功能函数.
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 频率 |
示例:
- # 查看 CPU 个数
- >>> import psutil
- >>> psutil.cpu_count()
- 2
- >>> psutil.cpu_count(logical=False)
- 1
- >>>
- # 查看 CPU 利用率
- >>> psutil.cpu_percent()
- 0.2
- >>> psutil.cpu_percent(percpu=True)
- [0.1, 0.2]
- >>>
- # 查看 CPU 时间花费
- >>> psutil.cpu_times()
- scputimes(user=29.09, nice=0.0, system=22.62, idle=24434.77, iowait=1.74, irq=0.0, softirq=0.28, steal=0.27, guest=0.0, guest_nice=0.0)
- >>> psutil.cpu_times(percpu=True)
- [scputimes(user=13.64, nice=0.0, system=12.02, idle=12235.5, iowait=1.0, irq=0.0, softirq=0.16, steal=0.09, guest=0.0, guest_nice=0.0),
- scputimes(user=15.47, nice=0.0, system=10.62, idle=12229.44, iowait=0.74, irq=0.0, softirq=0.12, steal=0.17, guest=0.0, guest_nice=0.0)]
- >>> print(cpu_time)
- scputimes(user=29.24, nice=0.0, system=22.76, idle=24618.94, iowait=1.74, irq=0.0, softirq=0.28, steal=0.27, guest=0.0, guest_nice=0.0)
- >>> cpu_time.user
- 29.24
Memory 内存相关:
virtual_memory()
获取系统内存的使用情况, 以命名元组的形式返回内存使用情况, 包括总内存, 可用内存, 内存利用率, buffer 和 cache 等. 单位为字节.
- >>> import psutil
- >>> psutil.virtual_memory()
- svmem(total=8071716864, available=6532554752, percent=19.1, used=1258717184, free=6526308352, active=1153519616, inactive=194592768, buffers=2129920, cached=284561408, shared=9011200, slab=39006208)
- swap_memory()
获取系统交换内存的统计信息, 以命名元组的形式返回 swap/memory 使用情况, 包含 swap 中页的换入和换出.
- >>> import psutil
- >>> psutil.swap_memory()
- sswap(total=17179865088, used=0, free=17179865088, percent=0.0, sin=0, sout=0)
- >>>
单位转换
- import psutil
- 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
- print(bytes2human(psutil.virtual_memory().total))
Disk 相关:
函数 | 描述 |
---|---|
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 所在磁盘的使用情况,包括磁盘的容量、已经使用的磁盘容量、磁盘的空间利用率等。 |
- # 查看所有已挂在的磁盘
- >>> psutil.disk_partitions()
- [sdiskpart(device='/dev/vda3', mountpoint='/', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota'), sdiskpart(device='/dev/vda6', mountpoint='/data1', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota'), sdiskpart(device='/dev/vda2', mountpoint='/boot', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota')]
- # 使用列表表达式查询指定挂载点信息
- >>> [device for device in psutil.disk_partitions() if device.mountpoint == '/']
- [sdiskpart(device='/dev/vda3', mountpoint='/', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota')]
- # 查看磁盘使用情况
- >>> psutil.disk_usage('/')
- sdiskusage(total=85857402880, used=3858100224, free=81999302656, percent=4.5)
- # 查看磁盘 io 统计汇总
- >>> psutil.disk_io_counters()
- sdiskio(read_count=6828, write_count=3878, read_bytes=273637888, write_bytes=30182912, read_time=6870, write_time=2079, read_merged_count=7, write_merged_count=126, busy_time=4841)
- # 分别列出单个磁盘的统计信息
- >>> psutil.disk_io_counters(perdisk=True)
- {
- 'vda': sdiskio(read_count=6828, write_count=3878, read_bytes=273637888, write_bytes=30182912, read_time=6870, write_time=2079, read_merged_count=7, write_merged_count=126, busy_time=4841), 'vda1': sdiskio(read_count=34, write_count=0, read_bytes=139264, write_bytes=0, read_time=1, write_time=0, read_merged_count=0, write_merged_count=0, busy_time=1), 'vda2': sdiskio(read_count=1934, write_count=2049, read_bytes=22754816, write_bytes=2097152, read_time=570, write_time=801, read_merged_count=0, write_merged_count=0, busy_time=1347), 'vda3': sdiskio(read_count=4009, write_count=1729, read_bytes=187268608, write_bytes=12412416, read_time=5302, write_time=911, read_merged_count=4, write_merged_count=115, busy_time=3114), 'vda4': sdiskio(read_count=6, write_count=0, read_bytes=18432, write_bytes=0, read_time=1, write_time=0, read_merged_count=0, write_merged_count=0, busy_time=1), 'vda5': sdiskio(read_count=48, write_count=0, read_bytes=2248704, write_bytes=0, read_time=13, write_time=0, read_merged_count=0, write_merged_count=0, busy_time=9), 'vda6': sdiskio(read_count=763, write_count=100, read_bytes=60118528, write_bytes=15673344, read_time=948, write_time=367, read_merged_count=3, write_merged_count=11, busy_time=459), 'sr0': sdiskio(read_count=0, write_count=0, read_bytes=0, write_bytes=0, read_time=0, write_time=0, read_merged_count=0, write_merged_count=0, busy_time=0)
- }
Network 相关:
函数 | 详情 |
---|---|
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() | 以时间戳的形式返回系统的启动时间 |
- # 查看网卡信息统计
- >>> psutil.net_io_counters()
- snetio(bytes_sent=9699431, bytes_recv=1895536, packets_sent=8606, packets_recv=27354, 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)], 'eth0': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='172.16.5.12', netmask='255.255.255.0', broadcast='172.16.5.255', ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 10>, address='fe80::9700:20da:ed33:9f50%eth0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_PACKET: 17>, address='52:54:00:3d:ea:06', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]
- }
- >>> a = psutil.net_if_addrs()
- >>> a['eth0']
- [snicaddr(family=<AddressFamily.AF_INET: 2>, address='172.16.5.12', netmask='255.255.255.0', broadcast='172.16.5.255', ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 10>, address='fe80::9700:20da:ed33:9f50%eth0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_PACKET: 17>, address='52:54:00:3d:ea:06', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]
- >>> a['eth0'][0]
- snicaddr(family=<AddressFamily.AF_INET: 2>, address='172.16.5.12', netmask='255.255.255.0', broadcast='172.16.5.255', ptp=None)
- >>> a['eth0'][0][1]
- '172.16.5.12'
- # 查看当前登录用户信息
- >>> psutil.users()
- [suser(name='root', terminal='pts/0', host='172.16.2.66', started=1574151552.0, pid=1437), suser(name='root', terminal='pts/1', host='172.16.2.66', started=1574161536.0, pid=1699)]
- >>>
进程管理
psutil 还提供了作为进程管理的功能函数, 包括获取进程列表, 判断是否存在.
函数 | 详情 |
---|---|
psutil.pids() | 以列表的形式返回当前正在运行的进程 |
psutil.pid_exists(1) | 判断给点定的 pid 是否存在 |
psutil.process_iter() | 迭代当前正在运行的进程,返回的是每个进程的 Process 对象 |
psutil.Process() | 对进程进行封装,可以使用该类的方法获取进行的详细信息,或者给进程发送信号。 |
进程相关信息的方法:
name: 获取进程的名称
cmdline: 获取启动进程的命令行参数
create_time: 获取进程的创建时间 (时间戳格式)
num_fds: 进程打开的文件个数
num_threads: 进程的子进程个数
is_running: 判断进程是否正在运行
send_signal: 给进程发送信号, 类似与 os.kill 等
kill: 发送 SIGKILL 信号结束进程
terminate: 发送 SIGTEAM 信号结束进程
- # 以列表形式查看正在运行的进程
- >>> psutil.pids()
- [1, 2, 3, 5, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 32, 33, 34, 35, 43, 44, 45, 46, 47, 48, 61, 93, 99, 233, 234, 236, 237, 238, 242, 244, 245, 260, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 346, 374, 377, 378, 497, 498, 499, 500, 501, 502, 503, 506, 508, 509, 510, 511, 512, 513, 514, 515, 612, 616, 636, 638, 639, 640, 641, 643, 646, 647, 655, 658, 661, 677, 688, 689, 901, 902, 903, 912, 925, 949, 977, 981, 992, 994, 995, 997, 1001, 1002, 1003, 1004, 1255, 1536, 1840, 1842, 1844, 1861, 1862, 1863, 1864]
- # 查看进程运行状态, 以布尔形式显示
- >>> psutil.pid_exists(1)
- True
- # 迭代当前正在运行进程, 查看列表中前三个实例的信息
- >>> list(psutil.process_iter())[:3]
- [psutil.Process(pid=1, name='systemd', started='16:19:47'), psutil.Process(pid=2, name='kthreadd', started='16:19:47'), psutil.Process(pid=3, name='ksoftirqd/0', started='16:19:47')]
- >>>
- # 通过进程号实例化对象
- >>> process = psutil.Process(1)
- >>> print(process)
- psutil.Process(pid=1, name='systemd', started='16:19:47')
- # 获取进程的名称
- >>> process.name()
- 'systemd'
- >>> process.create_time()
- 1574151587.05
- >>> process.num_fds()
- 47
- >>> process.num_threads()
- 1
- >>>
来源: http://www.bubuko.com/infodetail-3462103.html