【Python】-编写Linux服务器监控脚本

前言

  上周末学习给服务器做简单的压力测试,需要在压测过程中获取服务器的CPU占用率内存占用率、系统负载Load Average,以及后端服务进程的CPU占用率、内存占用率,将获取到的数据放入Excel表格绘制折线图以便分析。为了满足这个需求我就自己用Pyhton写了几个Linux服务器监控脚本。用的是psutilxlswriter这两个模块,下面介绍一下这两个模块的具体用法。

一、使用psutil获取系统负载数据

  这里我用了psutil这个第三方模块来获取CPU占用率和内存占用率等数据。psutil官方文档:https://psutil.readthedocs.io/en/latest/

1、安装psutil

pip install psutil

2、获取系统cpu占用率、内存占用率和Load Average

a)cpu

获取cpu的核心数

>>> import psutil
>>> psutil.cpu_count() # CPU逻辑核心数
16
>>> psutil.cpu_count(logical=False) # CPU物理核心数
8

获取cpu占用率

# 返回系统当前CPU占用率
# interval参数表示间隔几秒再返回CPU占用率
# percpu参数为false则返回CPU整体占用率,为true则返回CPU各个逻辑核心的占用率
>>> psutil.cpu_percent(interval=1,percpu=False)
2.5
>>> psutil.cpu_percent(interval=1,percpu=True)
[7.5, 1.5, 3.1, 0.0, 9.2, 1.5, 16.9, 0.0, 3.1, 0.0, 1.5, 0.0, 0.0, 0.0, 1.5, 3.1]

注意第一次调用cpu_percent()函数和参数interval为0或None时,它会返回一个毫无意义的0.0。
建议不断调用该函数时,参数interval至少设置为0.1。

b)内存

获取物理内存占用

>>> psutil.virtual_memory()
svmem(total=16968458240, available=8791121920, percent=48.2, used=8177336320, free=8791121920)
# total:系统总物理内存大小,单位是Byte
# available:系统当前可以立即提供给进程而无需系统进入交换的内存大小,单位是Byte
# percent:系统当前物理内存占用率
# used:系统当前已使用的物理内存大小,单位是Byte
# free:系统当前完全没有使用的内存大小,单位是Byte
c)Load Average

在Linux系统下,此函数依托于系统os.getloadavg()函数

>>> psutil.getloadavg()
(0.38, 0.34, 0.52)
# 返回过去 1、5 和 15 分钟的平均系统负载
# 当这个数值大于系统CPU的逻辑核心数时,则表示系统超载了

而在Windows系统下,这是通过使用 Windows API 来模拟的,该 API 会生成一个线程,该线程保持在后台运行并每 5 秒更新一次结果,模仿 UNIX 行为。因此,在 Windows 上,第一次调用它并在接下来的 5 秒内返回一个无意义的元组。

# 在Windows下第一次调用该函数
>>> psutil.getloadavg()
(0.0, 0.0, 0.0)
# 隔几分钟再次调用该函数
>>> psutil.getloadavg()
(0.0, 0.01, 0.0)
>>> psutil.getloadavg()
(0.0, 0.01, 0.01)

3、获取进程及其子进程的cpu、内存占用率

a)获取当前正在运行的所有进程pid
>>> psutil.pids()
[0, 4, 120, 172, 348, ···, 26548, 26560]
b)获取指定进程对象
# 返回pid为xxx的进程对象
>>> p=psutil.Process(4)

当你使用Process()这个函数时,一定要准备好捕捉 NoSuchProcess和AccessDenied异常。
NoSuchProcess:当在当前进程列表中找不到具有给定pid的进程或进程不再存在时引发的异常。
有时候你获取到某个进程之后,该进程就被kill掉了,而你又去使用你之前获取到的进程对象,代码就会报错。
AccessDenied:当执行操作的权限被拒绝时由类方法引发。

c)获取指定进程的子进程
# 参数recursive默认为False,若recursive为True则会返回所有子进程(即会包括子进程的子进程)
>>> p.children(recursive=False)
[psutil.Process(pid=172, name='Registry', status='running', started='11:13:28'), psutil.Process(pid=568, name='smss.exe', status='running', started='11:13:31'), psutil.Process(pid=3652, name='MemCompression', status='running', started='11:13:43')]

这里借用官方文档一个例子解释一下参数recursive
在这里插入图片描述

