性能监控脚本能够帮助开发人员或者运维人员了解当前系统的健康程度,同时也是衡量业务的服务质量的依据。
下面我们通过编写监控性能的脚本,并判断各项数据指标是否符合预设阈值。本文最开始是使用shell脚本来写的,后面会运用python第三方系统性能信息模块psutil去监控系统。

shell实现性能监控脚本

下面编写脚本主要监控的信息有:

1、内核信息
2、主机名称
3、IP地址
4、登录账户
5、内存与swap信息
6、磁盘信息
7、CPU负载

使用如下命令能够获取系统运行的进程和系统利用率,例如:free、uptime、ip a s、ps、vmstat、sar、uname、lscpu、df等等。

下面用monitor.sh编写监控服务器主要性能参数指标。

#!/bin/bash
#功能描述:监控服务器主要性能参数指标.


kernel=$(uname -r)                                         #内核信息
release=$(cat /etc/redhat-release)                         #操作系统版本
hostname=$HOSTNAME                                         #主机名称
localip=$(ip a s | awk '/inet /{print $2}')                #本地IP地址列表
mem_total=$(free | awk '/Mem/{print $2}')                  #总内存容量
mem_free=$(free | awk '/Mem/{print $NF}')                  #剩余内存容量
swap_total=$(free | awk '/Swap/{print $2}')                #总swap容量
swap_free=$(free | awk '/Swap/{print $NF}')                #剩余swap容量
disk=$(df | awk '/^\/dev/{print $1,$2,$4}'|column -t)      #磁盘信息
load1=$(uptime | sed 's/,//g' | awk '{print $(NF-2)}')     #CPU最近1分钟平均负载
load5=$(uptime | sed 's/,//g' | awk '{print $(NF-1)}')     #CPU最近5分钟平均负载
load15=$(uptime | sed 's/,//g' | awk '{print $NF}')        #CPU最近15分钟平均负载
login_users=$(who | wc -l)                                 #登陆用户数量
procs=$(ps aux | wc -l)                                    #进程数量
users=$(sed -n '$=' /etc/passwd)                           #系统总账户数量
cpu_info=$(LANG=C lscpu | awk -F: '/Model name/ {print $2}')         #CPU型号
cpu_core=$(awk '/processor/{core++} END{print core}' /proc/cpuinfo)  #CPU内核数量

yum -y -q install sysstat &>/dev/null                                #安装性能监控软件
echo -e "\033[34m提取磁盘性能指标,请稍后...\033[0m"
tps=$(LANG=C sar -d -p 1 6 | awk '/Average/' | tail -n +2 | awk '{print "["$2"]磁盘平均IO数量:"$3}') &
read_write=$(LANG=C sar -d -p 1 6 | awk '/Average/' | tail -n +2 | awk '{print "["$2"]平均每秒读写扇区量:"$4,$5}') &

irq=$(vmstat 1 2 | tail -n +4 | awk '{print $11}')         #中断数量
cs=$(vmstat 1 2 | tail -n +4 | awk '{print $12}')          #上下文切换数量

top_proc_mem=$(ps --no-headers -eo comm,rss | sort -k2 -n | tail -10) #占用内存资源最多的10个进程列表
top_proc_cpu=$(ps --no-headers -eo comm,pcpu | sort -k2 -n | tail -5) #占用CPU资源最多的5个进程列表

#获取网卡流量,接收|发送的数据流量,单位为字节bytes).
net_monitor=$(cat /proc/net/dev | tail -n +3 | \
              awk 'BEGIN{ print "网卡名称 入站数据流量(bytes) 出站数据流量(bytes)" } \
                   { print $1,$2,$10 }' | column -t)

