0


PYTHON 实现 UNIX/LINUX 性能监视可视化

PYTHON 实现 UNIX/LINUX 性能监视可视化

作者:高玉涵
时间:2022.10.01 热烈庆祝祖国成立 73 周年!
博客:blog.csdn.net/cg_i

我要证明文章有价,再过三、五十年,没有人会记得那些黄金股票,世界大事都祇是过眼烟云,可是一个好的剧本,五十年、一百年,依然有人欣赏,就算我死了,我的名字我的戏,没有人会忘记,这就叫做文章有价。————唐涤生《南河十三郎》

我为什么要做这个

毫无疑问,但凡我工作的场合有这方面的工具,这篇文章就不会出现在你的面前。原因就是:近期在生产环境部署了一套新平台(LINUX),为了能及时了解系统运行情况,同时也为了与旧平台(HPUNIX)做性能对比,我自然想到利用系统自带的记账工具以产生报告,我可以根据这些信息,分析系统的性能问题。

当我通过一系统的命令检查系统资源的使用情况以确定系统是否正常运行。寻找性能瓶颈以便理解影响系统性能的因素并对系统性能进行优化。为了能持续监视系统性能变化,我通过

crontab

工具定时执行

uptime

vmstat

并将记录保存到文件中。但当我打开文件单从众多指标项和海量数据里找出彼此关联,几乎就占用了我全部精力,更别说从中分析出系统当前运行的情况了。当时就想:要能有一个自动化分析记录文件,并能以图型化直观展现各项指标状态的工具,那一定能对提升我的工作效率。说干就干!于是就有了此篇文章和下面的程序。

一、背景知识

1.1 性能及其对用户的影响

在给出程序源代码之前对 UNIX/LINUX 系统性及自带监视工具要有个基本了解。下面情况会使系统管理员认识到系统性能问题的重要性,如系统处理一个作业或一批作业比通常花更长的时间,或是系统对命令的响应时间超过了用户可忍受的时间范围。总之系统性能的低下会丧失用户对它们的期望。

当用户作业的呑吐率下降时,其金钱和时间便会造成浪费,对系统进行合理的升级会减少用户花费的时间。

有时系统管理员只有在听到用户抱怨后才去检查那些影响系统性能的变量。这种做法并不正确。系统管理员在用户抱怨之前就应该对系统内部的活动有一个详细了解。必须清楚系统中每种用户的特点。白天用户提交什么作业,系统在晚上处理什么作业,这些作业对 CPU、I/O 以及内存的要求如何以及网络作业和时间敏感的作业对系统的要求等。

上述对系统活动和用户需求的分析可以帮助系统管理员对系统性能有一个深刻的理解。包括系统的性能为什么会突然的下降或者是逐渐降低。相反若系统管理员既不了解系统中用户的特点又不清楚内部的负载情况,那么他将很难找到系统性能下降的原因。

最后说一点,尽管所有用户在创建时是平等的,但一个用户执行的作业不可避免会影响其他用户的作业。尽管系统管理员希望公平对待每一个用户,但不同用户看到的系统性能是有差异的。

1.2 UNIX/LINUX 性能简介

UNIX/LINUX 系统运行时,将维护一组计数器以跟踪一些关键的系统资源的使用情况,包括:

  • CPU 使用情况
  • 缓冲区使用情况
  • 磁盘 I/O 活动
  • 磁带 I/O 活动
  • 终端活动
  • 系统调用活动
  • 上下文切换活动
  • 文件访问情况
  • 队列活动
  • 进程间通讯
  • 换页活动
  • 空闲内存和交换区
  • 内核空间分配
  • 内核表
  • 远程文件共享

