代码编织梦想

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

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

我为什么要做这个

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

 当我通过一系统的命令检查系统资源的使用情况以确定系统是否正常运行。寻找性能瓶颈以便理解影响系统性能的因素并对系统性能进行优化。为了能持续监视系统性能变化,我通过 crontab 工具定时执行 uptimevmstat 并将记录保存到文件中。但当我打开文件单从众多指标项和海量数据里找出彼此关联,几乎就占用了我全部精力,更别说从中分析出系统当前运行的情况了。当时就想:要能有一个自动化分析记录文件,并能以图型化直观展现各项指标状态的工具,那一定能对提升我的工作效率。说干就干!于是就有了此篇文章和下面的程序。

一、背景知识

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 命令的例子:

uptime
11: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
 1  0      0 1563364  27596 251076    0    0     8     4  117   82  0  1 98  1  0

 其中各域的含义为:

  • 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
'''
def checkFiles(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} 缺失")
            return None
    return names

'''
    功能:装载 uptime 数据
'''
def load_uptime(name, data_dict, encoding):
    print(f"开始装载 {name} ...")
    with open(name, encoding=encoding) as uptime:
        for i, line in enumerate(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)
            if match:
                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 数据
'''
def load_vmstat(name, data_dict, encoding):
    print(f"开始装载 {name} ...")

    # 子项标题
    titles = []
    # 子项标题行开关
    title_line = False
    # 数据行开关
    data_line = False
    # 对字典的键进行递增排序.
    # 切记:顺序很重要,字典主键是 uptime 运行时的时间值, vmstat 输出行与其对应,两者结合就能获得某个时间点系统的性能信息
    date_keys = sorted(data_dict.keys())

    with open(name, encoding=encoding) as vmstat:    
        for i, line in enumerate(vmstat):
            if title_line != True and data_line != True:
                separator = re.compile('(\w+)\s+-+(\w+)-+\s+-+(\w+)-+\s+-+(\w+)-+\s+-+(\w+)-+\s+-+(\w+)-+')
                match = re.match(separator, line)
                if match:
                    title_line = True   # 下一行,必定是子项标题
                    continue            # 返回到循环开始部分

            if title_line:
                if len(titles) == 0:
                    titles = line.split() 
                    if not titles:
                        print("提取系统性能标题行失败,请检查文件格式是否符合要求.")
                        return
                data_line = True    # 下一行,必定是数据行
                title_line = False
                continue            # 返回到循环开始部分

            # 提取系统性能指标数据
            if data_line:
                record = line.split()
                if len(titles) != len(record):
                    print(f"子项为 {len(titles)} 列,值为 {len(record)} 列,两者长度不匹配,请检查文件格式是否符合要求.")
                    return

                if date_keys:
                    for j, title in enumerate(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
'''
def graph_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
'''
def loadGraph(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 in range(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
'''
def vmstat_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 in enumerate(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 >=2 and i <=7 :
                values_dict.setdefault('memory', {})
                values_dict['memory'].setdefault(k, [])
                values_dict['memory'][k].append(data_dict[d]['vmstat'][k])
            elif i >= 8 and 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 >= 12 and 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
'''
def regional_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")

def MaliCrawler(date, encoding, os):
    names = checkFiles(date)
    if not 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.00
 10:51:01 up  3:52,  1 user,  load average: 0.24, 0.06, 0.02
 10:52:01 up  3:53,  0 users,  load average: 0.33, 0.12, 0.04
 10:53:02 up  3:54,  0 users,  load average: 0.28, 0.14, 0.05
 10:54:01 up  3:54,  0 users,  load average: 0.34, 0.19, 0.08
 10:55:01 up  3:55,  0 users,  load average: 0.24, 0.19, 0.08
 10:56:01 up  3:57,  0 users,  load average: 0.27, 0.21, 0.10
 10:57:01 up  3:58,  0 users,  load average: 0.10, 0.17, 0.09
 10:58:01 up  3:59,  0 users,  load average: 0.10, 0.15, 0.09
 10:59:01 up  4:00,  0 users,  load average: 0.08, 0.14, 0.09
 11:00:01 up  4:01,  0 users,  load average: 0.03, 0.11, 0.08
 11:01:01 up  4:02,  0 users,  load average: 0.01, 0.09, 0.08
 11:02:02 up  4:03,  0 users,  load average: 0.00, 0.07, 0.07
 11:03:01 up  4:03,  0 users,  load average: 0.04, 0.07, 0.07
 11:04:01 up  4:04,  0 users,  load average: 0.01, 0.05, 0.06
 11:05:01 up  4:05,  0 users,  load average: 0.00, 0.04, 0.06
 11:06:01 up  4:06,  0 users,  load average: 0.11, 0.06, 0.06
 11:07:01 up  4:07,  0 users,  load average: 0.09, 0.06, 0.06
 11:08:01 up  4:08,  0 users,  load average: 0.03, 0.05, 0.06
 11:09:01 up  4:09,  0 users,  load average: 0.01, 0.04, 0.05
 11:10:01 up  4:10,  0 users,  load average: 0.00, 0.03, 0.05
 11:11:01 up  4:11,  0 users,  load average: 0.11, 0.06, 0.06
 11:12:01 up  4:12,  0 users,  load average: 0.04, 0.05, 0.05
 11:13:01 up  4:13,  0 users,  load average: 0.01, 0.04, 0.05
 11:14:01 up  4:14,  0 users,  load average: 0.10, 0.06, 0.05
 11:15:01 up  4:15,  0 users,  load average: 0.04, 0.05, 0.05
 11:16:01 up  4:16,  0 users,  load average: 0.04, 0.05, 0.05
 11:17:01 up  4:18,  0 users,  load average: 0.01, 0.04, 0.04
 11:18:01 up  4:19,  0 users,  load average: 0.05, 0.04, 0.04
 11:19:01 up  4:20,  0 users,  load average: 0.02, 0.03, 0.03
 11:20:01 up  4:21,  0 users,  load average: 0.07, 0.04, 0.03
 11:21:01 up  4:22,  0 users,  load average: 0.02, 0.03, 0.03
 11:22:01 up  4:23,  0 users,  load average: 0.01, 0.02, 0.02
 11:23:01 up  4:24,  0 users,  load average: 0.00, 0.02, 0.02
 11:24:01 up  4:25,  0 users,  load average: 0.00, 0.01, 0.01
 11:25:01 up  4:26,  0 users,  load average: 0.00, 0.01, 0.01
 11:26:01 up  4:27,  0 users,  load average: 0.00, 0.00, 0.00
 11:27:01 up  4:28,  0 users,  load average: 0.00, 0.00, 0.00
 11: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
 1  0      0 1563364  27596 251076    0    0     8     4  117   82  0  1 98  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 1142344  30380 671208    0    0     8    17  141  102  0  1 98  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  1      0 439244  30580 1376920    0    0     8    41  183  136  0  1 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0      8 117712  30188 1699120    0    0     8    65  225  170  0  1 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0      8 108744  30352 1708244    0    0     8    89  265  203  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 1  1      8 117056  30508 1699084    0    0     8   113  307  236  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0      8 115408  28628 1704456    0    0     8   133  338  261  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  1      8 112632  28688 1704608    0    0     8   133  337  260  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  1      8 125372  28776 1693236    0    0     8   133  336  259  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  1    264 131252  28824 1687184    0    0     9   132  336  259  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  1    520 119524  28876 1697680    0    0    10   131  336  258  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  1    520 122892  29192 1694984    0    0    11   131  336  257  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  1    520 114352  29232 1703472    0    0    12   130  335  256  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 2  1    520 120940  29292 1694872    0    0    12   130  335  256  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0    520 112212  29324 1705684    0    0    13   129  335  255  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0    520 113460  29364 1704188    0    0    14   129  335  254  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  1    520 117280  29400 1700732    0    0    15   128  335  254  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  1    520 112708  29440 1705444    0    0    16   128  335  253  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  1    520 113512  29492 1704424    0    0    17   127  335  252  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  1    520 126092  29532 1690896    0    0    18   127  335  252  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 1  0    520 115304  29856 1701636    0    0    19   126  335  251  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0    520 126892  29892 1690612    0    0    20   126  335  250  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0    520 111636  29928 1704916    0    0    20   125  334  250  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0    520 122900  29968 1694700    0    0    21   125  334  249  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0    520 117844  30008 1699156    0    0    21   124  334  248  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0    520 122244  30048 1693956    0    0    22   124  334  248  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0    520 113256  30080 1703652    0    0    23   124  334  247  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  1    520 116540  30112 1700076    0    0    24   123  333  247  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  1    520 115960  30160 1701004    0    0    24   123  333  246  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0    520 118720  30200 1698408    0    0    25   122  333  245  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 1  0    520 113444  30236 1701772    0    0    26   122  333  245  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0    520 112216  30268 1704844    0    0    26   121  332  244  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0    520 111852  30304 1704844    0    0    26   121  331  243  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0    520 112052  30352 1704844    0    0    25   120  330  243  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0    520 111696  30392 1704848    0    0    25   120  329  242  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0    520 111960  30428 1704848    0    0    25   119  329  242  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0    520 111736  30468 1704848    0    0    25   119  328  241  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  0    520 111728  30504 1704852    0    0    25   119  327  240  0  2 97  1  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st
 0  1    520 111936  30552 1704844    0    0    25   118  326  240  0  2 97  1  0

结束语

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cg_i/article/details/127157939

python 重复造轮子/造轮子找模子,你都应该熟读该文_高兴就好(石的博客-爱代码爱编程

Chardet,字符编码探测器,可以自动检测文本、网页、xml的编码。 colorama,主要用来给文本添加各种颜色,并且非常简单易用。 Prettytable,主要用于在终端或浏览器端构建格式化的输出。 difflib,[Python]标准库,计算文本差异 Levenshtein,快速计算字符串相似度。 fuzzywuzzy,字符串

python 运维 linux基本命令(一)_ya_taylor的博客-爱代码爱编程

1. Linux 运维工程师的职责 2. 开发、测试、运维工程师的开发流程 开发需要将项目代码实现–>提交给测试工程师进行测试–>测试完成后,提交给运维工程师进行上线,发布、运行、维护,给用户提供服务(

linux程序性能数据采集方案-爱代码爱编程

1 背景 因公司需要对开发的软件进行性能测试,需采集并记录测试过程中程序及系统的性能数据,包括cpu使用率、内存使用率、磁盘使用率等,方便开发人员对程序的性能表现进行分析。监控程序要求能够运行在x86或者Arm嵌入式平台上的linux系统,采集性能数据的程序须尽可能轻量化和可定制,于是个人利用工作之余设计本方案。 为了使用者能够实时查看到监视目标的 运

用于Python中的进程和系统监视的跨平台库psutil-爱代码爱编程

最近平台运行,出现一些问题,考虑如何设置监控。发现一个Python库,感觉非常实用。分享一下。 psutil(Process and system实用程序)是一个跨平台库,用于检索运行过程和系统利用(CPU,内存,磁盘,网络,传感器)在Python中。它主要用于系统监测, 分析和限制过程资源和运行过程管理...它实现了经典UNIX命令行工具提供的许多功能

python实现监控数据界面_python 监控界面-爱代码爱编程

MySQL MTOP - 开源 MySQL 企业监控系统 MySQLMTOP是一个由Python+PHP开发的MySQL企业级监控系统。系统由Python实现多进程数据采集和告警,PHP实现WEB展示和管理。最重要是MySQL服务器无需安装任何Agent,只需在监控WEB界面配置相关数据库信息 功能非常强大: 可对上百台MySQL数据库的状态、连

python常用库大全(总结)-爱代码爱编程

一、算法设计 Python的数据结构,算法和设计模式的实现。另请参阅真棒算法。 演算法 algorithms --数据结构和算法的最小示例。python-ds-用于采访采访的数据结构和算法的集合。sortedcontainers-排序集合的快速和纯Python实现。TheAlgorithms-用Python实现的所有算法。设计模式 PyPa

终于把所有的Python库,都整理出来啦!-爱代码爱编程

来源丨网络     阅读文本大概需要 5 分钟。 库名称简介 Chardet字符编码探测器,可以自动检测文本、网页、xml的编码。 colorama主要用来给文本添加各种颜色,并且非常简单易用。 Prettytable主要用于在终端或浏览器端构建格式化的输出。 difflib,[Python]标准库,计算文本差异 Levens

终于把所有的 Python 库都整理出来啦-爱代码爱编程

点上方“菜鸟学Python”,选择“星标” 482篇原创干货,第一时间送达 来源丨法纳 常用库 Chardet字符编码探测器,可以自动检测文本、网页、xml的编码。 colorama主要用来给文本添加各种颜色,并且非常简单易用。 Prettytable主要用于在终端或浏览器端构建格式化的输出。 difflib,[Python]标准

awesome-python(python集合框架)-爱代码爱编程

传说, GitHub 上有一个 Awesome - XXX 系列的资源整理,这个系列以“全”闻名,但凡是有一定知识度的领域、语言、框架等,都有自己的 awesome-xxx 系列的项目。今天我们就介绍这个系列中的Python:awesome-python,它是由 vinta 发起维护的 Python 资源列表。 awesome-pytho

linux操作系统——类unix系统_胖虎不秃头的博客-爱代码爱编程

目录 01 Linux 介绍 1.1 Linux 的应用领域 1.1.1个人桌面领域的应用 1.2 服务器领域 1.3 嵌入式领域 02 Linux 入门 2.1 Linux 介绍 2.1.1 概述 2.2 Linux 和 Unix 的关系 2.2.1 unix 是怎么来的 2.2.2 Linux 是怎么来的 2.2.3 Lin

python 史上最全第三方库收集(第二弹)_港城嘟嘟的博客-爱代码爱编程

环境管理 管理 Python 版本和环境的工具 pyenv:简单的 Python 版本管理工具。Vex:可以在虚拟环境中执行命令。virtualenv:创建独立 Python 环境的工具。virtualenvwrapper:virtualenv 的一组扩展。buildout:在隔离环境初始化后使用声明性配置管理。 包管理 管理包和依赖的工具。 pi