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


     作者:高玉涵
     时间: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
    
    • 1
    • 2

     其中有用的信息是三个负载的平均值。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
    
    • 1
    • 2
    • 3

     其中各域的含义为:

    • 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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    2.2 运行后效果
     python .\SystemAccountGraph.py -d 2022-09-30
    
    • 1

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

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117

    结束语

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

  • 相关阅读:
    红心向阳 百鸟朝凤
    人体神经的作用与功能,人的神经系统的作用
    【论文精读6】MVSNet系列论文详解-CIDER
    【正则表达式】笔记
    ASCII码与字符对照表(附转换代码)
    我要写整个中文互联网界最牛逼的JVM系列教程 | 「JVM与Java体系架构」章节:跨平台的语言Java和跨语言的平台JVM
    Get、Post的区别------重定向和转发的区别-----http、https的区别!!!
    网络工程师和网络运维工程师,有什么区别?
    前端多媒体处理工具——ffmpeg的使用
    Springboot毕设项目程序员专属社交交友平台的设计于实现v1aeq(java+VUE+Mybatis+Maven+Mysql)
  • 原文地址:https://blog.csdn.net/cg_i/article/details/127157939