通过对上述资源使用情况的分析,可获得系统中三个子系统的工作情况,这三个子系统为:

  • CPU CPU 处理指令和程序。用户向系统提交作业主要由 CPU 完成。通常 CPU 的处理能力被多个用户程序和操作系统内部程序共享。
  • 内存 每个运行的程序都需要一定数量的物理内存。与 CPU 一样,内存也是有限的资源。当某程序需要的内存数量大于系统可提供的数量时,系统会采用换页策略,即把一个进程的一部份移动磁盘上而为另一个进程腾出空间。如果这样做内存仍不够的话,那么系统将采用交换策略,即把一个进程全部移到磁盘上而为另一个进程腾出空间。
  • I/O I/O 子系统负责系统数据的输入和输出。其中包括磁盘、打印机终端/键盘以及其他慢速设备和网络 I/O 设备。当一个程序中包含大量 I/O 操作时,它常常会为等待 I/O 操作结束而处于等待状态。每种 I/O 设备都具有其自己的带宽限制和自己独特的问题。

性能监视和调整并不是一项很容易的工作。不同子系统的负载是不同的。不同的用户对系统资源也有着不同的要求。有些用户作业需大量的 I/O 资源,有的则需大量 CPU 资源,还有的需要大量的网络资源。性能的调整往往是一系列地折衷。例如增加内核空间的大小会影响内存的利用率,为满足一部分用户的需要而运行 NFS 会影响其他用户的性能等。因此性能调整的目标就是进行最优的折衷以满足大部分用户和系统资源的要求。

1.3 使用 uptime 命令监视系统状态

使用 uptime 命令是监视 UNIX/LINUX 系统性能的简单方法。该命令显示在一定时间间隔内系统运行队列中进程的信息。通过这些信息可以大致地分析系统的工作负载。所以当系统性能下降时,首先应使用 uptime 命令来观察系统运行队列中进程的情况。在运行队列中的进程是需求系统资源的活动进程(非睡眠、非等待)。下面是 uptime 命令的例子:

uptime11:12:01 up  4:12,  0 users,  load average: 0.04, 0.05, 0.05

其中有用的信息是三个负载的平均值。0.04,0.05 和 0.05 分别是前 1 分钟、5 分钟和 15 分钟内的负载平均值。

提示:观察负载平均值的变化趋势十分重要,上例中系统负载平均值几乎是恒定的。若系统出现问题,那么其负载平均值将会持续地下降。系统管理员在采取一事实上措施(对系统和用户会有影响)之前必须再观察一段时间,也许可以使用

ps

命令寻找错误时,系统会自动地恢复到正常状态。

注意:uptime 命令也有一定的局限性,例如它并不区分高优先级和低优化级的作业,尽管前者对系统的影响更大。

系统管理员应定期地运行 uptime 命令以观察系统的平均负载值及其变化趋势。大型 UNIX/LINUX 系统中,负载数为 2 和 3 表示轻载,5 和 6 为中等程序负载,10 以上为过载。其实不同系统上划分轻载和过载的标准并不相同,系统管理员可以定时地采样系统的平均负载值,并根据实际情况确定自己系统中划分轻载和过载的界线。

1.3 使用 vmstat 监视内存性能

vmstat 命令用来检查虚存的统计信息,并可显示有关进程状态、空闲和交换空间、调页、磁盘空间、CPU 负载和交换,Cache 刷新以及中断等方面信息。

下面是在 ubuntu 下运行 vmstat 的输出。

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 100156336427596251076008411782019810

其中各域的含义为:

  • r 表示运行队列
  • b 被阻塞、等待资源
  • memory 报告实际和虚拟内存数量
  • swap 可用的交换空间
  • si 每秒从磁盘读入虚拟内存的大小
  • so 每秒虚拟内存写入磁盘的大小
  • bi 块设备每秒接收的块数量
  • bo 块设备每秒发送的块数量
  • in 每秒CPU的中断次数
  • cs 每秒上下文切换次数
  • us 用户 CPU 时间
  • sy 系统CPU时间
  • id 空闲 CPU 时间

提示:经常地产生和保存一些 vmstat 报告对确定系统的性能很有帮助。一次二次报告只能反映系统一些暂时的性能,不能反映永久性的问题。因此,系统管理员在诊断系统性能问题时要进行多次的采样。