#输出数据信息.
echo -e "\033[32m--------------本机主要数据参数表-----------------\033[0m"
echo -e "本机IP地址列表:\033[32m$localip\033[0m"
echo -e "本机主机名称:\033[32m$hostname\033[0m"
echo -e "操作系统版本:\033[32m$release\033[0m,内核版本:\033[32m$kernel\033[0m"
echo -e "CPU型号为:\033[32m$cpu_info\033[0m,CPU内核数量:\033[32m$cpu_core\033[0m"
echo -e "本机总内存容量:\033[32m$mem_total\033[0m,剩余可用内存容量:\033[32m$mem_free\033[0m"
echo -e "本机swap总容量:\033[32m$swap_total\033[0m,剩余容量:\033[32m$swap_free\033[0m"
echo -e "CPU最近1分钟,5分钟,15分钟的平均负载分别为:\033[32m$load1 $load5 $load15\033[0m"
echo -e "本机总账户数量为:\033[32m$users\033[0m,当前登陆系统的账户数量:\033[32m$login_users\033[0m"
echo -e "当前系统中启动的进程数量:\033[32m$procs\033[0m"
echo -e "占用CPU资源最多的5个进程列表为:"
echo -e "\033[32m$top_proc_cpu\033[0m"
echo -e "占用内存资源最多的10个进程列表为:"
echo -e "\033[32m$top_proc_mem\033[0m"
echo -e "CPU中断数量:\033[32m$irq\033[0m,CPU上下文切换数量:\033[32m$cs\033[0m"
echo -e "每个磁盘分区的总容量与剩余容量信息如下:"
echo -e "$disk"
echo -e "$tps"
echo -e "$read_write"
echo -e "$net_monitor"
echo -e "\033[32m------------------The End------------------------\033[0m"

编译运行:

监控ddr带宽的脚本 性能监控脚本_sed


监控ddr带宽的脚本 性能监控脚本_监控ddr带宽的脚本_02


使用shell来实现系统信息,是不是有点复杂。相比而言,使用 python第三方系统性能信息模块则更加简单明了。

Python系统性能信息模块(psutil)

采用系统的基本性能信息包括:CPU、内存、磁盘、网络等,可以完整描述当前系统的运行状态及质量。psutil模块已经封装了这些方法,用户可以根据自身的应用场景,调用相应的方法来满足需求,非常简单实用。

查看cpu信息

我们使用Python的psutil.cpu_times()方法可以非常简单地得到这些信息:

import psutil
psutil.cpu_times()

以下都是在python3.6版本上操作的。

监控ddr带宽的脚本 性能监控脚本_python_03

参数介绍:

user:用户进程使用的CPU时间累计
nice:优先级为负值的进程使用时间
system:内核进程使用时间累计
idle:CPU空闲时间累计
iowait:等待IO花费的时间
irq:硬中断时间累计
softirq:软中断时间累计
steal:花费在虚拟机中的时间

查看用户的cpu时间比

下面我通过psutil.cpu_times().user来获取单项数据信息,如用户user的CPU时间比

import psutil
psutil.cpu_times().user

监控ddr带宽的脚本 性能监控脚本_监控ddr带宽的脚本_04

还有查看cpu逻辑个数和.查看cpu物理个数,可以使用:

psutil.cpu_count() #查看CPU逻辑个数
psutil.cpu_count(logical=False) #查看CPU物理个数

查看内存信息

Linux系统的内存利用率涉及total(内存总数)、used(以使用的内存数)、free(空闲内存数)、buffers(缓冲使用数)、cache(缓存使用数)、swap(交换分区使用数)等,分别使用

psutil.virtual_memory()与psutil.swap_memory()方法获取这些信息。操作如下:

import psutil
psutil.virtual_memory()
psutil.swap_memory()

监控ddr带宽的脚本 性能监控脚本_监控ddr带宽的脚本_05

下面写个python脚本,查看内存信息,剩余内存.free 总共.total

import psutil

