PYTHON 实现 UNIX/LINUX 性能监视可视化
- 我为什么要做这个
- 一、背景知识
- 1.1 性能及其对用户的影响
- 1.2 UNIX/LINUX 性能简介
- 1.3 使用 uptime 命令监视系统状态
- 1.3 使用 vmstat 监视内存性能
- 二、PYTHON 实现性能监视可视化
- 2.1 源代码
- 2.2 运行后效果
- 2.3 记录文件样式
- 结束语
作者:高玉涵
时间: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 命令的例子:
1
2
3uptime 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 的输出。
1
2
3
4procs -----------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 源代码
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
267''' 作者:高玉涵 时间: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 运行后效果
1
2python .SystemAccountGraph.py -d 2022-09-30
2.3 记录文件样式
- uptime
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
4010: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
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
118procs -----------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
结束语
上面的程序代码只需简单修改,就能运用到你的日常工作中去,如果它能给你带来帮助,那么我将备感荣幸。程序中存在冗余代码和硬编码,细心的你可能还发现缺少必要的异常处理。这些在我的应用里都不是问题,但如果是使用的你可能要特别小心了。
最后
以上就是难过发带最近收集整理的关于PYTHON 实现 UNIX/LINUX 性能监视可视化的全部内容,更多相关PYTHON内容请搜索靠谱客的其他文章。
发表评论 取消回复