二、PYTHON 实现性能监视可视化

有了上面背景知识下面给出实现代码。

2.1 源代码

'''
    作者:高玉涵
    时间:2022-10-1 12:07
    热烈庆祝祖国成立 73 周年! 祝大家国庆节快乐!
'''import click
import os
import re
import numpy as np
import random
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import matplotlib.colors as mcolors

UPTIME_FILE ='uptime'
VMSTAT_FILE ='vmstat''''
    功能:检查文件
    时间:2022-10-1
'''defcheckFiles(date):
    file_lst =[UPTIME_FILE, VMSTAT_FILE]
    names =[]for f in file_lst:
        name =f"{f}_{date}.txt"if os.path.exists(name):
            names.append(name)else:print(f"{name} 缺失")returnNonereturn names

'''
    功能:装载 uptime 数据
'''defload_uptime(name, data_dict, encoding):print(f"开始装载 {name} ...")withopen(name, encoding=encoding)as uptime:for i, line inenumerate(uptime.readlines()):compile= re.compile('\s+\d+:\d+:\d+\s+\w+\s+(\d+:\d+),\s+\d+\s+\w+,\s+\w+\s+\w+:\s+(\d+\.\d+),\s+(\d+\.\d+),\s+(\d+\.\d+)')match= re.match(compile, line)ifmatch:
                data_dict.setdefault(match.group(1),{'load':[]})# 原因:系统繁忙的时候 uptime 生成的文件里会有重复"时间"的记录行,这在文件里并不会产生问题,# 但字典以"时间"为键时,键的唯一性,会造成将多行的记录添加到一起,# 清空,虽然会丢失掉前面的记录(有相同时间行),但这里并不会存在问题.
                data_dict[match.group(1)]['load'].clear()

                data_dict[match.group(1)]['load'].append(match.group(2))
                data_dict[match.group(1)]['load'].append(match.group(3))
                data_dict[match.group(1)]['load'].append(match.group(4))print('\r'+f"读取 {i} 行成功。", end='', flush=True)print()'''
    功能:装载 vmstat 数据
'''defload_vmstat(name, data_dict, encoding):print(f"开始装载 {name} ...")# 子项标题
    titles =[]# 子项标题行开关
    title_line =False# 数据行开关
    data_line =False# 对字典的键进行递增排序.# 切记:顺序很重要,字典主键是 uptime 运行时的时间值, vmstat 输出行与其对应,两者结合就能获得某个时间点系统的性能信息
    date_keys =sorted(data_dict.keys())withopen(name, encoding=encoding)as vmstat:for i, line inenumerate(vmstat):if title_line !=Trueand data_line !=True:
                separator = re.compile('(\w+)\s+-+(\w+)-+\s+-+(\w+)-+\s+-+(\w+)-+\s+-+(\w+)-+\s+-+(\w+)-+')match= re.match(separator, line)ifmatch:
                    title_line =True# 下一行,必定是子项标题continue# 返回到循环开始部分if title_line:iflen(titles)==0:
                    titles = line.split()ifnot titles:print("提取系统性能标题行失败,请检查文件格式是否符合要求.")return
                data_line =True# 下一行,必定是数据行
                title_line =Falsecontinue# 返回到循环开始部分# 提取系统性能指标数据if data_line:
                record = line.split()iflen(titles)!=len(record):print(f"子项为 {len(titles)} 列,值为 {len(record)} 列,两者长度不匹配,请检查文件格式是否符合要求.")returnif date_keys:for j, title inenumerate(titles):
                        data_dict[date_keys[0]].setdefault('vmstat',{})
                        data_dict[date_keys[0]]['vmstat'].setdefault(title, record[j])print('\r'+f"读取第 {i +1} 行,{j +1} 列数据,成功.", end='', flush=True)del date_keys[0]else:# 超出 uptime 行数数据忽略# 造成这种情况的原因:# 当系统繁忙的时候 uptime 生成的文件里会有重复"时间"记录行,这在文件里并不会产生问题,# 但采用字典且以"时间"为键时,键的唯一性会造成部分记录丢失.这也就产生了和 vmstat 行数不匹配,# 会丢失未尾几行数据,忽略掉即可.print()print(f"忽略第 {i+1} 行数据.")# 初始化,为下一轮提取数据做准备
            title_line =False
            data_line =False'''
    功能:绘制有 3 个 Y 坐标的折线图
    时间:2022-10-02
'''defgraph_lines(title:str, xlabel:str, ylabel:str, x:list, y1:list, y5:list, y15:list):
    plt.rcParams['font.sans-serif']=['SimHei']
    plt.rcParams['axes.unicode_minus']=False
    plt.title(title)
    plt.xlabel(f"{xlabel}")
    plt.ylabel(f"{ylabel}")
    plt.box(False)
    plt.grid()# 负载平均折线
    v1,= plt.plot(x, y1, color='mediumseagreen', label='1 分钟')
    v5,= plt.plot(x, y5, color='royalblue', label='5 分钟')
    v15,= plt.plot(x, y15, color='indigo', label='15 分种')
    plt.legend(handles=[v1, v5, v15], labels=['1 分钟','5 分钟','15 分种'], loc='best')
    plt.show()'''
    功能:绘制平均负载图
    时间:2022-10-02
'''defloadGraph(data_dict:dict, title:str):
    x_times =[t for t in data_dict.keys()]
    load_line =[ l for l in[ data_dict[t]['load']for t in x_times ]]# 1 分钟    
    v1 =[]# 5 分钟
    v5 =[]# 15 分种
    v15 =[]# 获取各时间段平均负载值for i inrange(0,len(load_line)):
        v1.append(load_line[i][0])
        v5.append(load_line[i][1])
        v15.append(load_line[i][2])
    graph_lines("平均负载",f"时间:{title}","uptime 指标值", x_times, v1, v5, v15)'''
    功能:分区域绘 vmstat 折线图
    时间:2022-10-03
'''defvmstat_regional_graph(data_dict:dict, text:str):
    x_times =[t for t in data_dict.keys()]
    vmstat_keys = data_dict[x_times[0]]['vmstat'].keys()

    values_dict ={}for d in x_times:for i, k inenumerate(vmstat_keys):'''
                注意:这是一组解析 ubuntu 下执行 vmstat 格式的硬编码,
                之所以采用这种方式,是因先前创建 data_dict 结构时,没有考虑到
                分区域保存数据,实践发现将关联数据,分组绘制图型,能直观反映系统性能.
                为不影响本已正常运行的代码,只能采用这种权宜之计. 
            '''if i <=1:
                values_dict.setdefault('procs',{})
                values_dict['procs'].setdefault(k,[])
                values_dict['procs'][k].append(data_dict[d]['vmstat'][k])elif i >=2and i <=7:
                values_dict.setdefault('memory',{})
                values_dict['memory'].setdefault(k,[])
                values_dict['memory'][k].append(data_dict[d]['vmstat'][k])elif i >=8and i <=9:
                values_dict.setdefault('swap',{})
                values_dict['swap'].setdefault(k,[])
                values_dict['swap'][k].append(data_dict[d]['vmstat'][k])elif i ==10:
                values_dict.setdefault('io',{})
                values_dict['io'].setdefault(k,[])
                values_dict['io'][k].append(data_dict[d]['vmstat'][k])elif i ==11:
                values_dict.setdefault('system',{})
                values_dict['system'].setdefault(k,[])
                values_dict['system'][k].append(data_dict[d]['vmstat'][k])elif i >=12and i <=16:
                values_dict.setdefault('cpu',{})
                values_dict['cpu'].setdefault(k,[])
                values_dict['cpu'][k].append(data_dict[d]['vmstat'][k])for k in values_dict.keys():
        regional_graph(values_dict[k], x_times,f"{k} 监视数据",f"日期: {text}","vmstat 指标值")'''
    说明:vmstat 分组绘图
    时间:2022-10-03
'''defregional_graph(regional_data_dict:dict, xables:list, title:str, xlabel:str, ylabel:str):
    tick_spacing =1.8
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.yaxis.set_major_locator(ticker.MultipleLocator(tick_spacing ))
    plt.rcParams['font.sans-serif']=['SimHei']
    plt.rcParams['axes.unicode_minus']=False
    plt.title(title)
    plt.xlabel(f"{xlabel}")
    plt.ylabel(f"{ylabel}")
    plt.box(False)
    plt.grid()# mcolors.TABLEAU_COLORS可以得到一个字典,可以选择TABLEAU_COLORS,CSS4_COLORS等颜色组
    colors=list(mcolors.TABLEAU_COLORS.keys())#颜色变化

    rets =[]for k in regional_data_dict.keys():
        ret,= plt.plot(xables, regional_data_dict[k], color=mcolors.TABLEAU_COLORS[colors[random.randint(0,9)]], label=k)
        rets.append(ret)    

    plt.legend(handles=rets, labels=regional_data_dict.keys(), loc='best')
    plt.show()@click.command()@click.option('--date','-d',type=str, required=True, prompt="输入文件名时间部分的字符串",help="例:文件名为 uptime_2022-09-30.txt, 输入: 2022-09-30")@click.option('--from-encoding','-f','encoding',type=str, required=True, default='utf-8',help="文件内字符采用的编码 utf-8 或 gbk,默认:utf-8")@click.option('--operating-system','-o','os',type=str, required=True, default='LINUX',help="采集时的操作系统 HPUNIX 或 LINUX,默认:LINUX")defMaliCrawler(date, encoding, os):
    names = checkFiles(date)ifnot names:print(f"缺少必要文件,请检查后重试!")return# 开始装载文件并解析数据
    data_dict ={}for n in names:if n.find(UPTIME_FILE)!=-1:
            load_uptime(n, data_dict, encoding)if n.find(VMSTAT_FILE)!=-1:
            load_vmstat(n, data_dict, encoding)# 绘制 uptime
    loadGraph(data_dict, date)# 绘制 vmstat
    vmstat_regional_graph(data_dict, date)if __name__ =='__main__':
    MaliCrawler()

