[新星计划] Python psutil模块 | 使用Python实现运维监控


系列文章
https://blog.csdn.net/cpen_web/category_11089219.html


● 介绍

● 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、磁盘、内存、网络、进程


● 安装

● 源码安装: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

● 获取系统基本信息

○ 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]

○ 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中页的换入和换出

# 示例: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)

○ 3、DISK

● 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)

○ 4、NETWORK

● 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)]}

○ 5、PROCESS

● 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')

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mycpen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值