d)获取指定进程的cpu占用率
>>> p.cpu_percent(interval=1)
1.5

# 注意进程的cpu_percent()函数没有percpu这个参数,加了会报错
>>> p.cpu_percent(interval=1,percpu=True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cpu_percent() got an unexpected keyword argument 'percpu'
>>> p.cpu_percent(interval=1,percpu=False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cpu_percent() got an unexpected keyword argument 'percpu'
e)获取指定进程的内存占用率
>>> p.memory_info()
pmem(rss=2330624, vms=204800, num_page_faults=3104, peak_wset=2772992, wset=2330624, peak_paged_pool=0, paged_pool=0, peak_nonpaged_pool=272, nonpaged_pool=272, pagefile=204800, peak_pagefile=266240, private=204800)
# 函数memory_info()会返回一大堆东西,在这里我就解释一个,其余的有需要可以去官方文档自行查询
# rss:该进程所占用的物理内存大小,单位是Byte

二、使用xlsxwriter生成Excel表格并绘制折线图

xlsxwriter官方文档:https://xlsxwriter.readthedocs.io/#

1、生成Excel表格

import xlsxwriter   # 导入xlsxwriter模块
workbook = xlsxwriter.Workbook('excel.xlsx')     # 新建excel表,命名为"excel.xlsx"
worksheet = workbook.add_worksheet('sheet1')     # 新建sheet,命名为"sheet1"
headings = ['时间(单位:s)','cpu核心1占用率(单位:%)','cpu核心2占用率(单位:%)','cpu总使用率(单位:%)']# 设置表头
data = [
    [1,2,3,4,5,6],
    [10,40,30,20,10,50],
    [30,60,70,50,40,30],
    [40,100,100,70,50,80]
]    #数据                                                          
worksheet.write_row('A1',headings)      # 把表头填入到以A1格开始的行里
worksheet.write_column('A2',data[0])    # 把数据填入到以A2格开始的列里
worksheet.write_column('B2',data[1])
worksheet.write_column('C2',data[2])
worksheet.write_column('D2',data[2])
                  
workbook.close()          # 最后一定要将excel文件保存关闭,如果没有这一行运行代码会报错

效果
在这里插入图片描述

2、绘制折线图

import xlsxwriter   #导入xlsxwriter模块
workbook = xlsxwriter.Workbook('excel.xlsx')     #新建excel表,命名为"excel.xlsx"
worksheet = workbook.add_worksheet('sheet1')     #新建sheet,命名为"sheet1"
headings = ['时间(单位:s)','cpu核心1占用率(单位:%)','cpu核心2占用率(单位:%)','cpu总使用率(单位:%)']#设置表头
data = [
    [1,2,3,4,5,6],
    [10,40,30,20,10,50],
    [30,60,70,50,40,30],
    [40,100,100,70,50,80]
]    #数据                                                          
worksheet.write_row('A1',headings)      # 把表头填入到以A1格开始的行里
worksheet.write_column('A2',data[0])    # 把数据填入到以A2格开始的列里
worksheet.write_column('B2',data[1])
worksheet.write_column('C2',data[2])
worksheet.write_column('D2',data[2])  
--------------------------------以上为生成Excel表格代码-----------------------------
chart_col = workbook.add_chart({'type':'line'})        # 新建图表,type为line,即折线图
# 给折线图增加一条折线
chart_col.add_series(
     {
        'name':'=sheet1!$D$1',                  # 该折线的名称
         'categories':'=sheet1!$A$2:$A$7',      # 数据点的x坐标
         'values':   '=sheet1!$D$2:$D$7',       # 数据点的y坐标
         'line': {'color': 'red'},              # 折线的样式
     }
)
chart_col.set_title({'name':'cpu总负载'})          # 图表的名称
chart_col.set_x_axis({'name':'时间(单位:s)'})          # x轴名称
chart_col.set_y_axis({'name':'占用率(单位:%)'})          # y轴名称
chart_col.set_style(1)        # 图表的样式
worksheet.insert_chart('E10',chart_col,{'x_offset':25,'y_offset':10})   # 放置图表位置
# 第一个参数'E10'代表原点位置,第二个参数是所要放置的图表,第三个参数是图表的左上角相对于原点的偏移位置
            
workbook.close()          # 最后一定要将excel文件保存关闭,如果没有这一行运行代码会报错

效果
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值