2.2 运行后效果

 python .\SystemAccountGraph.py -d 2022-09-30

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 记录文件样式

  • uptime
10:50:01 up  3:51,  1 user,  load average: 0.00, 0.00, 0.0010:51:01 up  3:52,  1 user,  load average: 0.24, 0.06, 0.0210:52:01 up  3:53,  0 users,  load average: 0.33, 0.12, 0.0410:53:02 up  3:54,  0 users,  load average: 0.28, 0.14, 0.0510:54:01 up  3:54,  0 users,  load average: 0.34, 0.19, 0.0810:55:01 up  3:55,  0 users,  load average: 0.24, 0.19, 0.0810:56:01 up  3:57,  0 users,  load average: 0.27, 0.21, 0.1010:57:01 up  3:58,  0 users,  load average: 0.10, 0.17, 0.0910:58:01 up  3:59,  0 users,  load average: 0.10, 0.15, 0.0910:59:01 up  4:00,  0 users,  load average: 0.08, 0.14, 0.0911:00:01 up  4:01,  0 users,  load average: 0.03, 0.11, 0.0811:01:01 up  4:02,  0 users,  load average: 0.01, 0.09, 0.0811:02:02 up  4:03,  0 users,  load average: 0.00, 0.07, 0.0711:03:01 up  4:03,  0 users,  load average: 0.04, 0.07, 0.0711:04:01 up  4:04,  0 users,  load average: 0.01, 0.05, 0.0611:05:01 up  4:05,  0 users,  load average: 0.00, 0.04, 0.0611:06:01 up  4:06,  0 users,  load average: 0.11, 0.06, 0.0611:07:01 up  4:07,  0 users,  load average: 0.09, 0.06, 0.0611:08:01 up  4:08,  0 users,  load average: 0.03, 0.05, 0.0611:09:01 up  4:09,  0 users,  load average: 0.01, 0.04, 0.0511:10:01 up  4:10,  0 users,  load average: 0.00, 0.03, 0.0511:11:01 up  4:11,  0 users,  load average: 0.11, 0.06, 0.0611:12:01 up  4:12,  0 users,  load average: 0.04, 0.05, 0.0511:13:01 up  4:13,  0 users,  load average: 0.01, 0.04, 0.0511:14:01 up  4:14,  0 users,  load average: 0.10, 0.06, 0.0511:15:01 up  4:15,  0 users,  load average: 0.04, 0.05, 0.0511:16:01 up  4:16,  0 users,  load average: 0.04, 0.05, 0.0511:17:01 up  4:18,  0 users,  load average: 0.01, 0.04, 0.0411:18:01 up  4:19,  0 users,  load average: 0.05, 0.04, 0.0411:19:01 up  4:20,  0 users,  load average: 0.02, 0.03, 0.0311:20:01 up  4:21,  0 users,  load average: 0.07, 0.04, 0.0311:21:01 up  4:22,  0 users,  load average: 0.02, 0.03, 0.0311:22:01 up  4:23,  0 users,  load average: 0.01, 0.02, 0.0211:23:01 up  4:24,  0 users,  load average: 0.00, 0.02, 0.0211:24:01 up  4:25,  0 users,  load average: 0.00, 0.01, 0.0111:25:01 up  4:26,  0 users,  load average: 0.00, 0.01, 0.0111:26:01 up  4:27,  0 users,  load average: 0.00, 0.00, 0.0011:27:01 up  4:28,  0 users,  load average: 0.00, 0.00, 0.0011:28:01 up  4:29,  0 users,  load average: 0.00, 0.00, 0.00
  • vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 100156336427596251076008411782019810
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 00011423443038067120800817141102019810
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 01043924430580137692000841183136019710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 00811771230188169912000865225170019710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 00810874430352170824400889265203029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 118117056305081699084008113307236029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 008115408286281704456008133338261029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 018112632286881704608008133337260029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 018125372287761693236008133336259029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 01264131252288241687184009132336259029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 015201195242887616976800010131336258029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 015201228922919216949840011131336257029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 015201143522923217034720012130335256029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 215201209402929216948720012130335256029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 005201122122932417056840013129335255029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 005201134602936417041880014129335254029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 015201172802940017007320015128335254029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 015201127082944017054440016128335253029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 015201135122949217044240017127335252029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 015201260922953216908960018127335252029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 105201153042985617016360019126335251029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 005201268922989216906120020126335250029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 005201116362992817049160020125334250029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 005201229002996816947000021125334249029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 005201178443000816991560021124334248029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 005201222443004816939560022124334248029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 005201132563008017036520023124334247029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 015201165403011217000760024123333247029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 015201159603016017010040024123333246029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 005201187203020016984080025122333245029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 105201134443023617017720026122333245029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 005201122163026817048440026121332244029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 005201118523030417048440026121331243029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 005201120523035217048440025120330243029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 005201116963039217048480025120329242029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 005201119603042817048480025119329242029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 005201117363046817048480025119328241029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 005201117283050417048520025119327240029710
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 015201119363055217048440025118326240029710

结束语

上面的程序代码只需简单修改,就能运用到你的日常工作中去,如果它能给你带来帮助,那么我将备感荣幸。程序中存在冗余代码和硬编码,细心的你可能还发现缺少必要的异常处理。这些在我的应用里都不是问题,但如果是使用的你可能要特别小心了。

标签: unix linux python

本文转载自: https://blog.csdn.net/cg_i/article/details/127157939
版权归原作者 半点闲 所有, 如有侵权,请联系我们删除。

“PYTHON 实现 UNIX/LINUX 性能监视可视化”的评论:

还没有评论