free = str(round(psutil.virtual_memory().free / (1024.0 * 1024.0 * 1024.0), 2))
total = str(round(psutil.virtual_memory().total / (1024.0 * 1024.0 * 1024.0), 2))
memory = int(psutil.virtual_memory().total - psutil.virtual_memory().free) / float(psutil.virtual_memory().total)
print (u"物理内存: %s G" % total)
print (u"剩余物理内存: %s G" % free)
print (u"物理内存使用率: %s %%" % int(memory * 100))

编译运行:

监控ddr带宽的脚本 性能监控脚本_python脚本_06

获取磁盘信息

在系统的所有磁盘信息中,我更加关注磁盘的利用率及IO信息,其中磁盘IO信息包括

read_count(读IO数),
write_count(写IO数)
read_bytes(IO写字节数),
read_time(磁盘读时间),
write_time(磁盘写时间)

这些IO信息可以使用psutil.disk_partitions()方法获取磁盘完整信息,使用psutil.disk_usage(’/’)方法获取分区参数。

import psutil
psutil.disk_partitions()
psutil.disk_usage('/')

监控ddr带宽的脚本 性能监控脚本_python脚本_07

查看网络信息

系统的网络信息与磁盘IO类似,涉及几个关键点,包括bytes_set(发送字节数)、bytes_recv(接收字节数)、packets_set(发送数据包数)、packets_recv(接收数据包数)

import psutil
psutil.net_io_counters()  
psutil.net_io_counters(pernic=True)

监控ddr带宽的脚本 性能监控脚本_python_08

下面写个python脚本,获取网卡,网卡属性,连接数,当前流量等信息,如下:

#!/usr/local/bin/python3
import psutil

net = psutil.net_io_counters()
bytes_sent = '{0:.2f} Mb'.format(net.bytes_recv / 1024 / 1024)
bytes_rcvd = '{0:.2f} Mb'.format(net.bytes_sent / 1024 / 1024)
print (u"网卡接收流量 %s 网卡发送流量 %s" % (bytes_rcvd, bytes_sent))

编译运行:

监控ddr带宽的脚本 性能监控脚本_监控ddr带宽的脚本_09

查看登录与开机时间

psutil模块还支持获取用户登录、开机时间等信息,具体见下面操作:

import psutil
psutil.users() #返回当前登录系统的用户信息
psutil.boot_time() #获取开机时间

监控ddr带宽的脚本 性能监控脚本_监控ddr带宽的脚本_10

下面写个python脚本,获取系统用户信息:

#!/usr/local/bin/python3
import psutil

users_count = len(psutil.users())
users_list = ",".join([u.name for u in psutil.users()])
print (u"当前有%s个用户,分别是 %s" % (users_count, users_list))

编译运行:

监控ddr带宽的脚本 性能监控脚本_sed_11

获取进程信息

psutil模块在获取进程信息方面也提供了很好的支持,包括使用psutil.pids()方法获取有进程PID,使用psutil.Process()方法获取单个进程的名称、路径、状态、系统资源利用率等等信息。

下面写个python脚本,查看系统全部进程:

#!/usr/local/bin/python3
import psutil

for pnum in psutil.pids():
    p = psutil.Process(pnum)
    print (u"进程名 %-20s  内存利用率 %-18s 进程状态 %-10s 创建时间 %-10s " \
          % (p.name(), p.memory_percent(), p.status(), p.create_time()))

编译运行:

监控ddr带宽的脚本 性能监控脚本_python_12

信息太多,只截取了一部分信息显示。

总结

本篇主要主要应用于系统监控,最开始是选用shell脚本编写监控性能,但是相比而言,我们选用Python第三方基础模块psutil库实现则更加简单明了。psutil模块封装了很多功能,包括:CPU、内存、磁盘、网络等,可以完整描述当前系统的运行状态及质量。

这里要吧啦几句!有时间建议大家学学Python。为什么这么说呢?shell一直用。但是真不如python好用,因为python几乎可以做shell所有的事情,而且更方便,更好。python诞生之初就是为了简化运维工作量用的。最后发展成通用语言。而shell更小巧,更适合做批处理。这是linux设计之初就定下来的原则。