psutil 是一个跨平台的库,能够轻松实现获取系统运行的进程和系统利用例(CPU,磁盘,内存,网络等)信息,主要运用于系统监控,分析系统资源和进程管理。psutil比在shell中使用一连串的命令(ps,top,lsof,df,who,ionice,iostat等)命令来分析系统要简单方便得多。
psutil的安装
源码安装:
# yum install gcc python-devel -y
# wget https://pypi.python.org/packages/source/p/psutil/psutil-3.2.2.tar.gz
# tar zxvf psutil-3.2.2.tar.gz
# cd psutil-3.2.2
# python setup.py install
或者
# yum install gcc python-devel python-pip
# pip install psutil
== 本文使用的是最新版:psutil-5.4.3 ==
psutil的使用
CPU信息
psutil.cpu_times(percpu=False) 在特定模式下,将会返回CPU所花费的时间(单位为秒)。
- user : 执行用户进程花费的时间
- system : 执行内核进程的时间
- idle : CPU处于空闲得时间
-
iowait : 由于IO等待而使得CPU处于空闲状态下的时间
import psutil
psutil.cpu_times()
scputimes(user=2602.17, nice=1.66, system=618.36, idle=427625.83, iowait=88.21, irq=0.0, softirq=3.2, steal=0.0, guest=0.0, guest_nice=0.0)
psutil.cpu_percent(interval=None, percpu=False) 将会以百分比的形式返回当前系统范围的CPU的利用率。
>>> import psutil
>>> psutil.cpu_percent()
0.4
psutil.cpu_times_percent(interval = None,percpu = False )在特定模式下,将会返回CPU所花费的时间百分比。
>>> psutil.cpu_times_percent()
scputimes(user=0.5, nice=0.0, system=0.1, idle=99.3, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)
psutil.cpu_count(logical=True) 将会返回cpu的数量。
>>> psutil.cpu_count()
1
>>> psutil.cpu_count(logical=False)
1
psutil.cpu_stats()将各种CPU统计的信息作为元组返回。
- ctx_switches:自启动以来的上下文切换的次数
- interruptes:自启动以来的中断次数
- soft_interrupts:自启动以来的软中断个数
-
syscalls:自启动以来的系统调用次数(在linux上始终是0)
psutil.cpu_stats()
scpustats(ctx_switches=113630366, interrupts=43135192, soft_interrupts=16865060, syscalls=0)
内存信息
psutil.virtual_memory()将返回内存的信息
- total:总的物理内存
- available:可用内存
- used:使用的内存
- free:空闲内存数
- buffers:缓冲使用数
- cache:缓存使用数
- swap:交换分区使用数
-
shared:可能被多个进程同时访问的内存
import psutil
psutil.virtual_memory()
svmem(total=1928933376, available=1579491328, percent=18.1, used=140374016, free=388231168, active=739442688, inactive=614158336, buffers=197230592, cached=1203097600, shared=17080320)
psutil.swap_memory() 显示系统交换分区内存状态
>>> psutil.swap_memory()
sswap(total=0, used=0, free=0, percent=0.0, sin=0, sout=0)
磁盘信息
psutil.disk_partitions(all=False) 显示磁盘的完整信息
>>> import psutil
>>> psutil.disk_partitions()
[sdiskpart(device='/dev/vda1', mountpoint='/', fstype='ext4', opts='rw,relatime,data=ordered')]
psutil.disk_usage(path) 显示指定路径下该分区的磁盘使用情况。
>>> psutil.disk_usage('/')
sdiskusage(total=42139451392, used=2603651072, free=37371645952, percent=6.5)
psutil.disk_io_counters(perdisk = False,nowrap = True ) 显示磁盘IO状态
- read_count:读取次数
- write_count:写入次数
- read_bytes:读取的字节数
-
write_bytes:写入的字节数
psutil.disk_io_counters()
sdiskio(read_count=14417, write_count=240266, read_bytes=339760128, write_bytes=3756941312, read_time=18711, write_time=1868954, read_merged_count=6, write_merged_count=160429, busy_time=172636)
网络信息
psutil.net_io_counters(pernic=False) 显示系统网络总的IO信息(pernic=True时输出每个网络接口的信息)
- bytes_sent:发送的字节数
- bytes_recv:收到的字节数
- packets_sent:发送的数据包数量
- packets_recv:收到的数据包shul
- errin:接收时的错误数
- errout:发送时的错误数
- dropin:丢弃的传入数据包总数
-
dropout:丢弃的传出数据包总数
>>> import psutil >>> psutil.net_io_counters() snetio(bytes_sent=255022940, bytes_recv=306418164, packets_sent=676193, packets_recv=917168, errin=0, errout=0, dropin=0, dropout=0) >>> psutil.net_io_counters(pernic = True) {'lo': snetio(bytes_sent=20308543, bytes_recv=20308543, packets_sent=327488, packets_recv=327488, errin=0, errout=0, dropin=0, dropout=0), 'eth0': snetio(bytes_sent=234931775, bytes_recv=286168192, packets_sent=349278, packets_recv=590368, errin=0, errout=0, dropin=0, dropout=0)}
psutil.net_if_addrs() 显示网卡信息
psutil.net_if_addrs()
{'lo': [snic(family=2, address='127.0.0.1', netmask='255.0.0.0', broadcast=None, ptp=None), snic(family=17, address='00:00:00:00:00:00', netmask=None, broadcast=None, ptp=None)], 'eth0': [snic(family=2, address='172.16.252.8', netmask='255.255.255.0', broadcast='172.16.252.255', ptp=None), snic(family=17, address='00:16:3e:06:87:05', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]}
其他信息
psutil.boot_time() 显示系统启动的时间(以时间戳的格式)
>>> psutil.boot_time()
1521532676.0
>>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")
'2018-03-20 15:57:56'
psutil.users() 显示当前连接到系统的用户
>>> psutil.users()
[suser(name='root', terminal='pts/0', host='123.151.91.3', started=1521980032.0, pid=1059), suser(name='root', terminal='pts/1', host='123.151.91.3', started=1521977600.0, pid=807), suser(name='root', terminal='pts/2', host='123.151.91.3', started=1521981440.0, pid=1231), suser(name='dianel', terminal='pts/3', host='123.151.91.3', started=1521981568.0, pid=1372)]
进程
psutil.pids() 获取当前所有进程的PID列表
>>> psutil.pids()
[1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 25, 26, 27, 28, 29, 37, 38, 39, 40, 41, 60, 92, 216, 235, 236, 237,...]
psutil.process_iter(attrs=None, ad_value=None) 迭代显示本机所有运行的进程的类实例。
>>> import psutil
>>> for proc in psutil.process_iter():
... try:
... pinfo = proc.as_dict(attrs=['pid', 'name', 'username'])
... except psutil.NoSuchProcess:
... pass
... else:
... print(pinfo)
...
{'username': 'root', 'pid': 1, 'name': 'systemd'}
{'username': 'root', 'pid': 2, 'name': 'kthreadd'}
{'username': 'root', 'pid': 3, 'name': 'ksoftirqd/0'}
{'username': 'root', 'pid': 5, 'name': 'kworker/0:0H'}
{'username': 'root', 'pid': 6, 'name': 'kworker/u2:0'
...
psutil.Process()获取单个进程的信息。
>>> p = psutil.Process(2201) #实例化一个进程PID
>>> p.name() #进程名
'sshd'
>>> p.exe() #进程bin路径
'/usr/sbin/sshd'
>>> p.cwd() #经常工作目录
'/'
>>> p.status() #进程状态
'sleeping'
>>> p.create_time() #进程创建时间
1521532688.63
>>> p.uids() #进程uid
puids(real=0, effective=0, saved=0)
>>> p.gids() #进程gid
pgids(real=0, effective=0, saved=0)
>>> p.cpu_times() #进程CPU时间信息
pcputimes(user=0.0, system=0.03, children_user=1.58, children_system=0.91)
>>> p.cpu_affinity()
[0]
>>> p.memory_percent() #进程内存利用率
0.21213298763513128
>>> p.io_counters() #进程IO信息
pio(read_count=45338, write_count=24689, read_bytes=3084288, write_bytes=200704, read_chars=33964000, write_chars=9986191)
popen类:获取用户启动的应用程序进程信息,方便跟踪程序进程状态
>>> import psutil
>>> from subprocess import PIPE
>>> p = psutil.Popen(["/usr/bin/python", "-c", "print('hello')"], stdout=PIPE)
>>> p.name()
'python'
>>> p.username()
'root'
>>> p.username()
'root'
>>> p.communicate()
('hello\n', None)
>>> p.wait(timeout=2)
0
ending...
详细介绍请点击此处