psutil
简介:psutil
是一个跨平台(http://code.google.com/p/psutil),能够轻松实现获取系统运行的进程和系统利用率包括(保存CPU、内存、磁盘、网络等)信息。它实现了同等命令行工具提供的功能,如ps
、top
、 lsof
、 netstat
、 ifconfig
、 who
、 df
、 kill
、 free
、nice
、 ionice
、 iostat
、iotop
、uptime
、 pidof
、 tty
、 taskset
、 pmap
安装
yum install -y python-pip
功能函数
- CPU相关
- Memory内存相关
- Disk相关
- Network相关
- 进程管理
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频率 |
示例
import psutil
# 查看cpu个数
psutil.cpu_count() # 2
psutil.cpu_count(logical=True) # 2
psutil.cpu_count(logical=False) # 2
# 查看cpu利用率
psutil.cpu_percent() # 0.8
psutil.cpu_percent(percpu=True) # [0.8, 0.7]
# 查看cpu时间花费
psutil.cpu_times() # scputimes(user=96.72, nice=0.09, system=97.48, idle=45351.82, iowait=8.11, irq=0.0, softirq=5.15, steal=0.0, guest=0.0, guest_nice=0.0)
psutil.cpu_times(percpu=True)
# [scputimes(user=45.88, nice=0.07, system=50.23, idle=22705.37, iowait=0.48, irq=0.0, softirq=1.89, steal=0.0, guest=0.0, guest_nice=0.0),scputimes(user=50.93, nice=0.01, system=47.35, idle=22670.42, iowait=7.62, irq=0.0, softirq=3.26, steal=0.0, guest=0.0, guest_nice=0.0)]
cpu_time = psutil.cpu_times()
cpu_time.user # 97.99 根据cpu_time获取响应的值
Memory
virtual_memory():以命名元组的形式返回内存使用情况,包括总内存,可用内存,内存利用率,buffer和cache等。单位为字节。
psutil.virtual_memory() # svmem(total=4125122560L, available=3663482880L, percent=11.2, used=1014362112L, free=3110760448L, active=458932224, inactive=325615616, buffers=2125824L, cached=550596608)
swap_memory():以命名元组的形式返回swap/memory使用情况,包含swap中页的换入和换出。
psutil.swap_memory() # sswap(total=1073737728L, used=0L, free=1073737728L, 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/sda3', mountpoint='/', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota'),sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota')]
# 使用列表表达式查询指定挂载点信息
[device for device in psutil.disk_partitions() if device.mountpoint == '/']
# [sdiskpart(device='/dev/sda3', mountpoint='/', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota')]
# 查看磁盘使用情况
psutil.disk_usage('/') #sdiskusage(total=20179845120, used=2114883584, free=18064961536, percent=10.5)
# 查看磁盘io统计汇总
psutil.disk_io_counters() #sdiskio(read_count=5964, write_count=35722, read_bytes=249860608, write_bytes=629057536, read_time=3929, write_time=108205)
# 分别列出单个磁盘的统计信息
psutil.disk_io_counters(perdisk=True)
# 输出结果
{'sda1': sdiskio(read_count=508, write_count=519, read_bytes=5687808, write_bytes=2117632, read_time=88, write_time=69),
'sda2': sdiskio(read_count=52, write_count=0, read_bytes=2265088, write_bytes=0, read_time=19, write_time=0),
'sda3': sdiskio(read_count=5404, write_count=35240, read_bytes=241907712, write_bytes=627201024, read_time=3822, write_time=108206),
'sr0': sdiskio(read_count=0, write_count=0, read_bytes=0, write_bytes=0, read_time=0, write_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=2436593, bytes_recv=86547298, packets_sent=29381, packets_recv=66642, errin=0, errout=0, dropin=0, dropout=0)
# 查看网卡配置信息
psutil.net_if_addrs()
a = psutil.net_if_addrs()
a['eth0']
# 查看当前登录用户信息
psutil.users() # [suser(name='root', terminal='tty1', host='', started=1591149568.0),
suser(name='root', terminal='pts/0', host='192.168.8.1', started=1591149568.0),
suser(name='root', terminal='pts/1', host='192.168.8.1', started=1591149824.0)]
进程管理
函数 | 详情 |
---|---|
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,...
# 查看进程运行状态,以布尔形式显示
psutil.pid_exists(1) # True
# 迭代当前正在运行进程,查看列表中前三个实例的信息
list(psutil.process_iter())[:3] # [<psutil.Process(pid=1, name='systemd') at 139918970276112>,<psutil.Process(pid=2, name='kthreadd') at 139918970317904>,<psutil.Process(pid=3, name='ksoftirqd/0') at 139918970214416>]
# 通过进程号实例化对象
process = psutil.Process(1) # <psutil.Process(pid=1, name='systemd') at 139918970212944>
# 获取进程的名称
process.name() # 'systemd'
process.create_time() # 1591149592.13
process.num_fds() # 41
process.num_threads() # 1