Repository navigation
Expand file tree
/
Copy pathatom.xml
More file actions
450 lines (244 loc) · 267 KB
/
Copy pathatom.xml
File metadata and controls
450 lines (244 loc) · 267 KB
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
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Trash Can</title>
<subtitle>Recycle Bin</subtitle>
<link href="https://laplacence.github.io/atom.xml" rel="self"/>
<link href="https://laplacence.github.io/"/>
<updated>2024-03-07T12:23:48.829Z</updated>
<id>https://laplacence.github.io/</id>
<author>
<name>Laplacence</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>恭喜2024年</title>
<link href="https://laplacence.github.io/2024/03/07/congrate_for_2024/"/>
<id>https://laplacence.github.io/2024/03/07/congrate_for_2024/</id>
<published>2024-03-06T16:00:00.000Z</published>
<updated>2024-03-07T12:23:48.829Z</updated>
<content type="html"><![CDATA[<p>其实是因为太久没更新水一篇文章。</p><span id="more"></span><h2 id="去年总结"><a class="markdownIt-Anchor" href="#去年总结"></a> 去年总结</h2><p>关于2023年嘛,还算是比较顺利的一年,电吉他也玩的比较多(虽然几乎是每天都在练习),还顺势上了两次舞台。</p><p>工作上的话就是接触比较多IB和RoCE相关的工作吧,学习了挺多,后续尝试更新下IB和RoCE的内容。</p><h2 id="今年如何"><a class="markdownIt-Anchor" href="#今年如何"></a> 今年如何?</h2><p>希望电吉他能更精进一层,工作上能再做一些更加自动化的东西吧,优化老屎山。</p><p>在写的时候突然发现2024已经过去了3个月,好可怕!</p>]]></content>
<summary type="html"><p>其实是因为太久没更新水一篇文章。</p></summary>
<category term="experience" scheme="https://laplacence.github.io/categories/experience/"/>
</entry>
<entry>
<title>拥塞控制算法机制介绍</title>
<link href="https://laplacence.github.io/2022/07/12/congestion_control_intro/"/>
<id>https://laplacence.github.io/2022/07/12/congestion_control_intro/</id>
<published>2022-07-11T16:00:00.000Z</published>
<updated>2022-07-13T17:23:06.940Z</updated>
<content type="html"><![CDATA[<p>拥塞控制原理实际上包含了四个算法:慢启动,拥塞避免,快重传,快恢复</p><span id="more"></span><h2 id="慢启动阶段"><a class="markdownIt-Anchor" href="#慢启动阶段"></a> 慢启动阶段</h2><p>当链路初始启动时,将会把 <em>拥塞控制窗口(cwnd)</em> 设置为1~10个 <em>最大报文段(MSS)</em> ,具体则根据当前机器的TCP协议实现而有所变化。</p><p>发送端将根据cwnd的大小来发送数据,在每一个收到有效回复的RTT内,cwnd都会增加1个MSS的大小。考虑到接收端有延迟,大体上是在呈指数级增长。<br />如果带宽为W,所耗时间如所示计算方法,经过一定的时间之后就可以占满带宽。</p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi><mi>i</mi><mi>m</mi><mi>e</mi><mo>=</mo><mi>R</mi><mi>T</mi><mi>T</mi><mo>×</mo><mi>l</mi><mi>o</mi><msub><mi>g</mi><mn>2</mn></msub><mi>W</mi></mrow><annotation encoding="application/x-tex">time=RTT \times log_2W</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span class="mord mathnormal">m</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">o</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span></span></span></span></p><h2 id="拥塞避免阶段"><a class="markdownIt-Anchor" href="#拥塞避免阶段"></a> 拥塞避免阶段</h2><p>拥塞避免的主要思想是 <em>线性增加,乘积减少(AIMD)。</em></p><p>即 <em>Additive Increase, Multiplicative Decrease.</em></p><p>TCP协议中设置了名为 <em>慢启动阈值(ssthresh)</em> 的变量,当cwnd达到ssthresh时,cwnd将会转换为线性增长的拥塞避免阶段。<br />当数据包在一定时间内没有收到确认时,将会假设未确认是由于网络发生了拥塞,但事实上有些网络环境只是链路质量过于差。<br />这时候将会进行减半的操作,进而避免产生更多的拥塞。<br />例如发送了15个包,但只收到了前5个包的确认。后10个包的数据量的一半,设置为新的ssthresh值。<br />接着把cwnd的值重新设置为1个MSS的大小,再次回到慢启动阶段。</p><h2 id="快速重传阶段"><a class="markdownIt-Anchor" href="#快速重传阶段"></a> 快速重传阶段</h2><p>有两个事件会导致快速重传的发生,超时重传和重复确认。</p><p>超时重传是TCP协议在发送端每发送一个报文段就会设置一个计时器,如果接收端在发送确认回来的时间超过了计时器的等待时间,将会重新发送该报文段。<br />重复确认是接收端收到未按正确顺序的包时,接收端立刻将最后一次确认过的包再次发送ACK给发送端,该重复阈值一般为3。<br />即接收端收到同一包的ACK四次之后,便会从ACK中最后一次确认过的包开始继续发包。<br />一旦发生这两种情况,ssthresh的值和cwnd的值将会与拥塞避免阶段的设置相同,再次回到拥塞避免阶段。</p><h2 id="快速恢复阶段"><a class="markdownIt-Anchor" href="#快速恢复阶段"></a> 快速恢复阶段</h2><p>在上述的快速重传阶段之后,又添加了后来的快速恢复阶段。</p><p>当发生重复确认时,将进入快速恢复阶段。<br />这时候将会先按照快速重传阶段的设置把cwnd和ssthresh设置好,接着把cwnd设置为ssthresh加上三个MSS的大小,添加三个的原因一般是重传三次ACK,随后重传丢失了的数据包。<br />当再次收到重复的ACK时,cwnd将会递增1,并尝试发送间下一个报文段。<br />这时如果收到新的ACK时,cwnd的值将更改现在的ssthresh的值。<br />即表示重传已经结束,可以按照顺序继续发送数据,再次回到拥塞避免阶段。</p><h2 id="经典tcp拥塞控制算法"><a class="markdownIt-Anchor" href="#经典tcp拥塞控制算法"></a> 经典TCP拥塞控制算法</h2><p>TCP/IP协议簇作为当前网络的基本,在保持可靠传输的前提下,承担着流量控制、拥塞控制等任务,以获取高性能数据传输。<br />TCP协议基本的拥塞控制算法有四个阶段,分别是慢启动阶段、拥塞避免阶段、快速重传阶段、快速恢复阶段。<br />纵观来看,拥塞控制算法的基本运作流程都可以简化为修改最终数据流,而在这一步不可避免地就要修改 <em>拥塞控制窗口(cwnd)</em>。<br />一般的拥塞控制算法通过接收端和发送端发包的确认情况和丢失情况,来估计网络是否产生了拥塞,进而避免网络崩溃。<br />但在实际应用中,这种预估的方法会比真正的拥塞发生要慢上许多。<br />为解决这一问题,计算机科学家们想过很多办法,比如及早将路由器缓存的情况报告给接收端。<br />即使用TCP协议的 <em>拓展显式拥塞通知ECN</em> ,当路由器或链路发生拥塞时,把请求发送数据速率降低的信号发给发送端。<br />仅当配合 <em>活动队列管理(AQM)</em> 策略的时候,ECN才能有效地使用,它依赖于AQM的精确度,而且在高度拥塞的网络环境中性能急剧降低。<br />另一种方法是测量 <em>RTT(数据包往返时延)</em> ,当RTT增大时,就降低发送数据的速率。<br />其中的代表是BBR算法,与以往大部分拥塞算法基于丢包来作为拥塞信号不同,BBR算法会主动检测RTT。</p><h2 id="bbr拥塞控制算法"><a class="markdownIt-Anchor" href="#bbr拥塞控制算法"></a> BBR拥塞控制算法</h2><p>普通的拥塞控制算法是由事件驱动的。</p><p>不管是丢包还是RTT的增加,都被视为一种严重的拥塞事件,这些严重的拥塞事件导致TCP拥塞控制系统在寻找当前带宽、避免拥塞发生、探测在当前状态下还能使用的带宽这三种状态之间切换,最终的结果也就是导致促使拥塞算法调整拥塞控制窗口的大小。<br />只要拥塞控制状态机检测到拥塞事件的发生,它就可以直接控制这些状态的切换,而不管它是否实际发生,结果都会导致降低拥塞控制窗口的值。<br />所以在这点上,Reno算法和Cubic算法的拥塞控制窗口调整是被动的。</p><p>BBR算法具有内置的状态机制,不受TCP拥塞控制状态机的控制。<br />它可以完成所有的状态检测和切换,而不会受到外部干扰。<br />BBR算法将定期尝试检测是否有更多带宽并尽可能多地使用它,如果没有,它将返回到先前的状态。</p><p>BBR状态机的维持。<br />BBR算法的主体由一个状态机构成,共有四个状态,STARTUP,DRAIN,PROBE_BW,PROBE_RTT。<br />将 <em>bw(瞬时带宽值)</em> 乘以一个内置的 <em>增益系数(pacing gain)</em> 得到 <em>pacing rate(传输速率)</em> ,以及对RTT值的持续跟踪,BBR算法会根据上述计算的结果在这四个状态之间自由地来回切换。<br />其目的也是抛弃原有的丢包反馈,使得充分利用带宽。</p><p>瞬时带宽的计算。<br />计算bw(瞬时带宽值),这是BBR算法中所有计算的基础和规则。<br />BBR算法将会根据当前获得地瞬时带宽值以及其所处的状态来计算 <em>pacing rate(传输速率)</em> 以及 <em>cwnd(拥塞控制窗口)</em> ,BBR算法的简单高效正是源于此。<br />系统将会自动跟踪迄今为止最大的瞬时带宽。</p><p>实时跟踪RTT。<br />BBR算法之所以能够获取很高的带宽利用率,是因为它使用了状态机内的两个状态交替测量最大带宽值和最小RTT,得出吞吐率与 <em>RTT的乘积(BDP)</em> 的结果如公式所示。</p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mi>D</mi><mi>P</mi><mo>=</mo><mi>B</mi><msub><mi>W</mi><mrow><mi>m</mi><mi>a</mi><mi>x</mi></mrow></msub><mo>×</mo><mi>R</mi><mi>T</mi><msub><mi>T</mi><mrow><mi>m</mi><mi>i</mi><mi>n</mi></mrow></msub></mrow><annotation encoding="application/x-tex">BDP=BW_{max} \times RTT_{min}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight">x</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mord mathnormal mtight">i</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></p><p>能利用到这个最大的带宽容量,是BBR算法的最终目标,也正是这个目标最终驱动了cwnd的计算。系统会自动跟踪当前为止最小RTT。<br />BBR算法最主要维持两个核心的控制参数,<em>pacing rate(传输速率)</em> 和 <em>cwnd(拥塞控制窗口)</em>。</p><p>传输速率的计算 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mi>a</mi><mi>c</mi><mi>i</mi><mi>n</mi><mi>g</mi><mi mathvariant="normal">_</mi><mi>r</mi><mi>a</mi><mi>t</mi><mi>e</mi><mo>=</mo><mi>b</mi><mi>w</mi><mo>×</mo><mi>p</mi><mi>a</mi><mi>c</mi><mi>i</mi><mi>n</mi><mi>g</mi><mi mathvariant="normal">_</mi><mi>g</mi><mi>a</mi><mi>i</mi><mi>n</mi></mrow><annotation encoding="application/x-tex">pacing\_rate=bw \times pacing\_gain</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9695199999999999em;vertical-align:-0.31em;"></span><span class="mord mathnormal">p</span><span class="mord mathnormal">a</span><span class="mord mathnormal">c</span><span class="mord mathnormal">i</span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord" style="margin-right:0.02778em;">_</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.77777em;vertical-align:-0.08333em;"></span><span class="mord mathnormal">b</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.9695199999999999em;vertical-align:-0.31em;"></span><span class="mord mathnormal">p</span><span class="mord mathnormal">a</span><span class="mord mathnormal">c</span><span class="mord mathnormal">i</span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord" style="margin-right:0.02778em;">_</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">a</span><span class="mord mathnormal">i</span><span class="mord mathnormal">n</span></span></span></span></p><p>拥塞窗口的计算 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mi>w</mi><mi>n</mi><mi>d</mi><mo>=</mo><mi>B</mi><mi>D</mi><mi>P</mi><mo>×</mo><mi>c</mi><mi>w</mi><mi>n</mi><mi>d</mi><mi mathvariant="normal">_</mi><mi>g</mi><mi>a</mi><mi>i</mi><mi>n</mi></mrow><annotation encoding="application/x-tex">cwnd=BDP \times cwnd\_gain</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathnormal">c</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord mathnormal">n</span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.00444em;vertical-align:-0.31em;"></span><span class="mord mathnormal">c</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord mathnormal">n</span><span class="mord mathnormal">d</span><span class="mord" style="margin-right:0.02778em;">_</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">a</span><span class="mord mathnormal">i</span><span class="mord mathnormal">n</span></span></span></span></p><p>当然,事物存在它的两面性,代价是什么?</p><p>BBR自出世以来已经收到了一些批评,首先,因为它倾向于抢占Cubic算法的带宽,在网络公平性上明显存在不足;<br />其次BBR的机制会导致高重传率;<br />第三点是在Wi-Fi环境下用户的网速明显变慢。<br />综合来看,BBR与Cubic相比只能说互有优劣,各有其擅长的领域。</p><h2 id="bbrv2"><a class="markdownIt-Anchor" href="#bbrv2"></a> BBRv2</h2><p>针对BBR的问题,BBRv2的目标就是解决第一版中存在的一些主要缺点,其改进包括了还使用聚合/运行中的参数增强了网络建模,并增加了对 <em>ECN(显式拥塞通知)</em> 的支持等。<br />为便于理解,我们可以通过这样一张表来了解这几个拥塞算法的异同。</p><table><thead><tr><th></th><th>CUBIC</th><th>BBR v1</th><th>BBR v2</th></tr></thead><tbody><tr><td>Model parameters for the state machine</td><td>N/A</td><td>Troughput, RTT</td><td>Throughput, RTT, max aggregation, max inflight</td></tr><tr><td>Loss</td><td>Reduce cwnd by 30% on window by any loss</td><td>N/A</td><td>Explicit loss rate target</td></tr><tr><td>ECN</td><td>RFC3168 (Classic ECN)</td><td>N/A</td><td>DCTCP-inspired ECN</td></tr><tr><td>Startup</td><td>Slow-start until RTT rises (Hystart) or any loss</td><td>Slow-start until throughput plateaus</td><td>Slow-start until throughput plateaus or ECN/Loss rate > target</td></tr></tbody></table><p>早在2019年,Dropbox 就已经在自家的数据中心边缘网络进行尝试使用BBRv2算法,并在下面的博客记载了详细的过程。</p><p><a href="https://dropbox.tech/infrastructure/evaluating-bbrv2-on-the-dropbox-edge-network">Evaluating BBRv2 on the Dropbox Edge Network</a></p><p>“在我们的测试中,BBRv2显示了以下特性:</p><ul><li>对于网速较低的用户来说,带宽可以与CUBIC媲美。</li><li>对于网速较高的用户来说,带宽可以与BBRv1媲美。</li><li>丢包率比BBRv1低4倍;但仍然比CUBIC高2倍。</li><li>传输中的数据比BBRv1低3倍;但略低于CUBIC。</li><li>RTTs较BBRv1低;但仍然比CUBIC高。</li><li>与BBRv1相比,RTT具有更高的公平性。</li></ul><p>总的来说,BBRv2在BBRv1基础上有了很大的改进,而且在需要更高带宽的情况下,它更接近于成为Reno/CUBIC的完全替代品。<br />添加实验性的ECN支持,我们甚至可以看到他可以成为 <em>Datacenter TCP (DCTCP)</em> 的完全替代者。”</p>]]></content>
<summary type="html"><p>拥塞控制原理实际上包含了四个算法:慢启动,拥塞避免,快重传,快恢复</p></summary>
<category term="network" scheme="https://laplacence.github.io/categories/network/"/>
</entry>
<entry>
<title>什么是自动安装?</title>
<link href="https://laplacence.github.io/2022/06/08/what_mean_about_automatic/"/>
<id>https://laplacence.github.io/2022/06/08/what_mean_about_automatic/</id>
<published>2022-06-07T16:00:00.000Z</published>
<updated>2022-06-07T16:42:55.027Z</updated>
<content type="html"><![CDATA[<p>如果你使用apt命令在终端中安装软件包,你将看到各种输出。<br />当你注意这些输出的时候,会看到一些提示。</p><span id="more"></span><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">package_name set to manually installed</span><br></pre></td></tr></table></figure><p>你有没有想过这条消息是什么意思,为什么你没有在所有包上看到它?让我在本篇中分享一些细节。</p><p>那么从最常见的场景开始:复制文件和复制目录。</p><h2 id="理解"><a class="markdownIt-Anchor" href="#理解"></a> 理解</h2><p>当你尝试安装已安装的库或开发包时,你会看到这个输出。此依赖包是与另一个包一起自动安装的。如果删除了主包,则使用 apt autoremove 命令删除依赖包。</p><p>但是由于你试图显式安装依赖包,你的 Debian 系统认为你需要这个包独立于主包。因此,该软件包被标记为手动安装,不会被自动删除。</p><p>不是很清楚,对吧?以 在 Debian 上安装 inxi 为例。</p><p>由于主 inxi 包依赖于许多其他包,因此这些包会自动安装。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">sudo apt install inxi</span></span><br><span class="line">Reading package lists... Done</span><br><span class="line">Building dependency tree... Done</span><br><span class="line">Reading state information... Done</span><br><span class="line">The following additional packages will be installed:</span><br><span class="line"> bind9-dnsutils bind9-host bind9-libs dnsutils file hddtemp libdrm-amdgpu1 libdrm-common libdrm-intel1</span><br><span class="line"> libdrm-nouveau2 libdrm-radeon1 libdrm2 libfontenc1 libfstrm0 libgl1 libgl1-mesa-dri libglapi-mesa libglew2.1</span><br><span class="line"> libglu1-mesa libglvnd0 libglx-mesa0 libglx0 libice6 libicu67 libllvm11 liblmdb0 libmagic-mgc libmagic1 libmaxminddb0</span><br><span class="line"> libpci3 libpciaccess0 libprotobuf-c1 libsensors-config libsensors5 libsm6 libusb-1.0-0 libuv1 libvulkan1</span><br><span class="line"> libwayland-client0 libx11-xcb1 libxaw7 libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-randr0</span><br><span class="line"> libxcb-shape0 libxcb-shm0 libxcb-sync1 libxcb-xfixes0 libxcomposite1 libxcursor1 libxdamage1 libxfixes3 libxft2</span><br><span class="line"> libxi6 libxinerama1 libxkbfile1 libxml2 libxmu6 libxrandr2 libxrender1 libxshmfence1 libxt6 libxtst6 libxv1</span><br><span class="line"> libxxf86dga1 libxxf86vm1 libz3-4 lm-sensors mesa-utils mesa-vulkan-drivers pci.ids pciutils tree usbutils x11-common</span><br><span class="line"> x11-utils x11-xserver-utils</span><br><span class="line">Suggested packages:</span><br><span class="line"> libcpanel-json-xs-perl | libjson-xs-perl libxml-dumper-perl glew-utils mmdb-bin fancontrol read-edid i2c-tools</span><br><span class="line"> nickle cairo-5c xorg-docs-core</span><br><span class="line">The following NEW packages will be installed:</span><br><span class="line"> bind9-dnsutils bind9-host bind9-libs dnsutils file hddtemp inxi libdrm-amdgpu1 libdrm-common libdrm-intel1</span><br><span class="line"> libdrm-nouveau2 libdrm-radeon1 libdrm2 libfontenc1 libfstrm0 libgl1 libgl1-mesa-dri libglapi-mesa libglew2.1</span><br><span class="line"> libglu1-mesa libglvnd0 libglx-mesa0 libglx0 libice6 libicu67 libllvm11 liblmdb0 libmagic-mgc libmagic1 libmaxminddb0</span><br><span class="line"> libpci3 libpciaccess0 libprotobuf-c1 libsensors-config libsensors5 libsm6 libusb-1.0-0 libuv1 libvulkan1</span><br><span class="line"> libwayland-client0 libx11-xcb1 libxaw7 libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-randr0</span><br><span class="line"> libxcb-shape0 libxcb-shm0 libxcb-sync1 libxcb-xfixes0 libxcomposite1 libxcursor1 libxdamage1 libxfixes3 libxft2</span><br><span class="line"> libxi6 libxinerama1 libxkbfile1 libxml2 libxmu6 libxrandr2 libxrender1 libxshmfence1 libxt6 libxtst6 libxv1</span><br><span class="line"> libxxf86dga1 libxxf86vm1 libz3-4 lm-sensors mesa-utils mesa-vulkan-drivers pci.ids pciutils tree usbutils x11-common</span><br><span class="line"> x11-utils x11-xserver-utils</span><br><span class="line">0 upgraded, 80 newly installed, 0 to remove and 0 not upgraded.</span><br><span class="line">Need to get 56.2 MB of archives.</span><br><span class="line">After this operation, 226 MB of additional disk space will be used.</span><br><span class="line">Do you want to continue? [Y/n]</span><br></pre></td></tr></table></figure><p>比如我们检查第一个新安装的 bind9-dnsutils,会发现它被标记为“自动”。</p><p>这表明这些软件包是跟着 inxi 自动安装的,当 inxi 被卸载时,它们会被 apt autoremove 命令自动删除。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">apt list --installed | grep bind9-dnsutils</span></span><br><span class="line"></span><br><span class="line">WARNING: apt does not have a stable CLI interface. Use with caution in scripts.</span><br><span class="line"></span><br><span class="line">bind9-dnsutils/stable,stable-security,now 1:9.16.27-1~deb11u1 amd64 [installed,automatic]</span><br></pre></td></tr></table></figure><p>假设你出于某种原因考虑安装 bind9-dnsutils,如果运行 apt install 命令,系统会告诉你该软件包已安装。</p><p>同时,它将标记从自动更改为手动,因为系统认为在尝试手动安装表明需要此包。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">sudo apt install bind9-dnsutils</span></span><br><span class="line">Reading package lists... Done</span><br><span class="line">Building dependency tree... Done</span><br><span class="line">Reading state information... Done</span><br><span class="line">bind9-dnsutils is already the newest version (1:9.16.27-1~deb11u1).</span><br><span class="line">bind9-dnsutils set to manually installed.</span><br><span class="line">0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">apt list --installed | grep bind9-dnsutils</span></span><br><span class="line"></span><br><span class="line">WARNING: apt does not have a stable CLI interface. Use with caution in scripts.</span><br><span class="line"></span><br><span class="line">bind9-dnsutils/stable,stable-security,now 1:9.16.27-1~deb11u1 amd64 [installed]</span><br></pre></td></tr></table></figure><p>现在,删除 inxi 并运行 autoremove 命令。你可以看到 bind9-dnsutils 不在要删除的软件包列表中,并且它仍然在系统上面。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">sudo apt remove inxi</span></span><br><span class="line">Reading package lists... Done</span><br><span class="line">Building dependency tree... Done</span><br><span class="line">Reading state information... Done</span><br><span class="line">The following packages were automatically installed and are no longer required:</span><br><span class="line"> dnsutils file hddtemp libdrm-amdgpu1 libdrm-common libdrm-intel1 libdrm-nouveau2 libdrm-radeon1 libdrm2 libfontenc1</span><br><span class="line"> libgl1 libgl1-mesa-dri libglapi-mesa libglew2.1 libglu1-mesa libglvnd0 libglx-mesa0 libglx0 libice6 libllvm11</span><br><span class="line"> libmagic-mgc libmagic1 libpci3 libpciaccess0 libsensors-config libsensors5 libsm6 libusb-1.0-0 libvulkan1</span><br><span class="line"> libwayland-client0 libx11-xcb1 libxaw7 libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-randr0</span><br><span class="line"> libxcb-shape0 libxcb-shm0 libxcb-sync1 libxcb-xfixes0 libxcomposite1 libxcursor1 libxdamage1 libxfixes3 libxft2</span><br><span class="line"> libxi6 libxinerama1 libxkbfile1 libxmu6 libxrandr2 libxrender1 libxshmfence1 libxt6 libxtst6 libxv1 libxxf86dga1</span><br><span class="line"> libxxf86vm1 libz3-4 lm-sensors mesa-utils mesa-vulkan-drivers pci.ids pciutils tree usbutils x11-common x11-utils</span><br><span class="line"> x11-xserver-utils</span><br><span class="line">Use 'sudo apt autoremove' to remove them.</span><br><span class="line">The following packages will be REMOVED:</span><br><span class="line"> inxi</span><br><span class="line">0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.</span><br><span class="line">After this operation, 995 kB disk space will be freed.</span><br><span class="line">Do you want to continue? [Y/n] y</span><br><span class="line">(Reading database ... 26557 files and directories currently installed.)</span><br><span class="line">Removing inxi (3.3.01-1-1) ...</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">apt list --installed | grep bind9-dnsutils</span></span><br><span class="line"></span><br><span class="line">WARNING: apt does not have a stable CLI interface. Use with caution in scripts.</span><br><span class="line"></span><br><span class="line">bind9-dnsutils/stable,stable-security,now 1:9.16.27-1~deb11u1 amd64 [installed]</span><br></pre></td></tr></table></figure><h2 id="将包设置为自动"><a class="markdownIt-Anchor" href="#将包设置为自动"></a> 将包设置为自动</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">sudo apt-mark auto bind9-dnsutils</span></span><br><span class="line">bind9-dnsutils set to automatically installed.</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">apt list --installed | grep bind9-dnsutils</span></span><br><span class="line"></span><br><span class="line">WARNING: apt does not have a stable CLI interface. Use with caution in scripts.</span><br><span class="line"></span><br><span class="line">bind9-dnsutils/stable,stable-security,now 1:9.16.27-1~deb11u1 amd64 [installed,automatic]</span><br></pre></td></tr></table></figure><p>这不是一个需要注意的错误,也不会中断你任何在系统中的工作。</p><p>但是,了解这些小事会增加你的知识。</p>]]></content>
<summary type="html"><p>如果你使用apt命令在终端中安装软件包,你将看到各种输出。<br />
当你注意这些输出的时候,会看到一些提示。</p></summary>
<category term="experience" scheme="https://laplacence.github.io/categories/experience/"/>
<category term="Linux" scheme="https://laplacence.github.io/categories/Linux/"/>
</entry>
<entry>
<title>使用inxi来获取各类系统信息</title>
<link href="https://laplacence.github.io/2022/01/06/use_inxi_to_get_system_info/"/>
<id>https://laplacence.github.io/2022/01/06/use_inxi_to_get_system_info/</id>
<published>2022-01-05T16:00:00.000Z</published>
<updated>2022-01-06T13:35:55.432Z</updated>
<content type="html"><![CDATA[<p>inxi是一个用于获取Linux系统信息的终端命令。<br />能够获取软件和硬件的详细信息,比如计算机型号、内核版本、发行版号以及桌面环境等信息,甚至可以读取主存模块占用主板的哪块RAM卡槽等详细信息。<br />inxi还可以用于监控系统中正在消耗CPU或者内存资源的进程。</p><p>首先展示下如何安装inxi。</p><span id="more"></span><h2 id="在linux上安装inxi"><a class="markdownIt-Anchor" href="#在linux上安装inxi"></a> 在Linux上安装inxi</h2><p>inxi也算是一个非常流行的工具,所以在大多数Linux发行版仓库中都可以轻松获取到该工具。<br />不过还没有流行到各大Linux发行版默认就安装了该软件,所以需要自己安装一下。</p><p>博主日常用RHEL系,就只展示下CentOS7的命令。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">dnf install epel-release -y</span><br><span class="line">dnf install inxi -y</span><br></pre></td></tr></table></figure><h2 id="用inxi获取信息"><a class="markdownIt-Anchor" href="#用inxi获取信息"></a> 用inxi获取信息</h2><p>直接运行inxi的效果如下。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">> </span><span class="language-bash">inxi</span></span><br><span class="line">CPU: 2x 8-Core Intel Xeon Silver 4208 (-MT MCP SMP-) speed/min/max: 2500/800/3200 MHz</span><br><span class="line">Kernel: 5.10.6-1.el7.elrepo.x86_64 x86_64 Up: 357d 5h 17m Mem: 9544.2/64063.7 MiB (14.9%) Storage: 1.53 TiB (4.9% used)</span><br><span class="line">Procs: 912 Shell: Zsh inxi: 3.3.09</span><br></pre></td></tr></table></figure><p>可以简要浏览这些信息:</p><ul><li>CPU</li><li>时钟频率(speed/min/max)</li><li>内核信息(Kernel)</li><li>开机时间(Up)</li><li>内存(Mem)</li><li>磁盘存储空间(Storage)</li><li>运行进程数量(Procs)</li><li>当前使用的Shell</li><li>inxi版本信息</li></ul><p>带上<code>-b</code>可以获得更为详细的信息,博主随便拉了个常用的服务器跑了一次。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">System: Host: normal-server Kernel: 5.10.6-1.el7.elrepo.x86_64 x86_64 bits: 64</span><br><span class="line"> Console: pty pts/4 Distro: CentOS Linux release 7.9.2009 (Core)</span><br><span class="line">Machine: Type: Server System: Inspur product: SA5212M5 v: 00001 serial: 719296827</span><br><span class="line"> Mobo: Inspur model: YZMB-00882-104 v: SA5212M5 serial: MBKC07S24822B40 BIOS: American Megatrends v: 4.1.9</span><br><span class="line"> date: 01/21/2020</span><br><span class="line">CPU: Info: 2x 8-Core Intel Xeon Silver 4208 [MT MCP SMP] speed: 2500 MHz min/max: 800/3200 MHz</span><br><span class="line">Graphics: Device-1: ASPEED Graphics Family driver: ast v: kernel</span><br><span class="line"> Display: server: No display server data found. Headless machine? tty: 180x46</span><br><span class="line"> Message: Unable to show advanced data. Required tool glxinfo missing.</span><br><span class="line">Network: Device-1: Intel Ethernet X722 for 10GbE SFP+ driver: i40e</span><br><span class="line"> Device-2: Intel Ethernet X722 for 10GbE SFP+ driver: i40e</span><br><span class="line"> Device-3: Mellanox MT27710 Family [ConnectX-4 Lx] driver: mlx5_core</span><br><span class="line"> Device-4: Mellanox MT27710 Family [ConnectX-4 Lx] driver: mlx5_core</span><br><span class="line">Drives: Local Storage: total: 1.53 TiB used: 75.96 GiB (4.9%)</span><br><span class="line">Info: Processes: 894 Uptime: 357d 5h 29m Memory: 62.56 GiB used: 9.3 GiB (14.9%) Init: systemd runlevel: 3 Shell: Zsh</span><br><span class="line"> inxi: 3.3.09</span><br></pre></td></tr></table></figure><p>信息还挺多的,不过没有显卡。</p><h2 id="杂项信息"><a class="markdownIt-Anchor" href="#杂项信息"></a> 杂项信息</h2><p>使用<code>-A</code>获得Audio信息,即音频输入输出设备。<br />使用<code>-B</code>是Battery信息。<br />使用<code>-G</code>是图形显示相关信息。<br />以上三个在服务器上都没有……</p><p>使用<code>-F</code>则是获得比<code>-b</code>更为详尽的信息。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line">System: Host: normal-server Kernel: 5.10.6-1.el7.elrepo.x86_64 x86_64 bits: 64</span><br><span class="line"> Console: pty pts/4 Distro: CentOS Linux release 7.9.2009 (Core)</span><br><span class="line">Machine: Type: Server System: Inspur product: SA5212M5 v: 00001 serial: 719296827</span><br><span class="line"> Mobo: Inspur model: YZMB-00882-104 v: SA5212M5 serial: MBKC07S24822B40 BIOS: American Megatrends v: 4.1.9</span><br><span class="line"> date: 01/21/2020</span><br><span class="line">CPU: Info: 2x 8-Core model: Intel Xeon Silver 4208 bits: 64 type: MT MCP SMP cache: L2: 2x 8 MiB (16 MiB)</span><br><span class="line"> Speed: 2500 MHz min/max: 800/3200 MHz Core speeds (MHz): 1: 2500 2: 2500 3: 2500 4: 2500 5: 2500 6: 2500 7: 2500</span><br><span class="line"> 8: 2500 9: 2500 10: 2500 11: 2500 12: 2501 13: 2500 14: 2500 15: 2500 16: 2500 17: 2500 18: 2500 19: 2500 20: 2503</span><br><span class="line"> 21: 2502 22: 2500 23: 2500 24: 2500 25: 2500 26: 2500 27: 2500 28: 2500 29: 2500 30: 2500 31: 2500 32: 2500</span><br><span class="line">Graphics: Device-1: ASPEED Graphics Family driver: ast v: kernel</span><br><span class="line"> Display: server: No display server data found. Headless machine? tty: 180x46</span><br><span class="line"> Message: Unable to show advanced data. Required tool glxinfo missing.</span><br><span class="line">Audio: Message: No device data found.</span><br><span class="line">Network: Device-1: Intel Ethernet X722 for 10GbE SFP+ driver: i40e</span><br><span class="line"> IF: em1 state: up speed: 10000 Mbps duplex: full mac: b4:05:5d:0f:ff:7a</span><br><span class="line"> Device-2: Intel Ethernet X722 for 10GbE SFP+ driver: i40e</span><br><span class="line"> IF: em2 state: down mac: b4:05:5d:0f:ff:7b</span><br><span class="line"> Device-3: Mellanox MT27710 Family [ConnectX-4 Lx] driver: mlx5_core</span><br><span class="line"> IF: p1p1 state: up speed: 25000 Mbps duplex: full mac: 0c:42:a1:b2:2a:78</span><br><span class="line"> Device-4: Mellanox MT27710 Family [ConnectX-4 Lx] driver: mlx5_core</span><br><span class="line"> IF: p1p2 state: down mac: 0c:42:a1:b2:2a:79</span><br><span class="line"> IF-ID-1: br-25031b40df82 state: up speed: 10000 Mbps duplex: unknown mac: 02:42:39:76:64:e4</span><br><span class="line"> IF-ID-2: docker0 state: down mac: 02:42:e5:0c:2e:c6</span><br><span class="line"> IF-ID-3: veth1a4373b state: up speed: 10000 Mbps duplex: full mac: b2:e7:dc:cf:67:a4</span><br><span class="line"> IF-ID-4: veth981c6f5 state: up speed: 10000 Mbps duplex: full mac: c6:dc:d3:04:26:7a</span><br><span class="line"> IF-ID-5: veth9f95df8 state: up speed: 10000 Mbps duplex: full mac: 96:e2:3f:58:f1:19</span><br><span class="line"> IF-ID-6: vethbb2cae1 state: up speed: 10000 Mbps duplex: full mac: f6:82:d8:91:08:ad</span><br><span class="line"> IF-ID-7: vethc85d4c4 state: up speed: 10000 Mbps duplex: full mac: 42:21:8e:64:55:63</span><br><span class="line"> IF-ID-8: vethcee0e6a state: up speed: 10000 Mbps duplex: full mac: e6:26:77:0b:eb:4f</span><br><span class="line"> IF-ID-9: vethcffaf62 state: up speed: 10000 Mbps duplex: full mac: 0e:67:16:a8:48:e2</span><br><span class="line"> IF-ID-10: vethfe3e800 state: up speed: 10000 Mbps duplex: full mac: a6:a6:00:d5:98:24</span><br><span class="line">RAID: Hardware-1: Broadcom / LSI MegaRAID SAS-3 3108 [Invader] driver: megaraid_sas</span><br><span class="line">Drives: Local Storage: total: 1.53 TiB used: 75.96 GiB (4.9%)</span><br><span class="line"> ID-1: /dev/sda model: MR9361-8i size: 223.06 GiB</span><br><span class="line"> ID-2: /dev/sdb model: MR9361-8i size: 1.31 TiB</span><br><span class="line">Partition: ID-1: / size: 204.96 GiB used: 16.59 GiB (8.1%) fs: xfs dev: /dev/sda2</span><br><span class="line"> ID-2: /boot size: 1.99 GiB used: 216 MiB (10.6%) fs: xfs dev: /dev/sda1</span><br><span class="line">Swap: ID-1: swap-1 type: partition size: 16 GiB used: 149.5 MiB (0.9%) dev: /dev/sda3</span><br><span class="line">Sensors: System Temperatures: ipmi cpu-1: 29 C cpu-2: 30 C mobo: N/A</span><br><span class="line"> Fan Speeds (RPM): ipmi fan-1: 4320 fan-2: 4320 fan-3: 4320</span><br><span class="line"> System Temperatures: lm-sensors cpu: 28.0 C mobo: N/A</span><br><span class="line"> Fan Speeds (RPM): lm-sensors N/A</span><br><span class="line">Info: Processes: 873 Uptime: 357d 5h 35m Memory: 62.56 GiB used: 9.16 GiB (14.6%) Init: systemd runlevel: 3 Shell: Zsh</span><br><span class="line"> inxi: 3.3.09</span><br></pre></td></tr></table></figure><p>甚至能看到虚拟网卡和RAID卡的信息。</p><h2 id="进程内存包存储库raid天气"><a class="markdownIt-Anchor" href="#进程内存包存储库raid天气"></a> 进程/内存/包存储库/raid/天气</h2><p>使用<code>-I</code>显示当前进程数、开机时间、shell、内存使用情况和inxi的版本号,差不多就是无参数的inxi弱化版。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Info: Processes: 856 Uptime: 357d 5h 39m Memory: 62.56 GiB used: 8.7 GiB (13.9%) Init: systemd runlevel: 3 Shell: Zsh</span><br><span class="line"> inxi: 3.3.09</span><br></pre></td></tr></table></figure><p>使用<code>-m</code>就是内存信息了。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">Memory: RAM: total: 62.56 GiB used: 8.88 GiB (14.2%)</span><br><span class="line"> Array-1: capacity: 9 TiB note: check slots: 24 EC: Single-bit ECC</span><br><span class="line"> Device-1: CPU0_CH0_DIMM0 size: 16 GiB speed: spec: 2666 MT/s actual: 2400 MT/s</span><br><span class="line"> Device-2: CPU0_CH0_DIMM1 size: No Module Installed</span><br><span class="line"> Device-3: CPU0_CH1_DIMM0 size: 16 GiB speed: spec: 2666 MT/s actual: 2400 MT/s</span><br><span class="line"> Device-4: CPU0_CH1_DIMM1 size: No Module Installed</span><br><span class="line"> Device-5: CPU0_CH2_DIMM0 size: No Module Installed</span><br><span class="line"> Device-6: CPU0_CH2_DIMM1 size: No Module Installed</span><br><span class="line"> Device-7: CPU0_CH3_DIMM0 size: No Module Installed</span><br><span class="line"> Device-8: CPU0_CH3_DIMM1 size: No Module Installed</span><br><span class="line"> Device-9: CPU0_CH4_DIMM0 size: No Module Installed</span><br><span class="line"> Device-10: CPU0_CH4_DIMM1 size: No Module Installed</span><br><span class="line"> Device-11: CPU0_CH5_DIMM0 size: No Module Installed</span><br><span class="line"> Device-12: CPU0_CH5_DIMM1 size: No Module Installed</span><br><span class="line"> Device-13: CPU1_CH0_DIMM0 size: 16 GiB speed: spec: 2666 MT/s actual: 2400 MT/s</span><br><span class="line"> Device-14: CPU1_CH0_DIMM1 size: No Module Installed</span><br><span class="line"> Device-15: CPU1_CH1_DIMM0 size: 16 GiB speed: spec: 2666 MT/s actual: 2400 MT/s</span><br><span class="line"> Device-16: CPU1_CH1_DIMM1 size: No Module Installed</span><br><span class="line"> Device-17: CPU1_CH2_DIMM0 size: No Module Installed</span><br><span class="line"> Device-18: CPU1_CH2_DIMM1 size: No Module Installed</span><br><span class="line"> Device-19: CPU1_CH3_DIMM0 size: No Module Installed</span><br><span class="line"> Device-20: CPU1_CH3_DIMM1 size: No Module Installed</span><br><span class="line"> Device-21: CPU1_CH4_DIMM0 size: No Module Installed</span><br><span class="line"> Device-22: CPU1_CH4_DIMM1 size: No Module Installed</span><br><span class="line"> Device-23: CPU1_CH5_DIMM0 size: No Module Installed</span><br><span class="line"> Device-24: CPU1_CH5_DIMM1 size: No Module Installed</span><br></pre></td></tr></table></figure><p>不愧是服务器,插槽真多(。</p><p>使用<code>--memory-shrot</code>则能看简易版的内存信息。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Memory: RAM: total: 62.56 GiB used: 8.47 GiB (13.5%)</span><br><span class="line"> Report: arrays: 1 slots: 24 modules: 4 type: Unknown</span><br></pre></td></tr></table></figure><p>使用<code>-r</code>查看当前使用的包管理仓库。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">Repos: No active dnf repos in: /etc/dnf/dnf.conf</span><br><span class="line"> No active yum repos in: /etc/yum.conf</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/CentOS-Base.repo</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/CentOS-CR.repo</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/CentOS-Debuginfo.repo</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/CentOS-Media.repo</span><br><span class="line"> Active yum repos in: /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo</span><br><span class="line"> 1: centos-sclo-rh ~ http://mirrorlist.centos.org?arch=$basearch&release=7&repo=sclo-rh</span><br><span class="line"> Active yum repos in: /etc/yum.repos.d/CentOS-SCLo-scl.repo</span><br><span class="line"> 1: centos-sclo-sclo ~ http://mirrorlist.centos.org?arch=$basearch&release=7&repo=sclo-sclo</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/CentOS-Sources.repo</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/CentOS-Vault.repo</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/CentOS-fasttrack.repo</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/CentOS-x86_64-kernel.repo</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/ansible-tower.repo</span><br><span class="line"> Active yum repos in: /etc/yum.repos.d/elrepo.repo</span><br><span class="line"> 1: elrepo ~ http://mirrors.tuna.tsinghua.edu.cn/elrepo/elrepo/el7/$basearch/</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/epel-testing.repo</span><br><span class="line"> Active yum repos in: /etc/yum.repos.d/epel.repo</span><br><span class="line"> 1: epel ~ https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/remi-glpi91.repo</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/remi-glpi92.repo</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/remi-glpi93.repo</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/remi-glpi94.repo</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/remi-modular.repo</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/remi-php54.repo</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/remi-php70.repo</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/remi-php71.repo</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/remi-php72.repo</span><br><span class="line"> Active yum repos in: /etc/yum.repos.d/remi-php73.repo</span><br><span class="line"> 1: remi-php73 ~ http://cdn.remirepo.net/enterprise/7/php73/mirror</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/remi-php74.repo</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/remi-php80.repo</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/remi-php81.repo</span><br><span class="line"> Active yum repos in: /etc/yum.repos.d/remi-safe.repo</span><br><span class="line"> 1: remi-safe ~ http://cdn.remirepo.net/enterprise/7/safe/mirror</span><br><span class="line"> No active yum repos in: /etc/yum.repos.d/remi.repo</span><br></pre></td></tr></table></figure><p>不过好像对安装了dnf的CentOS不太友好。</p><p><code>-R</code>则是raid卡设备了。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">RAID: Hardware-1: Broadcom / LSI MegaRAID SAS-3 3108 [Invader] driver: megaraid_sas</span><br></pre></td></tr></table></figure><p>甚至可以用<code>-W</code>查询天气。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">> </span><span class="language-bash">inxi -W Tokyo,Japan</span></span><br><span class="line">Weather: Report: temperature: 0.6 C (33 F) conditions: Overcast clouds</span><br><span class="line"> Locale: current time: Thu 06 Jan 2022 09:21:55 PM JST Source: WeatherBit.io</span><br></pre></td></tr></table></figure><h2 id="监控资源使用情况"><a class="markdownIt-Anchor" href="#监控资源使用情况"></a> 监控资源使用情况</h2><p><code>-t</code>可以查看top5的进程信息。还可以追加<code>-c</code>和<code>-m</code>查看cpu和内存使用情况。<br /><code>-t</code>效果和<code>-t cm5</code>相同,即top5的信息。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">Processes: CPU top: 5 of 838</span><br><span class="line"> 1: cpu: 67.4% command: mysqld pid: 24509</span><br><span class="line"> 2: cpu: 30.1% command: ./agent pid: 30118</span><br><span class="line"> 3: cpu: 8.0% command: poller.php started by: php pid: 2235</span><br><span class="line"> 4: cpu: 5.1% command: poller.php started by: php pid: 2163</span><br><span class="line"> 5: cpu: 4.5% command: poller.php started by: php pid: 2124</span><br><span class="line"> System RAM: total: 62.56 GiB used: 8.39 GiB (13.4%)</span><br><span class="line"> Memory top: 5 of 838</span><br><span class="line"> 1: mem: 1521.1 MiB (2.3%) command: mysqld pid: 24509</span><br><span class="line"> 2: mem: 150.1 MiB (0.2%) command: mysqld pid: 19241</span><br><span class="line"> 3: mem: 84.5 MiB (0.1%) command: systemd-journald pid: 764</span><br><span class="line"> 4: mem: 78.5 MiB (0.1%) command: dockerd-current pid: 8074</span><br><span class="line"> 5: mem: 78.1 MiB (0.1%) command: ./agent pid: 30118</span><br></pre></td></tr></table></figure><p>偶尔需要监控资源使用情况时,该工具还算趁手。</p><p>如果需要更多的资源监控功能,则推荐使用一些其他的工具。</p><h2 id="总结"><a class="markdownIt-Anchor" href="#总结"></a> 总结</h2><p>对于需要诊断计算机问题以及获取那些并不熟悉的软硬件信息的人来说,inxi 工具是十分便利且有用的。<br />它能识别那些消耗 CPU、内存的进程;可以检查是否安装了合适的图形驱动程序、主板 UEFI/BIOS 是否需要更新等等。</p><p>事实上,在inxi开源社区论坛上,会要求那些寻求帮助的成员提供inxi命令输出内容以便判断他们当前正在使用什么样的系统环境。<br />当然也有其他的工具可以读取Linux上的硬件信息,不过inxi同时能读取硬件和软件信息。</p>]]></content>
<summary type="html"><p>inxi是一个用于获取Linux系统信息的终端命令。<br />
能够获取软件和硬件的详细信息,比如计算机型号、内核版本、发行版号以及桌面环境等信息,甚至可以读取主存模块占用主板的哪块RAM卡槽等详细信息。<br />
inxi还可以用于监控系统中正在消耗CPU或者内存资源的进程。</p>
<p>首先展示下如何安装inxi。</p></summary>
<category term="experience" scheme="https://laplacence.github.io/categories/experience/"/>
<category term="Linux" scheme="https://laplacence.github.io/categories/Linux/"/>
</entry>
<entry>
<title>该从scp转向rsync了</title>
<link href="https://laplacence.github.io/2021/12/11/change_from_scp_to_rsync/"/>
<id>https://laplacence.github.io/2021/12/11/change_from_scp_to_rsync/</id>
<published>2021-12-10T16:00:00.000Z</published>
<updated>2022-01-05T14:47:37.712Z</updated>
<content type="html"><![CDATA[<p>很多用户都是从 scp 命令入手的,所以对 rsync 并不熟悉。<br />此外,rsync 可以做的事情也远不止复制文件,这可能会给菜鸟们留下复杂和难以掌握的印象。<br />尤其是,scp 命令的标志大体上可以直接对应到 cp 命令,而 rsync 命令却很难对应上。</p><span id="more"></span><p>那么从最常见的场景开始:复制文件和复制目录。</p><h2 id="复制文件"><a class="markdownIt-Anchor" href="#复制文件"></a> 复制文件</h2><p>对于复制单个文件而言,scp 和 rsync 命令实际上是等价的。比方说,你需要把 foo.txt 传到你在名为 server 的服务器上的主目录下:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">scp foo.txt me@server:/home/me/</span><br></pre></td></tr></table></figure><p>相应的 rsync 命令只需要输入 rsync 取代 scp:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rsync foo.txt me@server:/home/me/</span><br></pre></td></tr></table></figure><h2 id="复制目录"><a class="markdownIt-Anchor" href="#复制目录"></a> 复制目录</h2><p>对于复制目录,就有了很大的分歧,这也解释了为什么 rsync 会被认为比 scp 更复杂。<br />如果你想把 bar 目录复制到 server 服务器上,除了指定 ssh 信息外,相应的 scp 和 cp 一模一样。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">scp -r bar/ me@server:/home/me/</span><br></pre></td></tr></table></figure><p>对于 rsync,考虑的因素比较多,因为它是一个比较强大的工具。首先,我们来看一下最简单的形式:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rsync -r bar/ me@server:/home/me/</span><br></pre></td></tr></table></figure><p>看起来很简单?对于只包含目录和普通文件的简单情况,这就可以了。<br />然而,rsync 更在意发送与主机系统中一模一样的文件。</p><p>让我们来创建一个稍微复杂一些,但并不罕见的例子:</p><ul><li>创建多级目录结构</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mkdir -p bar/baz</span><br></pre></td></tr></table></figure><ul><li>在其根目录下创建文件</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">touch bar/foo.txt</span><br></pre></td></tr></table></figure><ul><li>现在创建一个符号链接指回到该文件</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd bar/baz</span><br><span class="line">ln -s ../foo.txt link.txt</span><br></pre></td></tr></table></figure><ul><li>返回原位置</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">.</span><br><span class="line">├── baz</span><br><span class="line">│ └── link.txt -> ../foo.txt</span><br><span class="line">└── foo.txt</span><br><span class="line"></span><br><span class="line">1 directory, 2 files</span><br></pre></td></tr></table></figure><p>如果我们尝试上面的命令来复制 bar,我们会注意到非常不同的(并令人惊讶的)结果。</p><p>首先,我们来试试 scp:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">scp -r bar/ me@server:/home/me/</span><br></pre></td></tr></table></figure><p>如果你 ssh 进入你的服务器,看看 bar 的目录树,你会发现它有一个微妙的区别:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">.</span><br><span class="line">├── baz</span><br><span class="line">│ └── link.txt</span><br><span class="line">└── foo.txt</span><br><span class="line">1 directory, 2 files</span><br></pre></td></tr></table></figure><p>link.txt 不再是一个符号链接,它现在是一个 foo.txt 的完整副本。<br />如果你习惯于使用 cp,这可能会是令人惊讶的行为。<br />如果你尝试使用 cp -r 复制 bar 目录,你会得到一个新的目录,里面的符号链接和 bar 的一样。</p><p>现在如果我们尝试使用之前的 rsync 命令,我们会得到一个警告:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">rsync -r bar/ me@server:/home/me/</span><br><span class="line">skipping non-regular file "bar/baz/link.txt"</span><br></pre></td></tr></table></figure><p>rsync 警告我们它发现了一个非常规文件,并正在跳过它。<br />因为你没有告诉它可以复制符号链接,所以它忽略了它们。<br />rsync 在手册中有一节“符号链接”,解释了所有可能的行为选项。<br />在我们的例子中,我们需要添加 -links 标志:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rsync -r --links bar/ me@server:/home/me/</span><br></pre></td></tr></table></figure><p>在远程服务器上,我们看到这个符号链接是作为一个符号链接复制过来的。请注意,这与 scp 复制符号链接的方式不同。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">.</span><br><span class="line">├── baz</span><br><span class="line">│ └── link.txt -> ../foo.txt</span><br><span class="line">└── foo.txt</span><br><span class="line">1 directory, 2 files</span><br></pre></td></tr></table></figure><p>在复制目录时可以使用归档标志 -archive/-a。<br />该归档标志将做大多数人所期望的事情,因为它可以实现递归复制、符号链接复制和许多其他选项。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rsync -a bar/ me@server:/home/me/</span><br></pre></td></tr></table></figure><p>如果你感兴趣的话,rsync 手册页有关于存档标志的深入解释。</p><h2 id="注意事项"><a class="markdownIt-Anchor" href="#注意事项"></a> 注意事项</h2><p>不过,使用 rsync 有一个注意事项。<br />使用 scp 比使用 rsync 更容易指定一个非标准的 ssh 端口。<br />例如,如果 server 使用 8022 端口的 SSH 连接,那么这些命令就会像这样:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">scp -P 8022 foo.txt me@server:/home/me/</span><br></pre></td></tr></table></figure><p>而在使用 rsync 时,你必须指定要使用的“远程 shell”命令,默认是 ssh。<br />你可以使用 -e 标志来指定。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rsync -e 'ssh -p 8022' foo.txt me@server:/home/me/</span><br></pre></td></tr></table></figure><p>rsync 会使用你的 ssh 配置;但是,如果你经常连接到这个服务器,你可以在你的 ~/.ssh/config 文件中添加以下代码。<br />这样你就不需要再为 rsync 或 ssh 命令指定端口了。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Host server</span><br><span class="line"> Port 8022</span><br></pre></td></tr></table></figure><p>另外,如果你连接的每一台服务器都在同一个非标准端口上运行,你还可以配置 RSYNC_RSH 环境变量。</p><h2 id="为什么还是应该切换到-rsync"><a class="markdownIt-Anchor" href="#为什么还是应该切换到-rsync"></a> 为什么还是应该切换到 rsync</h2><p>现在我们已经介绍了从 scp 切换到 rsync 的日常使用案例和注意事项,让我们花一些时间来探讨一下为什么你可能想要使用 rsync 的优点。<br />很多人在很久以前就已经开始使用 rsync 了,就是因为这些优点。</p><ul><li>即时压缩</li></ul><p>如果你和服务器之间的网络连接速度较慢或有限,rsync 可以花费更多的 CPU 处理能力来节省网络带宽。<br />它通过在发送数据之前对数据进行即时压缩来实现。压缩可以用 -z 标志来启用。</p><ul><li>差量传输</li></ul><p>rsync 也只在目标文件与源文件不同的情况下复制文件。这可以在目录中递归地工作。<br />例如,如果你拿我们上面的最后一个 bar 的例子,并多次重新运行那个 rsync 命令,那么在最初的传输之后就不会有任何传输。<br />如果你知道你会重复使用这些命令,例如备份到 U 盘,那么使用 rsync 即使是进行本地复制也是值得的,因为这个功能可以节省处理大型数据集的大量的时间。</p><ul><li>同步</li></ul><p>顾名思义,rsync 可以做的不仅仅是复制数据。<br />到目前为止,我们只演示了如何使用 rsync 复制文件。<br />如果你想让 rsync 把目标目录变成源目录的样子,你可以在 rsync 中添加删除标志 -delete。<br />这个删除标志使得 rsync 将从源目录中复制不存在于目标目录中的文件,然后它将删除目标目录中不存在于源目录中的文件。结果就是目标目录和源目录完全一样。相比之下,scp 只会在目标目录下添加文件。</p><h2 id="结论"><a class="markdownIt-Anchor" href="#结论"></a> 结论</h2><p>对于简单的使用情况,rsync 并不比老牌的 scp 工具复杂多少。<br />唯一显著的区别是在递归复制目录时使用 -a 而不是 -r。<br />然而,正如我们看到的,rsync 的 -a 比 scp 的 -r 更像 cp 的 -r。</p><p>希望通过这些新命令,可以加快文件传输工作流程。</p>]]></content>
<summary type="html"><p>很多用户都是从 scp 命令入手的,所以对 rsync 并不熟悉。<br />
此外,rsync 可以做的事情也远不止复制文件,这可能会给菜鸟们留下复杂和难以掌握的印象。<br />
尤其是,scp 命令的标志大体上可以直接对应到 cp 命令,而 rsync 命令却很难对应上。</p></summary>
<category term="experience" scheme="https://laplacence.github.io/categories/experience/"/>
<category term="Linux" scheme="https://laplacence.github.io/categories/Linux/"/>
</entry>
<entry>
<title>nornir基本使用教程</title>
<link href="https://laplacence.github.io/2021/08/29/nornir_manual/"/>
<id>https://laplacence.github.io/2021/08/29/nornir_manual/</id>
<published>2021-08-28T16:00:00.000Z</published>
<updated>2021-09-06T09:10:10.000Z</updated>
<content type="html"><![CDATA[<p>本文基于nornir3.1.1进行代码测试和执行。</p><span id="more"></span><p>其实和<a href="https://nornir.readthedocs.io/en/latest/index.html">nornir官方文档</a>没什么大差别,写出来方便自己查阅和使用。</p><p>nornir,100%基于python3构成的自动化框架,易于NetDevOps进行二次开发和脚本编写,操作容易。</p><p>相比于ansible,操作更为简单容易,且只需使用python3即可完成配置和脚本编写。</p><p>加上支持使用netmiko,使得一些较为冷门的交换机如ruijie、h3c等无需二次开发插件即可进行脚本编写。</p><p>目前版本为3.1.1,与之前的版本差异较大,看同类文章时需注意版本。</p><h2 id="安装"><a class="markdownIt-Anchor" href="#安装"></a> 安装</h2><p>nornir本体和常用的插件。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install nornir nornir_utils nornir_netmiko</span><br></pre></td></tr></table></figure><h2 id="使用"><a class="markdownIt-Anchor" href="#使用"></a> 使用</h2><h3 id="文件类型"><a class="markdownIt-Anchor" href="#文件类型"></a> 文件类型</h3><p>nornir分为三类文件:</p><ul><li>配置文件yaml</li><li>机器管理文件yaml</li><li>用户脚本py</li></ul><h4 id="配置文件"><a class="markdownIt-Anchor" href="#配置文件"></a> 配置文件</h4><p>首先看配置文件yaml,一般使用<code>config.yaml</code>,可自定义命名。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#config.yaml</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="comment">#仓库配置</span></span><br><span class="line"><span class="attr">inventory:</span></span><br><span class="line"> <span class="comment">#仓库管理插件,一般使用这个,也可自己编写插件。</span></span><br><span class="line"> <span class="attr">plugin:</span> <span class="string">SimpleInventory</span></span><br><span class="line"> <span class="attr">options:</span></span><br><span class="line"> <span class="comment">#三类机器管理文件yaml,可自定义位置。</span></span><br><span class="line"> <span class="attr">host_file:</span> <span class="string">"inventory/hosts.yaml"</span></span><br><span class="line"> <span class="attr">group_file:</span> <span class="string">"inventory/groups.yaml"</span></span><br><span class="line"> <span class="attr">defaults_file:</span> <span class="string">"inventory/defaults.yaml"</span></span><br><span class="line"><span class="comment">#执行器配置</span></span><br><span class="line"><span class="attr">runner:</span></span><br><span class="line"> <span class="comment">#多线程插件</span></span><br><span class="line"> <span class="attr">plugin:</span> <span class="string">threaded</span></span><br><span class="line"> <span class="attr">options:</span></span><br><span class="line"> <span class="comment">#线程数</span></span><br><span class="line"> <span class="attr">num_workers:</span> <span class="number">64</span></span><br></pre></td></tr></table></figure><p>也可以直接在python文件中使用变量指定。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> nornir <span class="keyword">import</span> InitNornir</span><br><span class="line">nr = InitNornir(</span><br><span class="line"> runner={</span><br><span class="line"> <span class="string">"plugin"</span>: <span class="string">"threaded"</span>,</span><br><span class="line"> <span class="string">"options"</span>: {</span><br><span class="line"> <span class="string">"num_workers"</span>: <span class="number">100</span>,</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line"> inventory={</span><br><span class="line"> <span class="string">"plugin"</span>: <span class="string">"SimpleInventory"</span>,</span><br><span class="line"> <span class="string">"options"</span>: {</span><br><span class="line"> <span class="string">"host_file"</span>: <span class="string">"inventory/hosts.yaml"</span>,</span><br><span class="line"> <span class="string">"group_file"</span>: <span class="string">"inventory/groups.yaml"</span></span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>或两类混用指定配置。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> nornir <span class="keyword">import</span> InitNornir</span><br><span class="line">nr = InitNornir(</span><br><span class="line"> config_file=<span class="string">"config.yaml"</span>,</span><br><span class="line"> runner={</span><br><span class="line"> <span class="string">"plugin"</span>: <span class="string">"threaded"</span>,</span><br><span class="line"> <span class="string">"options"</span>: {</span><br><span class="line"> <span class="string">"num_workers"</span>: <span class="number">50</span>,</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>接着可以使用python文件进行测试,无异常则配置测试通过。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> nornir <span class="keyword">import</span> InitNornir</span><br><span class="line">nr = InitNornir(config_file=<span class="string">"config.yaml"</span>)</span><br></pre></td></tr></table></figure><h4 id="机器管理文件"><a class="markdownIt-Anchor" href="#机器管理文件"></a> 机器管理文件</h4><p>目前来看,例如<code>host_file</code>不支持使用多个文件,无法像ansible使用多个文件进行分类管理。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#hosts.yaml</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="comment">#设备名称,可自定义,即nornir认为的机器名称。</span></span><br><span class="line"><span class="attr">cisco_3850:</span></span><br><span class="line"> <span class="attr">hostname:</span> <span class="number">192.168</span><span class="number">.1</span><span class="number">.1</span></span><br><span class="line"> <span class="attr">port:</span> <span class="number">22</span></span><br><span class="line"> <span class="attr">username:</span> <span class="string">cisco</span></span><br><span class="line"> <span class="attr">password:</span> <span class="string">cisco_password</span></span><br><span class="line"> <span class="comment">#nornir自带的platform支持数量过少,这里直接使用netmiko支持的platform</span></span><br><span class="line"> <span class="attr">platform:</span> <span class="string">cisco_ios</span></span><br><span class="line"> <span class="comment">#分组,会在groups.yaml内体现</span></span><br><span class="line"> <span class="attr">groups:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">access_switch</span></span><br><span class="line"> <span class="comment">#自定义字段,key和value可随意制定,与设备绑定。</span></span><br><span class="line"> <span class="attr">data:</span></span><br><span class="line"> <span class="attr">role:</span> <span class="string">access_switch</span></span><br><span class="line"></span><br><span class="line"><span class="attr">cisco_3548:</span></span><br><span class="line"> <span class="attr">hostname:</span> <span class="number">192.168</span><span class="number">.1</span><span class="number">.0</span></span><br><span class="line"> <span class="attr">port:</span> <span class="number">22</span></span><br><span class="line"> <span class="attr">username:</span> <span class="string">cisco</span></span><br><span class="line"> <span class="attr">password:</span> <span class="string">cisco_password</span></span><br><span class="line"> <span class="attr">platform:</span> <span class="string">cisco_nxos</span></span><br><span class="line"> <span class="attr">groups:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">core_switch</span></span><br><span class="line"> <span class="attr">data:</span></span><br><span class="line"> <span class="attr">role:</span> <span class="string">core_switch</span></span><br><span class="line"></span><br><span class="line"><span class="attr">server_1:</span></span><br><span class="line"> <span class="attr">hostname:</span> <span class="number">192.168</span><span class="number">.1</span><span class="number">.2</span></span><br><span class="line"> <span class="attr">username:</span> <span class="string">root</span></span><br><span class="line"> <span class="attr">password:</span> <span class="string">root_password</span></span><br></pre></td></tr></table></figure><p>下面为nornir默认的key/value参数</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"str"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"connection_options"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"$connection_type"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"extras"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"$key"</span><span class="punctuation">:</span> <span class="string">"$value"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"hostname"</span><span class="punctuation">:</span> <span class="string">"str"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"port"</span><span class="punctuation">:</span> <span class="string">"int"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"username"</span><span class="punctuation">:</span> <span class="string">"str"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"password"</span><span class="punctuation">:</span> <span class="string">"str"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"platform"</span><span class="punctuation">:</span> <span class="string">"str"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"groups"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="string">"$group_name"</span></span><br><span class="line"> <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"data"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"$key"</span><span class="punctuation">:</span> <span class="string">"$value"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"hostname"</span><span class="punctuation">:</span> <span class="string">"str"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"port"</span><span class="punctuation">:</span> <span class="string">"int"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"username"</span><span class="punctuation">:</span> <span class="string">"str"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"password"</span><span class="punctuation">:</span> <span class="string">"str"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"platform"</span><span class="punctuation">:</span> <span class="string">"str"</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure><p>分组信息文件示例如下。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#groups.yaml</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">access_switch:</span></span><br><span class="line"> <span class="attr">groups:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">switch</span></span><br><span class="line"> <span class="attr">data:</span></span><br><span class="line"> <span class="attr">os_type:</span> <span class="string">ios</span></span><br><span class="line"></span><br><span class="line"><span class="attr">core_switch:</span></span><br><span class="line"> <span class="attr">data:</span></span><br><span class="line"> <span class="attr">os_type:</span> <span class="string">nxos</span></span><br><span class="line"> <span class="attr">groups:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">switch</span></span><br><span class="line"></span><br><span class="line"><span class="attr">switch:</span></span><br><span class="line"> <span class="attr">data:</span></span><br><span class="line"> <span class="attr">type:</span> <span class="string">switch</span></span><br><span class="line"> <span class="attr">test:</span></span><br><span class="line"> <span class="attr">test_dict:</span></span><br><span class="line"> <span class="attr">a:</span> <span class="number">1</span></span><br><span class="line"> <span class="attr">b:</span> <span class="number">2</span></span><br><span class="line"> <span class="attr">c:</span> <span class="string">abcdef</span></span><br><span class="line"></span><br><span class="line"><span class="attr">linux:</span></span><br><span class="line"> <span class="attr">data:</span></span><br><span class="line"> <span class="attr">type:</span> <span class="string">server</span></span><br></pre></td></tr></table></figure><p>默认配置文件示例如下</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#defaults.yaml</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">platform:</span> <span class="string">linux</span></span><br><span class="line"><span class="attr">groups:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">linux</span></span><br></pre></td></tr></table></figure><h4 id="用户脚本"><a class="markdownIt-Anchor" href="#用户脚本"></a> 用户脚本</h4><p>接下来使用脚本来查看配置文件内的机器参数。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> nornir <span class="keyword">import</span> InitNornir</span><br><span class="line">nr = InitNornir(config_file=<span class="string">"config.yaml"</span>)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(nr.inventory.hosts)</span><br><span class="line"><span class="built_in">print</span>(nr.inventory.groups)</span><br><span class="line"><span class="built_in">print</span>(nr.inventory.hosts[<span class="string">'server_1'</span>].keys())</span><br><span class="line"><span class="built_in">print</span>(nr.inventory.hosts[<span class="string">'cisco_3850'</span>].keys())</span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">{'cisco_3850': Host: cisco_3850, 'cisco_3548': Host: cisco_3548, 'server_1': Host: server_1}</span><br><span class="line">{'access_switch': Group: access_switch, 'core_switch': Group: core_switch, 'switch': Group: switch, 'linux': Group: linux}</span><br><span class="line">dict_keys([])</span><br><span class="line">dict_keys(['role', 'os_type', 'type', 'test'])</span><br></pre></td></tr></table></figure><p>输出1可以看到所有机器名称和它的hostname。</p><p>输出2可以看到所有组。</p><p>输出3可以看到<code>server_1</code>的<code>data</code>所有key。</p><p>输出4可以看到<code>cisco_3850</code>的<code>data</code>所有key。</p><p>并且这些输出都是用标准的python数据格式,字典输出而成,无需经过二次处理即可使用。这里面玩法有多少想必大家都很清楚了。</p><h3 id="过滤器"><a class="markdownIt-Anchor" href="#过滤器"></a> 过滤器</h3><h4 id="filter"><a class="markdownIt-Anchor" href="#filter"></a> filter</h4><p>没错,对于inventory,nornir自带了一个过滤器,可以用来区分设备。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">print</span>(nr.<span class="built_in">filter</span>(os_type=<span class="string">"nxos"</span>).inventory.hosts.keys())</span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dict_keys(['cisco_3548'])</span><br></pre></td></tr></table></figure><p>filter还可以循环使用,多个kv使用。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">print</span>(nr.<span class="built_in">filter</span>(os_type=<span class="string">"nxos"</span>).<span class="built_in">filter</span>(role=<span class="string">"core_switch"</span>).inventory.hosts.keys())</span><br><span class="line"><span class="built_in">print</span>(nr.<span class="built_in">filter</span>(os_type=<span class="string">"nxos"</span>, role=<span class="string">"core_switch"</span>).inventory.hosts.keys())</span><br></pre></td></tr></table></figure><p>也可以作为变量,中转使用。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">filter_device=nr.<span class="built_in">filter</span>(os_type=<span class="string">"nxos"</span>)</span><br><span class="line"><span class="built_in">print</span>(filter_device.<span class="built_in">filter</span>(role=<span class="string">"core_switch"</span>))</span><br></pre></td></tr></table></figure><p>甚至可以塞函数进去。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">has_long_name</span>(<span class="params">host</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">len</span>(host.name) == <span class="number">11</span></span><br><span class="line"></span><br><span class="line">nr.<span class="built_in">filter</span>(filter_func=has_long_name).inventory.hosts.keys()</span><br></pre></td></tr></table></figure><h4 id="children_of_group"><a class="markdownIt-Anchor" href="#children_of_group"></a> children_of_group</h4><p>filter主要使用data里面的key-value进行过滤,如果根据组别拉出来则使用。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">print</span>(nr.inventory.children_of_group(<span class="string">"access_switch"</span>))</span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{Host: cisco_3850}</span><br></pre></td></tr></table></figure><h4 id="f"><a class="markdownIt-Anchor" href="#f"></a> F</h4><p>nornir提供了过滤器对象F,可以使用它进行更加复杂的组合判断。<code>__contains</code>可以判断是否符合指定字符串。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> nornir.core.<span class="built_in">filter</span> <span class="keyword">import</span> F</span><br><span class="line">device = nr.<span class="built_in">filter</span>(F(groups__contains=<span class="string">"access_switch"</span>))</span><br><span class="line"><span class="built_in">print</span>(device.inventory.hosts.keys())</span><br><span class="line">device = nr.<span class="built_in">filter</span>(F(groups__contains=<span class="string">"access_switch"</span>) | F(platform=<span class="string">"linux"</span>))</span><br><span class="line"><span class="built_in">print</span>(device.inventory.hosts.keys())</span><br><span class="line">device = nr.<span class="built_in">filter</span>(F(groups__contains=<span class="string">"access_switch"</span>) & F(platform=<span class="string">"linux"</span>))</span><br><span class="line"><span class="built_in">print</span>(device.inventory.hosts.keys())</span><br><span class="line">device = nr.<span class="built_in">filter</span>(~F(platform=<span class="string">"linux"</span>))</span><br><span class="line"><span class="built_in">print</span>(device.inventory.hosts.keys())</span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">dict_keys(['cisco_3850'])</span><br><span class="line">dict_keys(['cisco_3548', 'server_1'])</span><br><span class="line">dict_keys([])</span><br><span class="line">dict_keys(['cisco_3850', 'cisco_3548'])</span><br></pre></td></tr></table></figure><p>F甚至可以使用<code>__</code>进行data内的字段直接访问,这时候加上<code>__contains</code>可以判断是否为子字符串。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">device = nr.<span class="built_in">filter</span>(F(test__test_dict__c__contains=<span class="string">"def"</span>))</span><br><span class="line"><span class="built_in">print</span>(device.inventory.hosts.keys())</span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dict_keys(['cisco_3850', 'cisco_3548'])</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><p>本文基于nornir3.1.1进行代码测试和执行。</p></summary>
<category term="experience" scheme="https://laplacence.github.io/categories/experience/"/>
<category term="network" scheme="https://laplacence.github.io/categories/network/"/>
<category term="Linux" scheme="https://laplacence.github.io/categories/Linux/"/>
<category term="Python" scheme="https://laplacence.github.io/categories/Python/"/>
</entry>
<entry>
<title>如何使用strace来解决问题?</title>
<link href="https://laplacence.github.io/2021/04/29/how_to_use_strace/"/>
<id>https://laplacence.github.io/2021/04/29/how_to_use_strace/</id>
<published>2021-04-28T16:00:00.000Z</published>
<updated>2021-04-29T09:43:15.000Z</updated>
<content type="html"><![CDATA[<p>如题,虽然可能很多地方都有类似介绍。</p><span id="more"></span><h2 id="程序的配置文件在哪"><a class="markdownIt-Anchor" href="#程序的配置文件在哪"></a> 程序的配置文件在哪?</h2><p>老生长叹,毕竟你不知道这个程序的配置文件是在用户根目录,还是systemd内。</p><p>因为一个程序有一百万种方法来记录它的配置文件在哪里(在手册页、网站上、–help等),但只有一种方法可以让它真正打开它(用系统调用!)。</p><p>比如我现在找一下apt的配置文件。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">strace -tf apt 2>&1|grep <span class="built_in">stat</span></span></span><br><span class="line">.....</span><br><span class="line">17:07:05 stat("/etc/apt/apt.conf.d/", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0</span><br><span class="line">17:07:05 stat("/etc/apt/apt.conf.d/", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0</span><br><span class="line">17:07:05 fstat(4, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0</span><br><span class="line">17:07:05 stat("/etc/apt/apt.conf", 0x7ffe7ec576b0) = -1 ENOENT (No such file or directory)</span><br><span class="line">17:07:05 stat("/var/lib/dpkg/status", {st_mode=S_IFREG|0644, st_size=576398, ...}) = 0</span><br><span class="line">17:07:05 stat("/usr/bin/dpkg", {st_mode=S_IFREG|0755, st_size=313888, ...}) = 0</span><br><span class="line">17:07:05 stat("/etc/debian_version", {st_mode=S_IFREG|0644, st_size=13, ...}) = 0</span><br><span class="line">17:07:05 stat("/usr/share/dpkg/tupletable", {st_mode=S_IFREG|0644, st_size=2249, ...}) = 0</span><br><span class="line">17:07:05 fstat(1, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0</span><br></pre></td></tr></table></figure><p>很明显可以看到<code>apt.conf.d</code>被加入了加载列表,以及<code>apt.conf</code>。</p><h2 id="为什么会挂掉"><a class="markdownIt-Anchor" href="#为什么会挂掉"></a> 为什么会挂掉?</h2><p>执行程序,却什么输出都没有,这是怎么回事?</p><p>很多时候你只需要运行<code>strace -p PID</code>,看看当前运行的是什么系统调用。你甚至不需要看几百行的输出。</p><p>如果这个程序闪没了咋办?</p><p>试试这个!<code>strace <command></code></p><h2 id="为什么很慢"><a class="markdownIt-Anchor" href="#为什么很慢"></a> 为什么很慢?</h2><p>使用 strace 作为一种粗略的剖析工具<code>strace -t <command></code></p><p>会显示每次系统调用的时间戳,这样你就可以寻找大的漏洞,找到罪魁祸首。</p><p>或者用统计工具 <code>strace -c <command></code></p><h2 id="为什么这个网络连接失败"><a class="markdownIt-Anchor" href="#为什么这个网络连接失败"></a> 为什么这个网络连接失败?</h2><p>你可以通过DNS请求来查找域名,或者通过<code>connect</code>系统调用来查找IP。</p><p>一般来说,当<code>tcpdump</code>因为某些原因不能使用或者只是因为比较熟悉<code>strace</code>时,就经常会使用<code>strace</code>调试网络问题。</p><p>比如服务器<code>curl ifconfig.me</code>一直不出结果。<br />这时候<code>strace curl ifconfig.me</code>检查了一下。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">sendto(3, "GET HTTP://ifconfig.me/ HTTP/1.1"..., 172, MSG_NOSIGNAL, NULL, 0) = 172</span><br><span class="line">poll([{fd=3, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)</span><br><span class="line">poll([{fd=3, events=POLLIN}], 1, 1000) = 0 (Timeout)</span><br><span class="line">poll([{fd=3, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)</span><br><span class="line">poll([{fd=3, events=POLLIN}], 1, 1000) = 0 (Timeout)</span><br><span class="line">poll([{fd=3, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)</span><br><span class="line">poll([{fd=3, events=POLLIN}], 1, 1000) = 0 (Timeout)</span><br><span class="line">poll([{fd=3, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)</span><br><span class="line">poll([{fd=3, events=POLLIN}], 1, 1000) = 0 (Timeout)</span><br><span class="line">poll([{fd=3, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)</span><br><span class="line">poll([{fd=3, events=POLLIN}], 1, 1000) = 0 (Timeout)</span><br><span class="line">poll([{fd=3, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)</span><br></pre></td></tr></table></figure><p>发现一直超时,这样头绪会清晰一些,至少不是机器有问题。</p>]]></content>
<summary type="html"><p>如题,虽然可能很多地方都有类似介绍。</p></summary>
<category term="experience" scheme="https://laplacence.github.io/categories/experience/"/>
<category term="Linux" scheme="https://laplacence.github.io/categories/Linux/"/>
</entry>
<entry>
<title>CentOS7更换内核</title>
<link href="https://laplacence.github.io/2021/04/22/upgrade_centos_kernel/"/>
<id>https://laplacence.github.io/2021/04/22/upgrade_centos_kernel/</id>
<published>2021-04-21T16:00:00.000Z</published>
<updated>2022-03-08T12:34:26.823Z</updated>
<content type="html"><![CDATA[<p>如题,虽然可能很多地方都有类似介绍。</p><span id="more"></span><h2 id="安装"><a class="markdownIt-Anchor" href="#安装"></a> 安装</h2><p>首先到 <a href="http://elrepo.org/tiki/HomePage">http://elrepo.org/tiki/HomePage</a> ,按照步骤导入公钥和7的yum源。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org</span><br><span class="line">dnf install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm</span><br></pre></td></tr></table></figure><p>换一波tuna源。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/yum.repos.d/elrepo.repo</span><br><span class="line">:%s/mirrorlist=/#mirrorlist=/g</span><br><span class="line">:%s/elrepo.org\/linux/mirrors.tuna.tsinghua.edu.cn\/elrepo/g</span><br></pre></td></tr></table></figure><p>其次,确认自己需要mainline还是longtime的内核。前者更新快,后者支持时间更久更稳定。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dnf --enablerepo=elrepo-kernel install --allowerasing kernel-lt kernel-lt-headers kernel-lt-tools kernel-lt-devel -y</span><br></pre></td></tr></table></figure><h2 id="更换"><a class="markdownIt-Anchor" href="#更换"></a> 更换</h2><p>首先需要修改一下grub的默认配置。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="built_in">cat</span> /etc/default/grub</span></span><br><span class="line">GRUB_DEFAULT=saved</span><br></pre></td></tr></table></figure><p>然后查看自己的grub2启动表。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">awk -F\<span class="string">' '</span><span class="variable">$1</span>==<span class="string">"menuentry "</span> {<span class="built_in">print</span> i++ <span class="string">" : "</span> <span class="variable">$2</span>}<span class="string">' /etc/grub2.cfg</span></span></span><br><span class="line">0 : CentOS Linux (5.16.12-1.el7.elrepo.x86_64) 7 (Core)</span><br><span class="line">1 : CentOS Linux (3.10.0-1160.24.1.el7.x86_64) 7 (Core)</span><br><span class="line">2 : CentOS Linux (3.10.0-1127.13.1.el7.x86_64) 7 (Core)</span><br><span class="line">3 : CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)</span><br><span class="line">4 : CentOS Linux (0-rescue-2af5b98ee1d740ee9ef8e747f5da2b49) 7 (Core)</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>接着查看当前启动项。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">grub2-editenv list</span></span><br><span class="line">saved_entry=CentOS Linux (3.10.0-1160.24.1.el7.x86_64) 7 (Core)</span><br></pre></td></tr></table></figure><p>更改为第一个,再看一下当前启动项。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">grub2-set-default 0</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">grub2-editenv list</span></span><br><span class="line">saved_entry=0</span><br></pre></td></tr></table></figure><p>更改成功后reboot,uname看一下内核。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="built_in">uname</span> -r</span></span><br><span class="line">5.16.12-1.el7.elrepo.x86_64</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><p>如题,虽然可能很多地方都有类似介绍。</p></summary>
<category term="experience" scheme="https://laplacence.github.io/categories/experience/"/>
<category term="Linux" scheme="https://laplacence.github.io/categories/Linux/"/>
</entry>
<entry>
<title>cacti的绘图bug</title>
<link href="https://laplacence.github.io/2021/01/26/cacti_bug/"/>
<id>https://laplacence.github.io/2021/01/26/cacti_bug/</id>
<published>2021-01-25T16:00:00.000Z</published>
<updated>2021-01-26T07:16:32.000Z</updated>
<content type="html"><![CDATA[<p>其实这篇文应该在2020/09/15就该发出来了,一直忘记写了(</p><span id="more"></span><h2 id="现象"><a class="markdownIt-Anchor" href="#现象"></a> 现象</h2><p>cacti选择起止时间后,绘图并不能正常进行,依旧显示原来的起止时间。</p><h2 id="原因"><a class="markdownIt-Anchor" href="#原因"></a> 原因</h2><p>在相对旧版本的cacti内(versions<=1.1),根目录的绘图graph_image.php文件中,其中的时间判断是依据Unix timestamp,即从 1970/1/1 00:00:00 经过的秒数。</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* override: graph start time (unix time) */</span></span><br><span class="line"><span class="keyword">if</span> (!<span class="keyword">empty</span>(<span class="variable">$_GET</span>[<span class="string">"graph_start"</span>]) && <span class="variable">$_GET</span>[<span class="string">"graph_start"</span>] < <span class="number">1600000000</span>) {</span><br><span class="line"> <span class="variable">$graph_data_array</span>[<span class="string">"graph_start"</span>] = <span class="variable">$_GET</span>[<span class="string">"graph_start"</span>];</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">/* override: graph end time (unix time) */</span></span><br><span class="line"><span class="keyword">if</span> (!<span class="keyword">empty</span>(<span class="variable">$_GET</span>[<span class="string">"graph_end"</span>]) && <span class="variable">$_GET</span>[<span class="string">"graph_end"</span>] < <span class="number">1600000000</span>) {</span><br><span class="line"> <span class="variable">$graph_data_array</span>[<span class="string">"graph_end"</span>] = <span class="variable">$_GET</span>[<span class="string">"graph_end"</span>];</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>原判断为小于1600000000,则会在 2020/09/13 20:26:40 后无法通过判断,进而导致绘图没有刷新。</p><h2 id="解决"><a class="markdownIt-Anchor" href="#解决"></a> 解决</h2><p>简单粗暴:把判断改大。<br />永久解决:更换新版本,确认机器的time_t是否为64位。</p><h2 id="后续"><a class="markdownIt-Anchor" href="#后续"></a> 后续</h2><p>这个问题说白了就是千年虫的翻版,且旧版本测试时候,有可能是在32位机器上进行测试,故判断写成了1600000000,但是32位机器上,Unix timestamp会在2038/01/19 03:14:07后工作异常。</p><p>如果挂载机器是32位,还是尽快更新为妙。</p>]]></content>
<summary type="html"><p>其实这篇文应该在2020/09/15就该发出来了,一直忘记写了(</p></summary>
<category term="experience" scheme="https://laplacence.github.io/categories/experience/"/>
<category term="Linux" scheme="https://laplacence.github.io/categories/Linux/"/>
</entry>
<entry>
<title>详解top应该怎么看</title>
<link href="https://laplacence.github.io/2021/01/25/tutorial_of_top/"/>
<id>https://laplacence.github.io/2021/01/25/tutorial_of_top/</id>
<published>2021-01-24T16:00:00.000Z</published>
<updated>2021-01-25T08:40:57.000Z</updated>
<content type="html"><![CDATA[<p>Linux中的top命令显示系统上正在运行的进程。它是系统管理员最重要的工具之一。被广泛用于监视服务器的负载和进程。<br />(各个发行版的top可能会有出入,请参照对应系统的–help和man,以下展示均在centos7.4上完成。)</p><span id="more"></span><h2 id="输出"><a class="markdownIt-Anchor" href="#输出"></a> 输出</h2><p>首先,让我们了解一下输出。top会显示系统的很多信息。我们需要理解不同部分输出的意义:默认运行时,top命令会显示如下输出:<br />前几行水平显示了不同系统参数的概括,接下来是进程和它们在列中的属性。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">top - 15:16:42 up 103 days, 2:09, 1 user, load average: 0.05, 0.09, 0.11</span><br><span class="line">Tasks: 1067 total, 2 running, 1065 sleeping, 0 stopped, 0 zombie</span><br><span class="line"><span class="meta prompt_">%</span><span class="language-bash">Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.9 <span class="built_in">id</span>, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st</span></span><br><span class="line">KiB Mem : 65420768 total, 27637080 free, 4135944 used, 33647744 buff/cache</span><br><span class="line">KiB Swap: 16777212 total, 16777212 free, 0 used. 60326400 avail Mem </span><br><span class="line"></span><br><span class="line"> PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND </span><br><span class="line">165745 root 20 0 3486224 41824 10268 S 1.0 0.1 3635:03 vcs-agent </span><br><span class="line"> 85707 root 20 0 163096 3320 1584 R 0.7 0.0 0:00.10 top </span><br><span class="line"> 785 root 39 19 0 0 0 R 0.3 0.0 4154:39 kipmi0 </span><br><span class="line"> 2048 zabbixs+ 20 0 7643260 4740 2212 S 0.3 0.0 1:00.49 zabbix_server </span><br><span class="line"> 2228 zabbixs+ 20 0 7646732 7212 4400 S 0.3 0.0 3:17.22 zabbix_server </span><br><span class="line"> 2546 zabbixs+ 20 0 7646852 7236 4404 S 0.3 0.0 3:22.93 zabbix_server </span><br><span class="line"> 48226 root 20 0 2366696 57548 16872 S 0.3 0.1 67:27.70 containerd </span><br><span class="line"> 62322 root 20 0 0 0 0 S 0.3 0.0 0:00.91 kworker/u448:0 </span><br><span class="line"> 1 root 20 0 191164 4068 2464 S 0.0 0.0 16:17.96 systemd </span><br><span class="line"> 2 root 20 0 0 0 0 S 0.0 0.0 0:01.82 kthreadd </span><br><span class="line"> 3 root 20 0 0 0 0 S 0.0 0.0 0:39.27 ksoftirqd/0 </span><br><span class="line"> 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H </span><br><span class="line"> 8 root rt 0 0 0 0 S 0.0 0.0 0:01.23 migration/0 </span><br></pre></td></tr></table></figure><h3 id="系统运行时间和平均负载"><a class="markdownIt-Anchor" href="#系统运行时间和平均负载"></a> 系统运行时间和平均负载</h3><p><code>top - 15:16:52 up 103 days, 2:09, 1 user, load average: 0.06, 0.09, 0.11</code></p><p>top命令的顶部显示与uptime命令相似的输出。</p><p>这些字段意思是:</p><ul><li>当前时间</li><li>系统已运行的时间</li><li>当前登录用户的数量</li><li>相应最近5、10和15分钟内的平均负载。</li><li>可以使用’l’命令切换uptime的显示。</li></ul><p>关于load average,我们可以粗略地按照如下计算方式。</p><p>load average/CPUs=usage percent</p><p>例如上面给出的0.06,这台机器的核心数量可以通过lscpu查看,是32,则利用率为0.1875%,且无进程在等待。</p><p>如果达到了65.00,则此时利用率为203.125%,且有33个进程在等待。</p><h3 id="任务"><a class="markdownIt-Anchor" href="#任务"></a> 任务</h3><p><code>Tasks: 1067 total, 2 running, 1065 sleeping, 0 stopped, 0 zombie</code><br />这一行说明了进程数量和进程类型。</p><h3 id="cpu状态"><a class="markdownIt-Anchor" href="#cpu状态"></a> CPU状态</h3><p><code>%Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st</code><br />CPU状态,显示了不同模式下的百分比,分别为:</p><ul><li>us-user</li><li>sy-system</li><li>ni-niced 优先级</li><li>wa-wait</li><li>hi-hardware_interrupt</li><li>si-software_interrupt</li><li>st-steal 常见于虚拟机,指被虚拟CPU偷走的时间。</li></ul><h3 id="内存使用"><a class="markdownIt-Anchor" href="#内存使用"></a> 内存使用</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">KiB Mem : 65420768 total, 27637080 free, 4135944 used, 33647744 buff/cache</span><br><span class="line">KiB Swap: 16777212 total, 16777212 free, 0 used. 60326400 avail Mem </span><br></pre></td></tr></table></figure><p>内存使用率,类似于free,第一行为物理内存,第二行为swap。</p><h3 id="具体信息"><a class="markdownIt-Anchor" href="#具体信息"></a> 具体信息</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"> PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND </span><br><span class="line">165745 root 20 0 3486224 41824 10268 S 1.0 0.1 3635:03 vcs-agent </span><br><span class="line"> 85707 root 20 0 163096 3320 1584 R 0.7 0.0 0:00.10 top </span><br><span class="line"> 785 root 39 19 0 0 0 R 0.3 0.0 4154:39 kipmi0 </span><br><span class="line"> 2048 zabbixs+ 20 0 7643260 4740 2212 S 0.3 0.0 1:00.49 zabbix_server </span><br><span class="line"> 2228 zabbixs+ 20 0 7646732 7212 4400 S 0.3 0.0 3:17.22 zabbix_server </span><br><span class="line"> 2546 zabbixs+ 20 0 7646852 7236 4404 S 0.3 0.0 3:22.93 zabbix_server </span><br><span class="line"> 48226 root 20 0 2366696 57548 16872 S 0.3 0.1 67:27.70 containerd </span><br><span class="line"> 62322 root 20 0 0 0 0 S 0.3 0.0 0:00.91 kworker/u448:0 </span><br><span class="line"> 1 root 20 0 191164 4068 2464 S 0.0 0.0 16:17.96 systemd </span><br><span class="line"> 2 root 20 0 0 0 0 S 0.0 0.0 0:01.82 kthreadd </span><br><span class="line"> 3 root 20 0 0 0 0 S 0.0 0.0 0:39.27 ksoftirqd/0 </span><br><span class="line"> 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H </span><br><span class="line"> 8 root rt 0 0 0 0 S 0.0 0.0 0:01.23 migration/0 </span><br></pre></td></tr></table></figure><p>默认的列有如下:</p><table><thead><tr><th style="text-align:left">列</th><th style="text-align:left">意义</th></tr></thead><tbody><tr><td style="text-align:left">PID</td><td style="text-align:left">进程ID,唯一标识符。</td></tr><tr><td style="text-align:left">USER</td><td style="text-align:left">进程所有者的实际用户名。</td></tr><tr><td style="text-align:left">PR</td><td style="text-align:left">进程的调度优先级。这个字段的一些值是’rt’。这意味这这些进程运行在实时态。</td></tr><tr><td style="text-align:left">NI</td><td style="text-align:left">进程的nice值(优先级)。越小的值意味着越高的优先级。</td></tr><tr><td style="text-align:left">VIRT</td><td style="text-align:left">进程使用的虚拟内存。</td></tr><tr><td style="text-align:left">RES</td><td style="text-align:left">驻留内存大小。驻留内存是任务使用的非交换物理内存大小。</td></tr><tr><td style="text-align:left">SHR</td><td style="text-align:left">进程使用的共享内存。</td></tr><tr><td style="text-align:left">S</td><td style="text-align:left">这个是进程的状态。它有D/R/S/T/Z/I</td></tr><tr><td style="text-align:left">%CPU</td><td style="text-align:left">自从上一次更新时到现在任务所使用的CPU时间百分比。</td></tr><tr><td style="text-align:left">%MEM</td><td style="text-align:left">进程使用的可用物理内存百分比。</td></tr><tr><td style="text-align:left">TIME+</td><td style="text-align:left">任务启动后到现在所使用的全部CPU时间,精确到百分之一秒。</td></tr><tr><td style="text-align:left">COMMAND</td><td style="text-align:left">运行进程所使用的命令。</td></tr></tbody></table><p>关于S,有如下状态:</p><table><thead><tr><th style="text-align:left">类型</th><th style="text-align:left">意义</th></tr></thead><tbody><tr><td style="text-align:left">D</td><td style="text-align:left">Disk Sleep,不可中断睡眠,一般为进程正在与硬件交互。</td></tr><tr><td style="text-align:left">R</td><td style="text-align:left">Running,运行中。</td></tr><tr><td style="text-align:left">S</td><td style="text-align:left">Interruptible Sleep,可中断睡眠,表示进程因为等待某个事件而被系统挂起。当进程等待的事件发生时,它会被唤醒并进入R。</td></tr><tr><td style="text-align:left">T</td><td style="text-align:left">Traced/Stopped,调试器会触发Traced,发送SIGSTOP信号会触发Stopped。</td></tr><tr><td style="text-align:left">Z</td><td style="text-align:left">Zombie,僵尸进程,父进程结束但未回收资源。</td></tr><tr><td style="text-align:left">I</td><td style="text-align:left">Idle,空闲状态,一般不会消耗资源。</td></tr></tbody></table><h2 id="交互命令"><a class="markdownIt-Anchor" href="#交互命令"></a> 交互命令</h2><h3 id="h"><a class="markdownIt-Anchor" href="#h"></a> h</h3><p>输入h,出现帮助手册。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">Help for Interactive Commands - procps-ng version 3.3.10</span><br><span class="line">Window 1:Def: Cumulative mode Off. System: Delay 3.0 secs; Secure mode Off.</span><br><span class="line"></span><br><span class="line"> Z,B,E,e Global: 'Z' colors; 'B' bold; 'E'/'e' summary/task memory scale</span><br><span class="line"> l,t,m Toggle Summary: 'l' load avg; 't' task/cpu stats; 'm' memory info</span><br><span class="line"> 0,1,2,3,I Toggle: '0' zeros; '1/2/3' cpus or numa node views; 'I' Irix mode</span><br><span class="line"> f,F,X Fields: 'f'/'F' add/remove/order/sort; 'X' increase fixed-width</span><br><span class="line"></span><br><span class="line"> L,&,<,> . Locate: 'L'/'&' find/again; Move sort column: '<'/'>' left/right</span><br><span class="line"> R,H,V,J . Toggle: 'R' Sort; 'H' Threads; 'V' Forest view; 'J' Num justify</span><br><span class="line"> c,i,S,j . Toggle: 'c' Cmd name/line; 'i' Idle; 'S' Time; 'j' Str justify</span><br><span class="line"> x,y . Toggle highlights: 'x' sort field; 'y' running tasks</span><br><span class="line"> z,b . Toggle: 'z' color/mono; 'b' bold/reverse (only if 'x' or 'y')</span><br><span class="line"> u,U,o,O . Filter by: 'u'/'U' effective/any user; 'o'/'O' other criteria</span><br><span class="line"> n,#,^O . Set: 'n'/'#' max tasks displayed; Show: Ctrl+'O' other filter(s)</span><br><span class="line"> C,... . Toggle scroll coordinates msg for: up,down,left,right,home,end</span><br><span class="line"></span><br><span class="line"> k,r Manipulate tasks: 'k' kill; 'r' renice</span><br><span class="line"> d or s Set update interval</span><br><span class="line"> W,Y Write configuration file 'W'; Inspect other output 'Y'</span><br><span class="line"> q Quit</span><br><span class="line"> ( commands shown with '.' require a visible task display window ) </span><br><span class="line">Press 'h' or '?' for help with Windows,</span><br><span class="line">Type 'q' or <Esc> to continue </span><br></pre></td></tr></table></figure><h3 id="spaceenter"><a class="markdownIt-Anchor" href="#spaceenter"></a> Space/Enter</h3><p>手动刷新,That’s all。</p><h3 id="a"><a class="markdownIt-Anchor" href="#a"></a> A</h3><p>这个命令在全屏和交替模式间切换。在交替模式下会显示4个窗口:</p><ul><li>Def-默认字段</li><li>Job-任务字段组</li><li>Mem-内存字段组</li><li>Usr-用户字段组</li></ul><p>这四组字段共有一个独立的可配置的概括区域和它自己的可配置任务区域。4个窗口中只有一个窗口是当前窗口。当前窗口的名称显示在左上方,交互命令只有在当前窗口有效。</p><p>可以使用a/w进行窗口切换。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line">1:Def - 15:55:22 up 103 days, 2:48, 1 user, load average: 0.27, 0.16, 0.15</span><br><span class="line">Tasks: 1064 total, 1 running, 1063 sleeping, 0 stopped, 0 zombie</span><br><span class="line"><span class="meta prompt_">%</span><span class="language-bash">Cpu(s): 0.2 us, 0.4 sy, 0.0 ni, 99.3 <span class="built_in">id</span>, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st</span></span><br><span class="line">KiB Mem : 65420768 total, 27620432 free, 4143136 used, 33657200 buff/cache</span><br><span class="line">KiB Swap: 16777212 total, 16777212 free, 0 used. 60318688 avail Mem </span><br><span class="line"></span><br><span class="line">1 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND</span><br><span class="line"> 165745 root 20 0 3486224 41372 10268 S 3.6 0.1 3636:07 vcs-agent</span><br><span class="line"> 85707 root 20 0 163096 3348 1600 R 1.6 0.0 0:10.35 top</span><br><span class="line"> 135975 root 20 0 0 0 0 S 1.0 0.0 0:11.88 kworker/u449:2</span><br><span class="line"> 10 root 20 0 0 0 0 S 0.5 0.0 169:29.55 rcu_sched</span><br><span class="line"> 2392 zabbixs+ 20 0 7646732 7216 4404 S 0.5 0.0 3:34.37 zabbix_server</span><br><span class="line"> 2416 zabbixs+ 20 0 7646748 7228 4400 S 0.5 0.0 3:25.69 zabbix_server</span><br><span class="line"> 2659 zabbixs+ 20 0 7538696 2196 772 S 0.5 0.0 74:29.38 zabbix_server</span><br><span class="line"> 48226 root 20 0 2366696 57464 16872 S 0.5 0.1 67:36.83 containerd</span><br><span class="line">2 PID PPID TIME+ %CPU %MEM PR NI S VIRT RES UID COMMAND </span><br><span class="line"> 222119 221078 3:28.78 0.0 0.0 20 0 S 444940 22272 48 php-fpm </span><br><span class="line"> 221187 2 0:00.13 0.0 0.0 20 0 S 0 0 0 kworker/12:2 </span><br><span class="line"> 221084 221078 3:33.70 0.0 0.0 20 0 S 442892 20512 48 php-fpm </span><br><span class="line"> 221083 221078 3:27.54 0.0 0.0 20 0 S 442876 20048 48 php-fpm </span><br><span class="line"> 221082 221078 3:27.58 0.0 0.0 20 0 S 442632 19916 48 php-fpm </span><br><span class="line"> 221081 221078 3:28.20 0.0 0.0 20 0 S 446976 24556 48 php-fpm </span><br><span class="line"> 221080 221078 3:25.92 0.0 0.0 20 0 S 442896 19820 48 php-fpm </span><br><span class="line"> 221078 1 2:25.13 0.0 0.0 20 0 S 431568 15696 0 php-fpm </span><br><span class="line"> 217972 221078 3:08.63 0.0 0.0 20 0 S 442096 19300 48 php-fpm </span><br><span class="line">3 PID %MEM VIRT RES CODE DATA SHR nMaj nDRT %CPU COMMAND </span><br><span class="line"> 179000 1.1 16.613g 747632 13000 16.547g 10260 0 0 0.0 mysqld </span><br><span class="line"> 54620 0.9 1067624 570548 4 928560 3268 0 0 0.0 python3 </span><br><span class="line"> 49479 0.2 2559012 100956 64656 2402868 31908 0 0 0.0 dockerd </span><br><span class="line"> 48226 0.1 2366696 57464 36928 2302580 16872 0 0 0.5 containerd </span><br><span class="line"> 165746 0.1 2771720 47136 12068 2734376 11968 0 0 0.0 agent-guan </span><br><span class="line"> 165745 0.1 3486224 41372 17632 3457816 10268 0 0 3.6 vcs-agent </span><br><span class="line"> 150146 0.1 856720 39908 4 499320 6080 0 0 0.0 salt-minion </span><br><span class="line"> 165604 0.1 2172220 34436 5420 2125284 6412 0 0 0.0 supervisor </span><br><span class="line"> 10095 0.1 2297068 34136 24828 2260848 9020 0 0 0.0 filebeat632 </span><br><span class="line">4 PID PPID UID USER RUSER TTY TIME+ %CPU %MEM S COMMAND </span><br><span class="line"> 2018 1 993 zabbixs+ zabbixs+ ? 0:00.27 0.0 0.0 S zabbix_server </span><br><span class="line"> 2036 2018 993 zabbixs+ zabbixs+ ? 19:00.24 0.0 0.0 S zabbix_server </span><br><span class="line"> 2037 2018 993 zabbixs+ zabbixs+ ? 0:58.12 0.0 0.0 S zabbix_server </span><br><span class="line"> 2038 2018 993 zabbixs+ zabbixs+ ? 1:43.64 0.0 0.0 S zabbix_server </span><br><span class="line"> 2039 2018 993 zabbixs+ zabbixs+ ? 2:31.94 0.0 0.0 S zabbix_server </span><br><span class="line"> 2040 2018 993 zabbixs+ zabbixs+ ? 0:59.83 0.0 0.0 S zabbix_server </span><br><span class="line"> 2041 2018 993 zabbixs+ zabbixs+ ? 1:01.25 0.0 0.0 S zabbix_server </span><br><span class="line"> 2042 2018 993 zabbixs+ zabbixs+ ? 1:02.12 0.0 0.0 S zabbix_server </span><br><span class="line"> 2043 2018 993 zabbixs+ zabbixs+ ? 1:01.96 0.0 0.0 S zabbix_server</span><br></pre></td></tr></table></figure><h3 id="b"><a class="markdownIt-Anchor" href="#b"></a> B</h3><p>Bold,会让top部分关键字加粗。</p><h3 id="c"><a class="markdownIt-Anchor" href="#c"></a> c</h3><p>切换是否显示进程启动时的完整路径和程序名。</p><h3 id="ds"><a class="markdownIt-Anchor" href="#ds"></a> d/s</h3><p>时间间隔,如下,我输入了10,即10秒后刷新输出一次top信息。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">1:Def - 15:58:10 up 103 days, 2:51, 1 user, load average: 0.16, 0.15, 0.14</span><br><span class="line">Tasks: 1069 total, 1 running, 1068 sleeping, 0 stopped, 0 zombie</span><br><span class="line"><span class="meta prompt_">%</span><span class="language-bash">Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.8 <span class="built_in">id</span>, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st</span></span><br><span class="line">KiB Mem : 65420768 total, 27623968 free, 4139288 used, 33657512 buff/cache</span><br><span class="line">KiB Swap: 16777212 total, 16777212 free, 0 used. 60322876 avail Mem </span><br><span class="line">Change delay from 3.0 to 10</span><br></pre></td></tr></table></figure><h3 id="f"><a class="markdownIt-Anchor" href="#f"></a> f</h3><p>选择字段,*为已选择的字段。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line">Fields Management for window 1:Def, whose current sort field is %CPU</span><br><span class="line"> Navigate with Up/Dn, Right selects for move then <Enter> or Left commits,</span><br><span class="line"> 'd' or <Space> toggles display, 's' sets sort. Use 'q' or <Esc> to end!</span><br><span class="line"></span><br><span class="line">* PID = Process Id vMn = Minor Faults delta </span><br><span class="line">* USER = Effective User Name USED = Res+Swap Size (KiB) </span><br><span class="line">* PR = Priority nsIPC = IPC namespace Inode </span><br><span class="line">* NI = Nice Value nsMNT = MNT namespace Inode </span><br><span class="line">* VIRT = Virtual Image (KiB) nsNET = NET namespace Inode </span><br><span class="line">* RES = Resident Size (KiB) nsPID = PID namespace Inode </span><br><span class="line">* SHR = Shared Memory (KiB) nsUSER = USER namespace Inode</span><br><span class="line">* S = Process Status nsUTS = UTS namespace Inode </span><br><span class="line">* %CPU = CPU Usage </span><br><span class="line">* %MEM = Memory Usage (RES) </span><br><span class="line">* TIME+ = CPU Time, hundredths</span><br><span class="line">* COMMAND = Command Name/Line </span><br><span class="line"> PPID = Parent Process pid </span><br><span class="line"> UID = Effective User Id </span><br><span class="line"> RUID = Real User Id </span><br><span class="line"> RUSER = Real User Name </span><br><span class="line"> SUID = Saved User Id </span><br><span class="line"> SUSER = Saved User Name </span><br><span class="line"> GID = Group Id </span><br><span class="line"> GROUP = Group Name </span><br><span class="line"> PGRP = Process Group Id </span><br><span class="line"> TTY = Controlling Tty </span><br><span class="line"> TPGID = Tty Process Grp Id </span><br><span class="line"> SID = Session Id </span><br><span class="line"> nTH = Number of Threads </span><br><span class="line"> P = Last Used Cpu (SMP) </span><br><span class="line"> TIME = CPU Time </span><br><span class="line"> SWAP = Swapped Size (KiB) </span><br><span class="line"> CODE = Code Size (KiB) </span><br><span class="line"> DATA = Data+Stack (KiB) </span><br><span class="line"> nMaj = Major Page Faults </span><br><span class="line"> nMin = Minor Page Faults </span><br><span class="line"> nDRT = Dirty Pages Count </span><br><span class="line"> WCHAN = Sleeping in Function</span><br><span class="line"> Flags = Task Flags <sched.h></span><br><span class="line"> CGROUPS = Control Groups </span><br><span class="line"> SUPGIDS = Supp Groups IDs </span><br><span class="line"> SUPGRPS = Supp Groups Names </span><br><span class="line"> TGID = Thread Group Id </span><br><span class="line"> ENVIRON = Environment vars </span><br><span class="line"> vMj = Major Faults delta </span><br></pre></td></tr></table></figure><h3 id="i"><a class="markdownIt-Anchor" href="#i"></a> i</h3><p>空闲任务列表。</p><h3 id="k"><a class="markdownIt-Anchor" href="#k"></a> k</h3><p>输入PID,结束任务。</p><h3 id="ltm"><a class="markdownIt-Anchor" href="#ltm"></a> l/t/m</h3><p>l-不显示load average和uptime<br />t-进度条显示cpu信息/不显示cpu信息<br />m-进度条显示内存信息/不显示内存信息</p><h3 id="r"><a class="markdownIt-Anchor" href="#r"></a> R</h3><p>切换进程的默认排序/PID顺序排序。</p><h3 id="r-2"><a class="markdownIt-Anchor" href="#r-2"></a> r</h3><p>设置任务优先级。</p><h3 id="v"><a class="markdownIt-Anchor" href="#v"></a> V</h3><p>将进程切换显示到树形图。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"> PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND </span><br><span class="line"> 1 root 20 0 191164 4068 2464 S 0.0 0.0 16:18.29 systemd </span><br><span class="line"> 671 root 20 0 39576 9024 8540 S 0.0 0.0 0:21.75 `- systemd-journal </span><br><span class="line"> 692 root 20 0 129176 1312 964 S 0.0 0.0 0:00.00 `- lvmetad </span><br><span class="line"> 965 libstor+ 20 0 8580 824 676 S 0.0 0.0 0:08.84 `- lsmd </span><br><span class="line"> 968 root 20 0 22076 1708 1004 S 0.0 0.0 40:03.04 `- irqbalance </span><br><span class="line"> 971 root 20 0 53452 3168 2296 S 0.0 0.0 0:00.37 `- smartd </span><br><span class="line"> 972 root 20 0 6520 648 532 S 0.0 0.0 13:03.17 `- rngd </span><br><span class="line"> 980 root 20 0 224476 6156 4300 S 0.0 0.0 0:56.00 `- abrtd </span><br><span class="line"> 987 root 20 0 221876 4964 3536 S 0.0 0.0 0:00.10 `- abrt-watch-log </span><br><span class="line"> 1001 dbus 20 0 60324 2548 1852 S 0.0 0.0 4:30.10 `- dbus-daemon </span><br><span class="line"> 1267 root 20 0 110380 4200 3212 S 0.0 0.0 0:00.26 `- sshd </span><br><span class="line"> 59370 root 20 0 159168 6240 4868 S 0.0 0.0 0:00.45 `- sshd </span><br><span class="line"> 59372 root 20 0 116720 3376 1812 S 0.0 0.0 0:00.05 `- bash </span><br><span class="line">110500 root 20 0 163276 3316 1584 R 1.0 0.0 0:00.16 `- top</span><br></pre></td></tr></table></figure><h3 id="xy"><a class="markdownIt-Anchor" href="#xy"></a> x/y</h3><p>高亮当前任务所在行列,开启彩色输出后会更明显。<br />![高亮后的效果]](/images/Snipaste_2021-01-25_16-12-57.png)</p><h3 id="u"><a class="markdownIt-Anchor" href="#u"></a> u</h3><p>特定用户进程显示,输入用户名后只显示该用户进程,空白则显示全部用户。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">top - 16:14:37 up 103 days, 3:07, 1 user, load average: 0.25, 0.21, 0.16</span><br><span class="line">Tasks: 1068 total, 1 running, 1067 sleeping, 0 stopped, 0 zombie</span><br><span class="line"><span class="meta prompt_">%</span><span class="language-bash">Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.8 <span class="built_in">id</span>, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st</span></span><br><span class="line">KiB Mem : 65420768 total, 27627364 free, 4133004 used, 33660400 buff/cache</span><br><span class="line">KiB Swap: 16777212 total, 16777212 free, 0 used. 60329688 avail Mem </span><br><span class="line">Which user (blank for all) root</span><br><span class="line"> PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND </span><br><span class="line"> 1 root 20 0 191164 4068 2464 S 0.0 0.0 16:18.36 systemd </span><br><span class="line"> 671 root 20 0 39576 9024 8540 S 0.0 0.0 0:21.76 `- systemd-journal </span><br><span class="line"> 692 root 20 0 129176 1312 964 S 0.0 0.0 0:00.00 `- lvmetad </span><br><span class="line"> 968 root 20 0 22076 1708 1004 S 0.0 0.0 40:03.20 `- irqbalance </span><br><span class="line"> 971 root 20 0 53452 3168 2296 S 0.0 0.0 0:00.37 `- smartd </span><br><span class="line"> 972 root 20 0 6520 648 532 S 0.0 0.0 13:03.23 `- rngd </span><br><span class="line"> 980 root 20 0 224476 6156 4300 S 0.0 0.0 0:56.00 `- abrtd </span><br><span class="line"> 987 root 20 0 221876 4964 3536 S 0.0 0.0 0:00.10 `- abrt-watch-log </span><br><span class="line"> 1267 root 20 0 110380 4200 3212 S 0.0 0.0 0:00.26 `- sshd </span><br><span class="line"> 59370 root 20 0 159168 6240 4868 S 0.0 0.0 0:00.52 `- sshd </span><br><span class="line"> 59372 root 20 0 116720 3376 1812 S 0.0 0.0 0:00.05 `- bash </span><br><span class="line">112478 root 20 0 163196 3432 1640 R 0.4 0.0 0:03.13 `- top </span><br><span class="line"> 1348 root 20 0 24264 1596 1328 S 0.0 0.0 1:26.09 `- systemd-logind </span><br><span class="line"> 1418 root 20 0 126412 1660 984 S 0.0 0.0 0:56.25 `- crond </span><br><span class="line"> 1427 root 20 0 25904 944 744 S 0.0 0.0 0:00.03 `- atd </span><br><span class="line"> 1961 root 20 0 110192 852 720 S 0.0 0.0 0:00.00 `- agetty </span><br><span class="line"> 1964 root 20 0 110192 844 712 S 0.0 0.0 0:00.00 `- agetty </span><br><span class="line">151369 root 20 0 43944 1860 1348 S 0.0 0.0 0:00.05 `- systemd-udevd </span><br><span class="line">213155 root 20 0 228352 11212 6492 S 0.0 0.0 60:09.78 `- snmpd </span><br><span class="line"> 54620 root 20 0 1067624 570564 3268 S 0.0 0.9 51:44.38 `- python3 </span><br><span class="line">150137 root 20 0 289656 19268 4748 S 0.0 0.0 0:00.12 `- salt-minion </span><br><span class="line">150146 root 20 0 856720 39908 6080 S 0.1 0.1 112:59.09 `- salt-minion </span><br><span class="line">150150 root 20 0 403088 18752 796 S 0.0 0.0 0:00.00 `- salt-minion</span><br></pre></td></tr></table></figure><h3 id="z"><a class="markdownIt-Anchor" href="#z"></a> Z</h3><p>可为不同的任务区改变配色/粗体等设置。</p><h3 id="z-2"><a class="markdownIt-Anchor" href="#z-2"></a> z</h3><p>切换彩色/单色输出。</p><h3 id="n"><a class="markdownIt-Anchor" href="#n"></a> n/#</h3><p>设置最大显示任务数量。</p><h2 id="命令行"><a class="markdownIt-Anchor" href="#命令行"></a> 命令行</h2><h3 id="-b"><a class="markdownIt-Anchor" href="#-b"></a> -b</h3><p>批处理模式启动top。</p><h3 id="-c"><a class="markdownIt-Anchor" href="#-c"></a> -c</h3><p>这个选项会以上次记住的程序/命令显示的状态显示(是否显示完整路径)。</p><h3 id="-d"><a class="markdownIt-Anchor" href="#-d"></a> -d</h3><p>时间间隔,后面带整数,以秒计算。</p><h3 id="-i"><a class="markdownIt-Anchor" href="#-i"></a> -i</h3><p>显示空闲进程。</p><h3 id="-n"><a class="markdownIt-Anchor" href="#-n"></a> -n</h3><p>刷新次数,带整数,输入10则刷新10次后自动退出。</p><h3 id="-p"><a class="markdownIt-Anchor" href="#-p"></a> -p</h3><p>监控特定PID。</p><h3 id="-u-u"><a class="markdownIt-Anchor" href="#-u-u"></a> -u/-U</h3><p>监控特定用户/UID。</p>]]></content>
<summary type="html"><p>Linux中的top命令显示系统上正在运行的进程。它是系统管理员最重要的工具之一。被广泛用于监视服务器的负载和进程。<br />
(各个发行版的top可能会有出入,请参照对应系统的–help和man,以下展示均在centos7.4上完成。)</p></summary>
<category term="experience" scheme="https://laplacence.github.io/categories/experience/"/>
<category term="Linux" scheme="https://laplacence.github.io/categories/Linux/"/>
</entry>
<entry>
<title>cisco NXOS 终端技巧</title>
<link href="https://laplacence.github.io/2020/11/03/cisco_nxos_tips_and_tricks/"/>
<id>https://laplacence.github.io/2020/11/03/cisco_nxos_tips_and_tricks/</id>
<published>2020-11-02T16:00:00.000Z</published>
<updated>2020-11-05T07:37:36.000Z</updated>
<content type="html"><![CDATA[<p>下面展示了一些可以增强NX-OS故障排查经验的技巧。</p><span id="more"></span><h2 id="十六进制十进制转换"><a class="markdownIt-Anchor" href="#十六进制十进制转换"></a> 十六进制/十进制转换</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">hex 100</span></span><br><span class="line">0x64</span><br><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">dec 0x64</span></span><br><span class="line">100</span><br></pre></td></tr></table></figure><p>注:hex 和 dec 均为隐藏命令。</p><h2 id="一次执行多个命令"><a class="markdownIt-Anchor" href="#一次执行多个命令"></a> 一次执行多个命令</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">show clock ; show switchname ; show ip int brie</span></span><br><span class="line">09:00:00.642 CST Wed Nov 01 2020</span><br><span class="line">Nexus</span><br><span class="line">IP Interface Status for VRF "default"(1)</span><br><span class="line">Interface IP Address Interface Status</span><br><span class="line"><span class="meta prompt_">Nexus#</span></span><br></pre></td></tr></table></figure><p>注:命令可简写/后续命令无法Tab或?</p><h2 id="配置命令"><a class="markdownIt-Anchor" href="#配置命令"></a> 配置命令</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">conf t ; hostname NXOSSW ; end</span></span><br><span class="line">Enter configuration commands, one per line. End with CNTL/Z.</span><br><span class="line"><span class="meta prompt_">NXOSSW#</span></span><br></pre></td></tr></table></figure><h2 id="查看命令执行时间"><a class="markdownIt-Anchor" href="#查看命令执行时间"></a> 查看命令执行时间</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">show clock ; show run | ex .* ; show clock</span></span><br><span class="line">11:15:24.510 CST Wed Nov 01 2020</span><br><span class="line">11:15:24.576 CST Wed Nov 01 2020</span><br><span class="line"><span class="meta prompt_">Nexus#</span></span><br></pre></td></tr></table></figure><h2 id="tech-support文件输出"><a class="markdownIt-Anchor" href="#tech-support文件输出"></a> tech-support文件输出</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">tac-pac</span></span><br><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash"><span class="built_in">dir</span> volatile:</span></span><br><span class="line"> 0 Jan 01 08:02:16 2001 nginx_logflag</span><br><span class="line"> 926120 Nov 01 16:49:56 2020 show_tech_out.gz</span><br><span class="line"></span><br><span class="line">Usage for volatile://sup-local</span><br><span class="line"> 937984 bytes used</span><br><span class="line">103919616 bytes free</span><br><span class="line">104857600 bytes total</span><br><span class="line"><span class="meta prompt_">Nexus#</span><span class="language-bash"></span></span><br><span class="line"><span class="language-bash">Nexus<span class="comment"># tac-pac bootflash:</span></span></span><br><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash"><span class="built_in">dir</span> bootflash: | i show_tech_out</span></span><br><span class="line"> 926120 Nov 01 17:36:36 2020 show_tech_out.gz</span><br><span class="line"><span class="meta prompt_">Nexus#</span><span class="language-bash"></span></span><br><span class="line"><span class="language-bash">Nexus<span class="comment"># tac-pac bootflash:20191106-show-tech.gz</span></span></span><br><span class="line"><span class="meta prompt_">Nexus#</span></span><br></pre></td></tr></table></figure><p>注:使用传统 show tech-support 方式获取该文件有时会非常大而且需要非常长的时间去生成,并且会弹到终端内刷新页面。<br />nexus设备可以使用tac-pac命令替代,输入命令回车后等待一段时间后,自动生成show_tech_out.gz文件,默认保存在volatile:中。<br />推荐使用tac-pac bootflash:,保存在bootflash:里,之后可以通过FTP等方式导出。</p><h2 id="使用cli变量"><a class="markdownIt-Anchor" href="#使用cli变量"></a> 使用CLI变量</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">show cli variables</span></span><br><span class="line">VSH Variable List (* = session vars)</span><br><span class="line">-----------------</span><br><span class="line">SWITCHNAME="Nexus"</span><br><span class="line">TIMESTAMP="2020-11-01-15.09.50"</span><br><span class="line"><span class="meta prompt_">Nexus#</span><span class="language-bash"></span></span><br><span class="line"><span class="language-bash">Nexus<span class="comment"># tac-pac bootflash:$(SWITCHNAME)-$(TIMESTAMP)-show-tech-out.gz</span></span></span><br><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash"><span class="built_in">dir</span> bootflash: | i show-tech-out</span></span><br><span class="line"> 926120 Nov 02 08:56:36 2020 Nexus-2020-11-01-15.14.15-show-tech-out.gz</span><br></pre></td></tr></table></figure><h2 id="使用cli-alias"><a class="markdownIt-Anchor" href="#使用cli-alias"></a> 使用cli alias</h2><h3 id="默认配置"><a class="markdownIt-Anchor" href="#默认配置"></a> 默认配置</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash"><span class="built_in">alias</span></span></span><br><span class="line">CLI alias commands</span><br><span class="line">==================</span><br><span class="line">alias :show cli alias</span><br><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">show cli <span class="built_in">alias</span></span></span><br><span class="line">CLI alias commands</span><br><span class="line">==================</span><br><span class="line">alias :show cli alias</span><br><span class="line"><span class="meta prompt_">Nexus#</span></span><br></pre></td></tr></table></figure><h3 id="全局配置"><a class="markdownIt-Anchor" href="#全局配置"></a> 全局配置</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">Nexus(config)# </span><span class="language-bash">cli <span class="built_in">alias</span> name shiib show ip int brief</span></span><br><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">shiib</span></span><br><span class="line">IP Interface Status for VRF "default"(1)</span><br><span class="line">Interface IP Address Interface Status</span><br><span class="line">Vlan100 1.1.1.1 protocol-up/link-up/admin-up</span><br><span class="line"><span class="meta prompt_">Nexus#</span><span class="language-bash"></span></span><br><span class="line"><span class="language-bash">Nexus<span class="comment"># show cli alias</span></span></span><br><span class="line">CLI alias commands</span><br><span class="line">==================</span><br><span class="line">alias :show cli alias</span><br><span class="line">shiib :show ip int brief</span><br><span class="line"><span class="meta prompt_">Nexus#</span></span><br></pre></td></tr></table></figure><h3 id="基于终端会话临时配置"><a class="markdownIt-Anchor" href="#基于终端会话临时配置"></a> 基于终端会话临时配置</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">terminal <span class="built_in">alias</span> shiib show ip int brief</span></span><br><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">shiib</span></span><br><span class="line">IP Interface Status for VRF "default"(1)</span><br><span class="line">Interface IP Address Interface Status</span><br><span class="line">Vlan100 1.1.1.1 protocol-up/link-up/admin-up</span><br><span class="line"><span class="meta prompt_">Nexus#</span></span><br></pre></td></tr></table></figure><h3 id="使用cli-alias-一次性执行多个命令"><a class="markdownIt-Anchor" href="#使用cli-alias-一次性执行多个命令"></a> 使用cli alias & 一次性执行多个命令</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">terminal <span class="built_in">alias</span> shall show clock ; show switchname ; show ip int brief</span></span><br><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">shall</span></span><br><span class="line">15:25:33.097 UTC Thu Nov 05 2020</span><br><span class="line">Time source is NTP</span><br><span class="line">Nexus</span><br><span class="line"></span><br><span class="line">IP Interface Status for VRF "default"(1)</span><br><span class="line">Interface IP Address Interface Status</span><br><span class="line"><span class="meta prompt_">Nexus#</span></span><br></pre></td></tr></table></figure><p>注:全局或会话alias,show 或 config命令都可以组合尝试。</p><h2 id="定制终端设置"><a class="markdownIt-Anchor" href="#定制终端设置"></a> 定制终端设置</h2><h3 id="终端会话超时"><a class="markdownIt-Anchor" href="#终端会话超时"></a> 终端会话超时</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">show terminal | <span class="keyword">in</span> Timeout</span></span><br><span class="line">Session Timeout: 30 minutes</span><br><span class="line"><span class="meta prompt_">Nexus#</span><span class="language-bash"></span></span><br><span class="line"><span class="language-bash">Nexus<span class="comment"># terminal session-timeout ?</span></span></span><br><span class="line"><0-525600> Enter timeout in minutes, 0 to disable</span><br><span class="line"></span><br><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">terminal session-timeout 0</span></span><br><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">show terminal | <span class="keyword">in</span> Timeout</span></span><br><span class="line">Session Timeout: 0 minutes</span><br></pre></td></tr></table></figure><h3 id="显示终端的宽度长度"><a class="markdownIt-Anchor" href="#显示终端的宽度长度"></a> 显示终端的宽度长度</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">show terminal | <span class="keyword">in</span> Length</span></span><br><span class="line">Length: 43 lines, Width: 152 columns</span><br><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">terminal length 35</span></span><br><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">show terminal | <span class="keyword">in</span> Length</span></span><br><span class="line">Length: 35 lines, Width: 152 columns</span><br><span class="line"><span class="meta prompt_">Nexus#</span></span><br></pre></td></tr></table></figure><h3 id="延迟命令执行"><a class="markdownIt-Anchor" href="#延迟命令执行"></a> 延迟命令执行</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">show clock ; <span class="built_in">sleep</span> 2 ; show clock</span></span><br><span class="line">15:30:36.009 UTC Thu Nov 05 2020</span><br><span class="line">Time source is NTP</span><br><span class="line">15:30:38.022 UTC Thu Nov 05 2020</span><br><span class="line">Time source is NTP</span><br><span class="line"><span class="meta prompt_">Nexus#</span></span><br></pre></td></tr></table></figure><h2 id="查看其他vrf的路由"><a class="markdownIt-Anchor" href="#查看其他vrf的路由"></a> 查看其他vrf的路由</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">routing-context vrf management</span></span><br><span class="line"><span class="meta prompt_">Nexus%</span><span class="language-bash">management<span class="comment"># sh ip route</span></span></span><br><span class="line">IP Route Table for VRF "management"</span><br><span class="line">'*' denotes best ucast next-hop</span><br><span class="line">'**' denotes best mcast next-hop</span><br><span class="line">'[x/y]' denotes [preference/metric]</span><br><span class="line">'%<string>' in via output denotes VRF <string></span><br><span class="line"></span><br><span class="line">0.0.0.0/0, ubest/mbest: 1/0</span><br><span class="line"> *via 11.1.1.1, [1/0], 6w5d, static</span><br><span class="line">11.1.1.0/24, ubest/mbest: 1/0, attached</span><br><span class="line"> *via 11.1.1.2, mgmt0, [0/0], 6w6d, direct</span><br><span class="line">11.1.1.2/32, ubest/mbest: 1/0, attached</span><br><span class="line"> *via 11.1.1.2, mgmt0, [0/0], 6w6d, local</span><br><span class="line"><span class="meta prompt_">Nexus%</span><span class="language-bash">management<span class="comment"># routing-context vrf default</span></span></span><br><span class="line"><span class="meta prompt_">Nexus# </span><span class="language-bash">sh ip route</span></span><br><span class="line">IP Route Table for VRF "default"</span><br><span class="line">'*' denotes best ucast next-hop</span><br><span class="line">'**' denotes best mcast next-hop</span><br><span class="line">'[x/y]' denotes [preference/metric]</span><br><span class="line">'%<string>' in via output denotes VRF <string></span><br><span class="line"></span><br><span class="line">0.0.0.0/0, ubest/mbest: 1/0</span><br><span class="line"> *via 10.1.1.1, [1/0], 6w5d, static</span><br><span class="line">10.1.1.0/24, ubest/mbest: 1/0, attached</span><br><span class="line"> *via 10.1.1.2, Vlan1, [0/0], 6w5d, direct</span><br><span class="line">10.1.1.2/32, ubest/mbest: 1/0, attached</span><br><span class="line"> *via 10.1.1.2, Vlan1, [0/0], 6w5d, local</span><br><span class="line"><span class="meta prompt_">Nexus#</span></span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><p>下面展示了一些可以增强NX-OS故障排查经验的技巧。</p></summary>
<category term="experience" scheme="https://laplacence.github.io/categories/experience/"/>
<category term="network" scheme="https://laplacence.github.io/categories/network/"/>
</entry>
<entry>
<title>cisco NXOS 大版本升级导致的故障</title>
<link href="https://laplacence.github.io/2020/10/20/cisco_nxos_update_error/"/>
<id>https://laplacence.github.io/2020/10/20/cisco_nxos_update_error/</id>
<published>2020-10-19T16:00:00.000Z</published>
<updated>2020-11-05T07:37:36.000Z</updated>
<content type="html"><![CDATA[<p>前不久升级一台比较老旧的Nexus3000 Series,结果就碰到了这个问题。</p><span id="more"></span><h2 id="升级过程"><a class="markdownIt-Anchor" href="#升级过程"></a> 升级过程</h2><p>这个没什么好说的,就是一系列的常规操作。</p><p>轮流升级,先备后主。<br />确认bootflash大小,备份旧版本bin和kickstart,license。<br />通过厂商给的过渡版本和kickstart文件,以及最新版本的文件。核对md5后上传至交换机。<br />这一步发现新版本的NXOS直接上传会无法直接升级,需要升级到过渡版本后出现新命令compact,通过该命令上传文件至交换机。<br />install过渡版本6,安装前会确认与现网配置是否会冲突和破坏。<br />升级完毕后返回终端,提示10s后重启。<br />重启确认version无误,继续升级新版本7。<br />install过渡版本,安装前会确认与现网配置是否会冲突和破坏。<br />升级完毕后返回终端,提示10s后重启。</p><h2 id="结果"><a class="markdownIt-Anchor" href="#结果"></a> 结果</h2><p>环境是主备两台Nexus3000,做了vpc,没有注意到这点。导致备机升级到新版本7后,版本跨度过大导致主机的vpc产生了未定义的错误,使得主机所有端口errdisable和suspend by vpc,端口都掉了。<br />解决办法是紧急下线主机,备机先单台撑住,把peer-link端口关闭。隔离升级主机版本。<br />升级完后打开端口,好了……</p><h2 id="回溯"><a class="markdownIt-Anchor" href="#回溯"></a> 回溯</h2><p>其实这个问题在cisco的官方guide里面有说明,不支持跨版本的vpc。然而当时厂商给的升级方案也没有注意到这点,结果就崩了……<br />其次没有做下线隔离,因为之前都是让厂商来做。为什么这次没让厂商来做,因为这两台设备已经接近EOL了所以没有续保……</p>]]></content>
<summary type="html"><p>前不久升级一台比较老旧的Nexus3000 Series,结果就碰到了这个问题。</p></summary>
<category term="experience" scheme="https://laplacence.github.io/categories/experience/"/>
<category term="network" scheme="https://laplacence.github.io/categories/network/"/>
</entry>
<entry>
<title>用ss来代替netstat</title>
<link href="https://laplacence.github.io/2020/10/01/using_ss_instead_of_netstat/"/>
<id>https://laplacence.github.io/2020/10/01/using_ss_instead_of_netstat/</id>
<published>2020-09-30T16:00:00.000Z</published>
<updated>2020-09-30T12:34:29.308Z</updated>
<content type="html"><![CDATA[<p>ss是Socket Statistics的缩写。<br />顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。</p><span id="more"></span><h2 id="为什么要替代"><a class="markdownIt-Anchor" href="#为什么要替代"></a> 为什么要替代</h2><p>当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。可能你不会有切身的感受,但请相信我,当服务器维持的连接达到上万个的时候,使用netstat等于浪费生命,而用ss才是节省时间。</p><p>ss快的原因,在于用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux内核中第一手的信息,这就确保了ss的快捷高效。当然,如果你的系统中没有tcp_diag,ss也可以正常运行,只是效率会变得稍慢。(但仍然比netstat要快。)</p><p>为了加速让你去用ss,下面给了一些具体数据。当服务器维持9万个socket连接,Admin需要计算具体的连接数量时,不同情况的耗时如下:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">netstat -at | <span class="built_in">wc</span></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">55.73s</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">ss -atr | <span class="built_in">wc</span></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">16.33s</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">ss -atr | <span class="built_in">wc</span></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">1.27s (use tcp_diag)</span></span><br></pre></td></tr></table></figure><p>几乎所有的Linux系统都会默认包含netstat命令,但并非所有系统都会默认包含ss命令。</p><p>因为netstat命令是net-tools工具集中的一员:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">rpm -q net-tools</span></span><br><span class="line">net-tools-1.60-114.el6.x86_64</span><br></pre></td></tr></table></figure><p>而ss命令是iproute工具集中的一员:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">rpm -q iproute</span></span><br><span class="line">iproute-2.6.32-54.el6.x86_64</span><br></pre></td></tr></table></figure><p>如果你无法使用ss命令,那么可能是缺少了iproute,需要安装一下:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">yum install iproute iproute-doc</span></span><br></pre></td></tr></table></figure><p>net-tools是一套标准的Unix网络工具,用于配置网络接口、设置路由表信息、管理ARP表、显示和统计各类网络信息等等,但是遗憾的是,这个工具自2001年起便不再更新和维护了。</p><p>接替net-tools任务的便是iproute,这是一套可以支持IPv4/IPv6网络的用于管理TCP/UDP/IP网络的工具集,这套工具由Stephen Hemminger负责维护和升级,目前的大版本号是2。</p><p>从某种意义上说,iproute工具集几乎可以替代掉net-tools工具集,具体的替代方案是这样的:</p><table><thead><tr><th>用途</th><th>net-tool</th><th>iproute2</th></tr></thead><tbody><tr><td>地址和链路配置</td><td>ifconfig</td><td>ip addr/ip link</td></tr><tr><td>路由表</td><td>route</td><td>ip route</td></tr><tr><td>邻居</td><td>arp</td><td>ip neigh</td></tr><tr><td>VLAN</td><td>vconfig</td><td>ip link</td></tr><tr><td>隧道</td><td>iptunnel</td><td>ip tunnel</td></tr><tr><td>组播</td><td>ipmaddr</td><td>ip maddr</td></tr><tr><td>统计</td><td>netstat</td><td>ss</td></tr></tbody></table><h2 id="版本和帮助"><a class="markdownIt-Anchor" href="#版本和帮助"></a> 版本和帮助</h2><p>想获得ss命令的帮助信息和版本信息,都非常简单,随便敲都能猜到。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">ss -h</span></span><br><span class="line">Usage: ss [ OPTIONS ]</span><br><span class="line"> ss [ OPTIONS ] [ FILTER ]</span><br><span class="line"> -h, --help this message</span><br><span class="line"> -V, --version output version information</span><br><span class="line"> -n, --numeric don't resolve service names</span><br><span class="line"> -r, --resolve resolve host names</span><br><span class="line"> -a, --all display all sockets</span><br><span class="line"> -l, --listening display listening sockets</span><br><span class="line"> -o, --options show timer information</span><br><span class="line"> -e, --extended show detailed socket information</span><br><span class="line"> -m, --memory show socket memory usage</span><br><span class="line"> -p, --processes show process using socket</span><br><span class="line"> -i, --info show internal TCP information</span><br><span class="line"> -s, --summary show socket usage summary</span><br><span class="line"></span><br><span class="line"> -4, --ipv4 display only IP version 4 sockets</span><br><span class="line"> -6, --ipv6 display only IP version 6 sockets</span><br><span class="line"> -0, --packet display PACKET sockets</span><br><span class="line"> -t, --tcp display only TCP sockets</span><br><span class="line"> -u, --udp display only UDP sockets</span><br><span class="line"> -d, --dccp display only DCCP sockets</span><br><span class="line"> -w, --raw display only RAW sockets</span><br><span class="line"> -x, --unix display only Unix domain sockets</span><br><span class="line"> -f, --family=FAMILY display sockets of type FAMILY</span><br><span class="line"></span><br><span class="line"> -A, --query=QUERY, --socket=QUERY</span><br><span class="line"> QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]</span><br><span class="line"></span><br><span class="line"> -D, --diag=FILE Dump raw information about TCP sockets to FILE</span><br><span class="line"> -F, --filter=FILE read filter information from FILE</span><br><span class="line"> FILTER := [ state TCP-STATE ] [ EXPRESSION ]</span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">ss -V</span></span><br><span class="line">ss utility, iproute2-ss091226</span><br></pre></td></tr></table></figure><h2 id="ss选项统计"><a class="markdownIt-Anchor" href="#ss选项统计"></a> ss选项统计</h2><p>ss的选项既不多也不复杂,除去非功能性选项(-h/-V)外,ss共有22个选项。</p><p>实操一波来看看ss有多香。</p><h3 id="查看当前服务器的网络连接统计"><a class="markdownIt-Anchor" href="#查看当前服务器的网络连接统计"></a> 查看当前服务器的网络连接统计</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">ss -s</span></span><br><span class="line">Total: 307 (kernel 375)</span><br><span class="line">TCP: 108 (estab 99, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 68</span><br><span class="line"></span><br><span class="line">Transport Total IP IPv6</span><br><span class="line">* 375 - -</span><br><span class="line">RAW 0 0 0</span><br><span class="line">UDP 3 3 0</span><br><span class="line">TCP 108 108 0</span><br><span class="line">INET 111 111 0</span><br><span class="line">FRAG 0 0 0</span><br></pre></td></tr></table></figure><h3 id="查看所有监听中的网络端口"><a class="markdownIt-Anchor" href="#查看所有监听中的网络端口"></a> 查看所有监听中的网络端口</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">ss -l</span></span><br><span class="line">State Recv-Q Send-Q Local Address:Port Peer Address:Port</span><br><span class="line">LISTEN 0 512 192.168.195.19:16000 *:*</span><br><span class="line">LISTEN 0 128 *:10050 *:*</span><br><span class="line">LISTEN 0 512 127.0.0.1:16007 *:*</span><br><span class="line">LISTEN 0 512 192.168.195.19:16200 *:*</span><br><span class="line">LISTEN 0 512 127.0.0.1:16009 *:*</span><br><span class="line">LISTEN 0 512 192.168.195.19:16010 *:*</span><br><span class="line">LISTEN 0 512 192.168.195.19:16333 *:*</span><br><span class="line">LISTEN 0 128 *:ssh *:*</span><br></pre></td></tr></table></figure><p>如果使用-pl参数的话,则会列出具体的程序名称。你会在输出中看到类似于这样的内容:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">LISTEN 0 128 :::http :::* users:(("httpd",1188,4),("httpd",2151,4),("httpd",10213,4),("httpd",10214,4),("httpd",10215,4),("httpd",10216,4),("httpd",10217,4),("httpd",10218,4),("httpd",10219,4),("httpd",10220,4),("httpd",11724,4),("httpd",18632,4))</span><br></pre></td></tr></table></figure><p>从中可以知道,某个socket连接是属于httpd的,PID是1188/2151/10213等等。</p><h3 id="查看这台服务器上所有的socket连接"><a class="markdownIt-Anchor" href="#查看这台服务器上所有的socket连接"></a> 查看这台服务器上所有的socket连接</h3><p>很简单,直接使用-a选项即可列出所有网络连接。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">ss -a</span></span><br><span class="line">State Recv-Q Send-Q Local Address:Port Peer Address:Port</span><br><span class="line">……</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>可以配合使用tuwx等参数,例如只查看udp。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">ss -au</span></span><br><span class="line">State Recv-Q Send-Q Local Address:Port Peer Address:Port</span><br><span class="line">UNCONN 0 0 192.168.195.19:ntp *:*</span><br><span class="line">UNCONN 0 0 127.0.0.1:ntp *:*</span><br><span class="line">UNCONN 0 0 *:ntp *:*</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><p>ss是Socket Statistics的缩写。<br />
顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。</p></summary>
<category term="experience" scheme="https://laplacence.github.io/categories/experience/"/>
<category term="Linux" scheme="https://laplacence.github.io/categories/Linux/"/>
</entry>
<entry>
<title>curl,强大的调试开发工具。</title>
<link href="https://laplacence.github.io/2020/09/30/curl_simple_manual/"/>
<id>https://laplacence.github.io/2020/09/30/curl_simple_manual/</id>
<published>2020-09-29T16:00:00.000Z</published>
<updated>2020-09-30T13:05:40.459Z</updated>
<content type="html"><![CDATA[<p>curl,你好强大。<br />curl是一种命令行工具,作用是发出网络请求,然后得到和提取数据,显示在"标准输出"(stdout)上面。</p><span id="more"></span><h2 id="查看源码"><a class="markdownIt-Anchor" href="#查看源码"></a> 查看源码</h2><p>直接在curl命令后加上网址,就可以看到网页源码。这里就用我的博客首页来做示范,因为挺短的。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">curl laplacence.github.io</span></span><br><span class="line"><html></span><br><span class="line"><head><title>301 Moved Permanently</title></head></span><br><span class="line"><body></span><br><span class="line"><center><h1>301 Moved Permanently</h1></center></span><br><span class="line"><hr><center>nginx</center></span><br><span class="line"></body></span><br><span class="line"></html></span><br></pre></td></tr></table></figure><p>加上 -o 保存则是进行保存,同等与wget。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">curl -o <filename> laplacence.github.io</span></span><br><span class="line"><span class="meta prompt_"> % </span><span class="language-bash">Total % Received % Xferd Average Speed Time Time Time Current</span></span><br><span class="line"> Dload Upload Total Spent Left Speed</span><br><span class="line">100 162 100 162 0 0 2700 0 --:--:-- --:--:-- --:--:-- 2700</span><br></pre></td></tr></table></figure><h2 id="自动跳转"><a class="markdownIt-Anchor" href="#自动跳转"></a> 自动跳转</h2><p>有的网址是自动跳转的,比如我的首页。使用 -L 参数,curl就会跳转到新的网址。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">curl -L laplacence.github.io</span></span><br><span class="line"><!DOCTYPE html></span><br><span class="line"><html></span><br><span class="line"><head></span><br><span class="line"> <meta charset="utf-8"></span><br><span class="line"></span><br><span class="line"> <title>Trash Can</title></span><br><span class="line">MORE</span><br></pre></td></tr></table></figure><h2 id="显示header"><a class="markdownIt-Anchor" href="#显示header"></a> 显示header</h2><p>-i 可以显示response header的信息,-I 则只显示header。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">curl -i laplacence.github.io</span></span><br><span class="line">HTTP/1.1 301 Moved Permanently</span><br><span class="line">Server: GitHub.com</span><br><span class="line">Content-Type: text/html</span><br><span class="line">Location: https://laplacence.github.io/</span><br><span class="line">X-GitHub-Request-Id: 8096:4436:D7CE4:117F57:5F73E5A0</span><br><span class="line">Content-Length: 162</span><br><span class="line">Accept-Ranges: bytes</span><br><span class="line">Date: Wed, 30 Sep 2020 02:08:31 GMT</span><br><span class="line">Via: 1.1 varnish</span><br><span class="line">Age: 766</span><br><span class="line">Connection: keep-alive</span><br><span class="line">X-Served-By: cache-hkg17933-HKG</span><br><span class="line">X-Cache: HIT</span><br><span class="line">X-Cache-Hits: 1</span><br><span class="line">X-Timer: S1601431711.261853,VS0,VE1</span><br><span class="line">Vary: Accept-Encoding</span><br><span class="line">X-Fastly-Request-ID: 61661b909bca09baaec268b4e7f0a60b317e424f</span><br><span class="line"></span><br><span class="line"><html></span><br><span class="line"><head><title>301 Moved Permanently</title></head></span><br><span class="line"><body></span><br><span class="line"><center><h1>301 Moved Permanently</h1></center></span><br><span class="line"><hr><center>nginx</center></span><br><span class="line"></body></span><br><span class="line"></html></span><br></pre></td></tr></table></figure><h2 id="通信过程"><a class="markdownIt-Anchor" href="#通信过程"></a> 通信过程</h2><p>-v 可以显示完整的http通信过程。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">curl -v laplacence.github.io</span></span><br><span class="line">* Trying 185.199.109.153:80...</span><br><span class="line">* Connected to laplacence.github.io (185.199.109.153) port 80 (#0)</span><br><span class="line"><span class="meta prompt_">> </span><span class="language-bash">GET / HTTP/1.1</span></span><br><span class="line"><span class="meta prompt_">> </span><span class="language-bash">Host: laplacence.github.io</span></span><br><span class="line"><span class="meta prompt_">> </span><span class="language-bash">User-Agent: curl/7.72.0</span></span><br><span class="line"><span class="meta prompt_">> </span><span class="language-bash">Accept: */*</span></span><br><span class="line"><span class="meta prompt_">></span><span class="language-bash"></span></span><br><span class="line"><span class="language-bash">* Mark bundle as not supporting multiuse</span></span><br><span class="line">< HTTP/1.1 301 Moved Permanently</span><br><span class="line">< Server: GitHub.com</span><br><span class="line">< Content-Type: text/html</span><br><span class="line">< Location: https://laplacence.github.io/</span><br><span class="line">< X-GitHub-Request-Id: 8096:4436:D7CE4:117F57:5F73E5A0</span><br><span class="line">< Content-Length: 162</span><br><span class="line">< Accept-Ranges: bytes</span><br><span class="line">< Date: Wed, 30 Sep 2020 02:28:30 GMT</span><br><span class="line">< Via: 1.1 varnish</span><br><span class="line">< Age: 1965</span><br><span class="line">< Connection: keep-alive</span><br><span class="line">< X-Served-By: cache-hkg17926-HKG</span><br><span class="line">< X-Cache: HIT</span><br><span class="line">< X-Cache-Hits: 1</span><br><span class="line">< X-Timer: S1601432910.418005,VS0,VE1</span><br><span class="line">< Vary: Accept-Encoding</span><br><span class="line">< X-Fastly-Request-ID: 0dfc647792c349d178a666c0476557dbcee996d0</span><br><span class="line"><</span><br><span class="line"><html></span><br><span class="line"><head><title>301 Moved Permanently</title></head></span><br><span class="line"><body></span><br><span class="line"><center><h1>301 Moved Permanently</h1></center></span><br><span class="line"><hr><center>nginx</center></span><br><span class="line"></body></span><br><span class="line"></html></span><br><span class="line">* Connection #0 to host laplacence.github.io left intact</span><br></pre></td></tr></table></figure><h2 id="http方法"><a class="markdownIt-Anchor" href="#http方法"></a> HTTP方法</h2><p>curl默认使用GET,-X 后面可以指定其他方法。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">curl -X POST laplacence.github.io</span></span><br><span class="line"><html></span><br><span class="line"><head><title>405 Not Allowed</title></head></span><br><span class="line"><body bgcolor="white"></span><br><span class="line"><center><h1>405 Not Allowed</h1></center></span><br><span class="line"></body></span><br><span class="line"></html></span><br></pre></td></tr></table></figure><h2 id="上传文件"><a class="markdownIt-Anchor" href="#上传文件"></a> 上传文件</h2><p>假设网页的上传表单如下</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"> <span class="tag"><<span class="name">form</span> <span class="attr">method</span>=<span class="string">"POST"</span> <span class="attr">enctype</span>=<span class="string">'multipart/form-data'</span> <span class="attr">action</span>=<span class="string">"upload.cgi"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">file</span> <span class="attr">name</span>=<span class="string">upload</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">submit</span> <span class="attr">name</span>=<span class="string">press</span> <span class="attr">value</span>=<span class="string">"OK"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">form</span>></span></span><br></pre></td></tr></table></figure><p>则可以使用这种方法。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">curl --form upload=@<filename> --form press=OK [URL]</span></span><br><span class="line">......</span><br></pre></td></tr></table></figure><h2 id="uaheadercookie"><a class="markdownIt-Anchor" href="#uaheadercookie"></a> UA/header/cookie</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">curl --user-agent <span class="string">"UA"</span> [URL]</span></span><br><span class="line">......</span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">curl --cookie <span class="string">"cookie"</span> [URL]</span></span><br><span class="line">......</span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">curl --header <span class="string">"header"</span> [URL]</span></span><br><span class="line">......</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><p>curl,你好强大。<br />
curl是一种命令行工具,作用是发出网络请求,然后得到和提取数据,显示在&quot;标准输出&quot;(stdout)上面。</p></summary>
<category term="experience" scheme="https://laplacence.github.io/categories/experience/"/>
<category term="Linux" scheme="https://laplacence.github.io/categories/Linux/"/>
</entry>
<entry>
<title>WSL2的配置流程</title>
<link href="https://laplacence.github.io/2020/09/25/WSL2_usage/"/>
<id>https://laplacence.github.io/2020/09/25/WSL2_usage/</id>
<published>2020-09-24T16:00:00.000Z</published>
<updated>2021-06-06T07:14:25.238Z</updated>
<content type="html"><![CDATA[<p>最好的Linux发行版,WSL。<br />这句话需要加个2了————WSL2。</p><span id="more"></span><h2 id="首先"><a class="markdownIt-Anchor" href="#首先"></a> 首先</h2><p>你一定需要Windows Terminal,如果不使用它,就好比你的咖喱没有放咖喱粉,而只有各类香料。<br />安装只需要在微软商城store内搜索它即可下载。<br />然后你还要确认自己的version是高于1903的版本,否则装不了WSL2。<br />接着,你需要升级WSL2。</p><h2 id="wsl2安装"><a class="markdownIt-Anchor" href="#wsl2安装"></a> WSL2安装</h2><p>安装前,你需要启用WSL。<br />打开admin权限的powershell,输入</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">dism.exe /online /<span class="built_in">enable-feature</span> /featurename:Microsoft<span class="literal">-Windows-Subsystem-Linux</span> /all /norestart</span><br><span class="line">dism.exe /online /<span class="built_in">enable-feature</span> /featurename:VirtualMachinePlatform /all /norestart</span><br></pre></td></tr></table></figure><p>下载升级<a href="https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi">内核</a>,<a href="https://docs.microsoft.com/en-us/windows/wsl/install-win10">源地址</a>在这。<br />安装完成后,继续用powershell运行。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wsl <span class="literal">--set-default-version</span> <span class="number">2</span></span><br></pre></td></tr></table></figure><p>最后,去市场安装你需要的发行版,即可享用WSL2。</p><h2 id="wsl2的好处有哪些"><a class="markdownIt-Anchor" href="#wsl2的好处有哪些"></a> WSL2的好处有哪些</h2><p>目前来说,最好用的应该是网络文件夹,访问\\wsl$,选择对应的发行版即可访问WSL内所有文件。</p><h2 id="截图"><a class="markdownIt-Anchor" href="#截图"></a> 截图</h2><p><img src="/images/Snipaste_2020-09-25_22-17-15.png" alt="使用了zsh的kali WSL2" /></p>]]></content>
<summary type="html"><p>最好的Linux发行版,WSL。<br />
这句话需要加个2了————WSL2。</p></summary>
<category term="experience" scheme="https://laplacence.github.io/categories/experience/"/>
<category term="Linux" scheme="https://laplacence.github.io/categories/Linux/"/>
</entry>
<entry>
<title>dig是什么,怎么用?</title>
<link href="https://laplacence.github.io/2020/08/31/dig_simple_manual/"/>
<id>https://laplacence.github.io/2020/08/31/dig_simple_manual/</id>
<published>2020-08-30T16:00:00.000Z</published>
<updated>2020-09-30T13:02:00.907Z</updated>
<content type="html"><![CDATA[<p>dig是一个强大而灵活的工具,用于查询DNS服务器。深入了解它的工作原理以及它能告诉你什么。</p><span id="more"></span><p>相信大家对DNS的工作方式都有一定的了解,简而言之就是正确连接到互联网的机器都能通过DNS来查询到正确注册的服务器IP地址。</p><h2 id="dig"><a class="markdownIt-Anchor" href="#dig"></a> dig</h2><p>Linux系统上一般都默认安装了dig工具。尝试查询谷歌看看:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">dig www.google.com</span></span><br><span class="line"></span><br><span class="line">; <<>> DiG 9.16.4-Debian <<>> www.google.com #dig版本</span><br><span class="line">;; global options: +cmd</span><br><span class="line">;; Got answer:</span><br><span class="line">;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60573</span><br><span class="line">;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1</span><br><span class="line"></span><br><span class="line">;; OPT PSEUDOSECTION:</span><br><span class="line">; EDNS: version: 0, flags:; udp: 4000</span><br><span class="line">;; QUESTION SECTION: #查询的域名</span><br><span class="line">;www.google.com. IN A</span><br><span class="line"></span><br><span class="line">;; ANSWER SECTION: #结果</span><br><span class="line">www.google.com. 124 IN A 172.217.31.228</span><br><span class="line"></span><br><span class="line">;; Query time: 0 msec #耗时</span><br><span class="line">;; SERVER: 172.25.193.11#53(172.25.193.11) #查询的DNS服务器</span><br><span class="line">;; WHEN: Mon Aug 31 09:54:36 CST 2020 #查询时间</span><br><span class="line">;; MSG SIZE rcvd: 59 #字节数</span><br></pre></td></tr></table></figure><p>如果你得到了一个这样的应答,是好消息吗?是。你得到了及时的回复。状态字段(status: NOERROR)显示没有问题。你正在连接到一个能够提供所要求的信息的名称服务器,并得到一个回复,告诉你一些关于你所查询域名的重要细节。<br />简而言之,你已经验证了你的系统和DNS服务器相处得很好。<br />其他可能的状态指标包括:</p><ul><li>SERVFAIL:被查询的域名存在,但没有数据或现有数据无效。</li><li>NXDOMAIN:所查询的域名不存在。</li><li>REFUSED:该区域的数据不存在于所请求的权威服务器中,并且在这种情况下,基础设施没有设置为提供响应服务。</li></ul><p>接下来试试一个不存在的域名:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">dig wtfaboutthis.org</span></span><br><span class="line"></span><br><span class="line">; <<>> DiG 9.16.4-Debian <<>> wtfaboutthis.org</span><br><span class="line">;; global options: +cmd</span><br><span class="line">;; Got answer:</span><br><span class="line">;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 40814</span><br><span class="line">;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1</span><br><span class="line"></span><br><span class="line">;; OPT PSEUDOSECTION:</span><br><span class="line">; EDNS: version: 0, flags:; udp: 4000</span><br><span class="line">;; QUESTION SECTION:</span><br><span class="line">;wtfaboutthis.org. IN A</span><br><span class="line"></span><br><span class="line">;; AUTHORITY SECTION:</span><br><span class="line">org. 58 IN SOA a0.org.afilias-nst.info. noc.afilias-nst.info. 2014067959 1800 900 604800 86400</span><br><span class="line"></span><br><span class="line">;; Query time: 1636 msec</span><br><span class="line">;; SERVER: 172.25.193.11#53(172.25.193.11)</span><br><span class="line">;; WHEN: Mon Aug 31 10:04:48 CST 2020</span><br><span class="line">;; MSG SIZE rcvd: 108</span><br></pre></td></tr></table></figure><p>如果你使用ping,可能终端只会返回一句Ping request could not find host <a href="http://www.wtfaboutthis.org">www.wtfaboutthis.org</a>. 使用dig可以比ping获取到的信息更多。比起nslookup也更加详细,nslookup只返回一个状态,且与dig使用的系统库不同,nslookup使用了自己的一套库,某些协会也在呼吁人们停止使用nslookup,因为可能产生意外错误。</p><h2 id="dns记录类型和标志"><a class="markdownIt-Anchor" href="#dns记录类型和标志"></a> DNS记录类型和标志</h2><p>查询Google时,只有一条A记录,其实还有CNAME记录。CNAME(规范名称canonical name)就像一个别名,把一个域名指向另一个域名。你查询的大多数域名不会有CNAME记录,而只有A记录。如果你运行dig localhost命令,你会看到一个A记录,它就指向127.0.0.1。A记录用于将一个名字映射到一个IP地址。<br />DNS记录类型包括:</p><ul><li>A或AAAA:IPv4或IPv6地址</li><li>CNAME:别名</li><li>MX:邮件交换器</li><li>NS:名称服务器</li><li>PTR:一个反向条目,让你根据IP地址找到系统名称</li><li>SOA:表示授权记录开始</li><li>TXT 一些相关文本<br />我们还可以在上述输出的第五行看到一系列的flags。RFC1035中定义了DNS报文头中包含的标志,甚至显示了报文头的格式。</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"> 1 1 1 1 1 1</span><br><span class="line"> 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5</span><br><span class="line">+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br><span class="line">| ID |</span><br><span class="line">+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br><span class="line">|QR| Opcode |AA|TC|RD|RA| Z | RCODE |</span><br><span class="line">+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br><span class="line">| QDCOUNT |</span><br><span class="line">+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br><span class="line">| ANCOUNT |</span><br><span class="line">+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br><span class="line">| NSCOUNT |</span><br><span class="line">+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br><span class="line">| ARCOUNT |</span><br><span class="line">+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</span><br></pre></td></tr></table></figure><p>RFC中描述的标志包括:</p><ul><li>qr = 查询</li><li>rd = 进行递归查询</li><li>ra = 递归数据可用</li><li>aa = 权威答复</li><li>cd = 检查是否禁用</li><li>ad = 真实数据</li><li>opcode = 一个 4 位字段</li><li>tc = 截断</li><li>z(未使用)</li></ul><h2 id="dig进阶使用"><a class="markdownIt-Anchor" href="#dig进阶使用"></a> dig进阶使用</h2><p>如果你好奇dig命令执行查询时都经历了哪些过程,你可以尝试使用+trace选项。它会输出从根域到最终结果的所有信息:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">dig +trace github.io</span></span><br><span class="line"></span><br><span class="line">; <<>> DiG 9.16.4-Debian <<>> +trace github.io</span><br><span class="line">;; global options: +cmd</span><br><span class="line">. 6595 IN NS f.root-servers.net.</span><br><span class="line">. 6595 IN NS i.root-servers.net.</span><br><span class="line">. 6595 IN NS b.root-servers.net.</span><br><span class="line">. 6595 IN NS l.root-servers.net.</span><br><span class="line">. 6595 IN NS c.root-servers.net.</span><br><span class="line">. 6595 IN NS j.root-servers.net.</span><br><span class="line">. 6595 IN NS d.root-servers.net.</span><br><span class="line">. 6595 IN NS e.root-servers.net.</span><br><span class="line">. 6595 IN NS h.root-servers.net.</span><br><span class="line">. 6595 IN NS g.root-servers.net.</span><br><span class="line">. 6595 IN NS m.root-servers.net.</span><br><span class="line">. 6595 IN NS k.root-servers.net.</span><br><span class="line">. 6595 IN NS a.root-servers.net.</span><br><span class="line">;; Received 824 bytes from 172.25.193.11#53(172.25.193.11) in 0 ms</span><br><span class="line"></span><br><span class="line">github.io. 3247 IN A 185.199.108.153</span><br><span class="line">github.io. 3247 IN A 185.199.109.153</span><br><span class="line">github.io. 3247 IN A 185.199.110.153</span><br><span class="line">github.io. 3247 IN A 185.199.111.153</span><br><span class="line">;; Received 102 bytes from 198.97.190.53#53(h.root-servers.net) in 37 ms</span><br></pre></td></tr></table></figure><p>使用@符号指定服务器查询,这里我们使用经典4个8。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">dig @8.8.8.8 github.io</span></span><br><span class="line"></span><br><span class="line">; <<>> DiG 9.16.4-Debian <<>> @8.8.8.8 github.io</span><br><span class="line">; (1 server found)</span><br><span class="line">;; global options: +cmd</span><br><span class="line">;; Got answer:</span><br><span class="line">;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42235</span><br><span class="line">;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1</span><br><span class="line"></span><br><span class="line">;; OPT PSEUDOSECTION:</span><br><span class="line">; EDNS: version: 0, flags:; udp: 512</span><br><span class="line">;; QUESTION SECTION:</span><br><span class="line">;github.io. IN A</span><br><span class="line"></span><br><span class="line">;; ANSWER SECTION:</span><br><span class="line">github.io. 3470 IN A 185.199.108.153</span><br><span class="line">github.io. 3470 IN A 185.199.109.153</span><br><span class="line">github.io. 3470 IN A 185.199.110.153</span><br><span class="line">github.io. 3470 IN A 185.199.111.153</span><br><span class="line"></span><br><span class="line">;; Query time: 27 msec</span><br><span class="line">;; SERVER: 8.8.8.8#53(8.8.8.8)</span><br><span class="line">;; WHEN: Mon Aug 31 10:37:10 CST 2020</span><br><span class="line">;; MSG SIZE rcvd: 102</span><br></pre></td></tr></table></figure><p>接着使用-x参数,查看8.8.8.8的CNAME。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">dig -x 8.8.8.8</span></span><br><span class="line"></span><br><span class="line">; <<>> DiG 9.16.4-Debian <<>> -x 8.8.8.8</span><br><span class="line">;; global options: +cmd</span><br><span class="line">;; Got answer:</span><br><span class="line">;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24658</span><br><span class="line">;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1</span><br><span class="line"></span><br><span class="line">;; OPT PSEUDOSECTION:</span><br><span class="line">; EDNS: version: 0, flags:; udp: 4000</span><br><span class="line">;; QUESTION SECTION:</span><br><span class="line">;8.8.8.8.in-addr.arpa. IN PTR</span><br><span class="line"></span><br><span class="line">;; ANSWER SECTION:</span><br><span class="line">8.8.8.8.in-addr.arpa. 82326 IN PTR dns.google.</span><br><span class="line"></span><br><span class="line">;; Query time: 0 msec</span><br><span class="line">;; SERVER: 172.25.193.11#53(172.25.193.11)</span><br><span class="line">;; WHEN: Mon Aug 31 10:43:51 CST 2020</span><br><span class="line">;; MSG SIZE rcvd: 73</span><br></pre></td></tr></table></figure><p>在上面的结果中,IN前面的数字是TTL,DNS解析中相对重要的指标之一,表示了DNS记录在DNS服务器上的缓存时间。</p>]]></content>
<summary type="html"><p>dig是一个强大而灵活的工具,用于查询DNS服务器。深入了解它的工作原理以及它能告诉你什么。</p></summary>
<category term="experience" scheme="https://laplacence.github.io/categories/experience/"/>
<category term="Linux" scheme="https://laplacence.github.io/categories/Linux/"/>
</entry>
<entry>
<title>Python3的垃圾回收机制</title>
<link href="https://laplacence.github.io/2020/08/12/Python_GC/"/>
<id>https://laplacence.github.io/2020/08/12/Python_GC/</id>
<published>2020-08-11T16:00:00.000Z</published>
<updated>2020-09-30T13:09:08.356Z</updated>
<content type="html"><![CDATA[<p>这个大概是经常说的机制。</p><span id="more"></span><h2 id="引用计数机制"><a class="markdownIt-Anchor" href="#引用计数机制"></a> 引用计数机制</h2><p>Python默认采用的垃圾收集机制是『引用计数法 Reference Counting』,该算法最早由George E. Collins在1960的时候首次提出,直到今天,该算法依然被很多编程语言使用。<br />『引用计数法』的原理是:每个对象维护一个ob_ref字段,用来记录该对象当前被引用的次数,每当新的引用指向该对象时,它的引用计数ob_ref加1,每当该对象的引用失效时计数ob_ref减1,一旦对象的引用计数为0,该对象立即被回收,对象占用的内存空间将被释放。<br />它的缺点是需要额外的空间维护引用计数,这个问题是其次的,不过最主要的问题是它不能解决对象的“循环引用”,因此,也有很多语言比如Java并没有采用该算法做来垃圾的收集机制。<br />接下来我们看个例子。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">A</span>():</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="comment"># init</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'object id:%s'</span> % <span class="built_in">str</span>(<span class="built_in">hex</span>(<span class="built_in">id</span>(self))))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">f1</span>():</span><br><span class="line"> <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line"> c1 = A()</span><br><span class="line"> <span class="keyword">del</span> c1</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">func</span>(<span class="params">c</span>):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'obejct refcount is:'</span>, sys.getrefcount(c)) <span class="comment"># getrefcount()方法用于返回对象的引用计数</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> <span class="comment"># create object</span></span><br><span class="line"> a = A()</span><br><span class="line"> func(a)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># add reference b</span></span><br><span class="line"> b = a</span><br><span class="line"> func(a)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># destruct b</span></span><br><span class="line"> <span class="keyword">del</span> b</span><br><span class="line"> func(a)</span><br></pre></td></tr></table></figure><p>结果如下</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">object</span> <span class="built_in">id</span>:<span class="number">0x15a685eaf40</span></span><br><span class="line">obejct refcount <span class="keyword">is</span>: <span class="number">4</span></span><br><span class="line">obejct refcount <span class="keyword">is</span>: <span class="number">5</span></span><br><span class="line">obejct refcount <span class="keyword">is</span>: <span class="number">4</span></span><br></pre></td></tr></table></figure><h3 id="导致引用计数1的情况"><a class="markdownIt-Anchor" href="#导致引用计数1的情况"></a> 导致引用计数+1的情况</h3><ul><li>对象被创建,例如a=23</li><li>对象被引用,例如b=a</li><li>对象被作为参数,传入到一个函数中,例如func(a)</li><li>对象作为一个元素,存储在容器中,例如list1=[a,a]</li></ul><h3 id="导致引用计数-1的情况"><a class="markdownIt-Anchor" href="#导致引用计数-1的情况"></a> 导致引用计数-1的情况</h3><ul><li>对象的别名被显式销毁,例如del a</li><li>对象的别名被赋予新的对象,例如a=24</li><li>一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变量不会)</li><li>对象所在的容器被销毁,或从容器中删除对象</li></ul><h3 id="内存泄漏样例"><a class="markdownIt-Anchor" href="#内存泄漏样例"></a> 内存泄漏样例</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">f2</span>():</span><br><span class="line"> <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line"> c1 = A()</span><br><span class="line"> c2 = A()</span><br><span class="line"> c1.t = c2</span><br><span class="line"> c2.t = c1</span><br><span class="line"> <span class="keyword">del</span> c1</span><br><span class="line"> <span class="keyword">del</span> c2</span><br></pre></td></tr></table></figure><p>结果如下</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">object</span> <span class="built_in">id</span>:<span class="number">0x15ad4ca7610</span></span><br><span class="line"><span class="built_in">object</span> <span class="built_in">id</span>:<span class="number">0x15ad4ca65b0</span></span><br><span class="line"><span class="built_in">object</span> <span class="built_in">id</span>:<span class="number">0x15ad4ca6550</span></span><br><span class="line"><span class="built_in">object</span> <span class="built_in">id</span>:<span class="number">0x15ad4ca6370</span></span><br><span class="line"><span class="built_in">object</span> <span class="built_in">id</span>:<span class="number">0x15ad4ca6490</span></span><br><span class="line"><span class="built_in">object</span> <span class="built_in">id</span>:<span class="number">0x15ad4ca6430</span></span><br><span class="line"><span class="built_in">object</span> <span class="built_in">id</span>:<span class="number">0x15ad4ca66a0</span></span><br><span class="line"><span class="built_in">object</span> <span class="built_in">id</span>:<span class="number">0x15ad4ca6940</span></span><br><span class="line"><span class="built_in">object</span> <span class="built_in">id</span>:<span class="number">0x15ad4ca6eb0</span></span><br><span class="line"><span class="built_in">object</span> <span class="built_in">id</span>:<span class="number">0x15ad4ca6b50</span></span><br><span class="line"><span class="built_in">object</span> <span class="built_in">id</span>:<span class="number">0x15ad4ca6610</span></span><br><span class="line"><span class="built_in">object</span> <span class="built_in">id</span>:<span class="number">0x15ad4ca6220</span></span><br><span class="line">......</span><br></pre></td></tr></table></figure><p>创建c1、c2后,计数均为1,执行引用后都变成2,del执行后计数器都降为1,不为0的情况则导致c1、c2不会被销毁。加上while循环,结果就导致无限创建新的对象,新的对象又产生引用,统统无法收回的结果就是内存泄漏。</p><h2 id="分代回收"><a class="markdownIt-Anchor" href="#分代回收"></a> 分代回收</h2><p>分代回收是一种以空间换时间的操作方式,Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为了3“代”,分别为0、1、2代,他们对应的是3个链表,它们的垃圾收集频率与对象的存活时间的增大而减小。<br />新创建的对象都会分配在0代,0代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到1代去,依此类推,2代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。<br />同时,分代回收是建立在标记清除技术基础之上。分代回收同样作为Python的辅助垃圾收集技术处理那些容器对象。</p><h2 id="gc模块垃圾回收"><a class="markdownIt-Anchor" href="#gc模块垃圾回收"></a> gc模块垃圾回收</h2><p>有三种情况会触发gc模块垃圾回收:</p><ul><li>调用gc.collect()。</li><li>当gc模块的计数器达到阀值的时候。</li><li>程序退出的时候。</li></ul><p>gc模块提供一个接口给开发者设置垃圾回收的选项。上面说到,采用引用计数的方法管理内存的一个缺陷是循环引用,而gc模块的一个主要功能就是解决循环引用的问题。<br />下面是一些常用的函数。</p><table><thead><tr><th>函数</th><th>作用</th></tr></thead><tbody><tr><td>gc.enable()</td><td>开启自动垃圾收集</td></tr><tr><td>gc.disable()</td><td>禁用自动垃圾收集</td></tr><tr><td>gc.isenabled()</td><td>如果启用则返回true</td></tr><tr><td>gc.set_debug(flags)</td><td>设置gc的debug日志,一般设置为gc.DEBUG_LEAK</td></tr><tr><td>gc.collect([generation])</td><td>显式进行垃圾回收,可以输入参数,0代表只检查0代的对象,1代表检查0、1代的对象,2代表检查所有代的对象。如果不传参数,则默认传入2。返回不可达(unreachable objects)对象的数目。</td></tr><tr><td>gc.set_threshold(threshold0[, threshold1[, threshold2])</td><td>设置自动执行垃圾回收的频率。</td></tr><tr><td>gc.get_count()</td><td>获取当前自动执行垃圾回收的计数器,返回返回当前集合计数为元组(count0, count1, count2)。</td></tr></tbody></table><p>其他函数可以在官方文档内查看,接下来我们使用看看。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">f3</span>():</span><br><span class="line"> gc.enable()</span><br><span class="line"> gc.set_debug(gc.DEBUG_LEAK)</span><br><span class="line"> <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line"> c1 = A()</span><br><span class="line"> c2 = A()</span><br><span class="line"> c1.t = c2</span><br><span class="line"> c2.t = c1</span><br><span class="line"> <span class="keyword">del</span> c1</span><br><span class="line"> <span class="keyword">del</span> c2</span><br><span class="line"> <span class="comment"># import gc</span></span><br><span class="line"> <span class="built_in">print</span>(gc.garbage)</span><br><span class="line"> <span class="built_in">print</span>(gc.collect())</span><br><span class="line"> <span class="built_in">print</span>(gc.garbage)</span><br><span class="line"> time.sleep(<span class="number">10</span>)</span><br></pre></td></tr></table></figure><p>结果如下</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">gc: collectable <A <span class="number">0x00000222A733AF40</span>></span><br><span class="line">gc: collectable <A <span class="number">0x00000222A733AB50</span>></span><br><span class="line">gc: collectable <<span class="built_in">dict</span> <span class="number">0x00000222A72FFC00</span>></span><br><span class="line">gc: collectable <<span class="built_in">dict</span> <span class="number">0x00000222A730F340</span>></span><br><span class="line"><span class="built_in">object</span> <span class="built_in">id</span>:<span class="number">0x222a733af40</span></span><br><span class="line"><span class="built_in">object</span> <span class="built_in">id</span>:<span class="number">0x222a733ab50</span></span><br><span class="line">[]</span><br><span class="line"><span class="number">4</span></span><br><span class="line">[<__main__.A <span class="built_in">object</span> at <span class="number">0x00000222A733AF40</span>>, <__main__.A <span class="built_in">object</span> at <span class="number">0x00000222A733AB50</span>>, {<span class="string">'t'</span>: <__main__.A <span class="built_in">object</span> at <span class="number">0x00000222A733AB50</span>>}, {<span class="string">'t'</span>: <__main__.A <span class="built_in">object</span> at <span class="number">0x00000222A733AF40</span>>}]</span><br></pre></td></tr></table></figure><p>可以看到gc很快就捕捉到两个A和c1、c2,并判定为可回收的,执行回收之后,garbage列表内多了4个对象。<br />gc本身采用了分代收集的方法,把对象分为3代,一开始,对象在创建的时候,放在0代中,如果在一次0代的垃圾检查中,该对象存活下来,就会被放到1代中,同理在一次1代的垃圾检查中,该对象存活下来,就会被放到2代中。</p><p>用例如下</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">f4</span>():</span><br><span class="line"> <span class="built_in">print</span>(gc.get_count())</span><br><span class="line"> a = A()</span><br><span class="line"> <span class="built_in">print</span>(gc.get_count())</span><br><span class="line"> <span class="keyword">del</span> a</span><br><span class="line"> <span class="built_in">print</span>(gc.get_count())</span><br></pre></td></tr></table></figure><p>结果如下</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">(<span class="number">427</span>, <span class="number">9</span>, <span class="number">0</span>)</span><br><span class="line"><span class="built_in">object</span> <span class="built_in">id</span>:<span class="number">0x13fba46af40</span></span><br><span class="line">(<span class="number">428</span>, <span class="number">9</span>, <span class="number">0</span>)</span><br><span class="line">(<span class="number">427</span>, <span class="number">9</span>, <span class="number">0</span>)</span><br></pre></td></tr></table></figure><p>427指距离上一次0代垃圾检查,Python分配内存的数目减去释放内存的数目。<br />9指距离上一次0、1代垃圾检查的次数。<br />0是指距离上一次0、1、2代垃圾检查的次数。<br />配合阈值来看,一般默认阈值为(700, 10, 10),如果当其中任何一个数字达到阈值,则会对应代的执行垃圾回收,即gc.collect([generation]),并将计数器清零。</p><ul><li>当计数器从(699, 3, 0)增加到(700, 3, 0),gc模块就会执行gc.collect(0),并重置计数器为(0, 4, 0)</li><li>当计数器从(699, 9, 0)增加到(700, 9, 0),gc模块就会执行gc.collect(1),并重置计数器为(0, 0, 1)</li><li>当计数器从(699, 9 ,9)增加到(700, 9, 9),gc模块就会执行gc.collect(2),并重置计数器为(0, 0, 0)</li></ul><h2 id="标记-清除回收"><a class="markdownIt-Anchor" href="#标记-清除回收"></a> 标记-清除回收</h2><p>所谓标记-清除,就是先标记,再清除。标记的是活动对象,清除的是非活动对象。<br />首先,为了追踪容器对象的引用情况,每个容器对象需要维护两个额外的指针,指针分别指向前后两个容器对象,所有容器对象便组成了一个双向链表,或者,我们也可以将其视为一个有向图。其中,容器对象是有向图的节点,而引用关系是有向图的边。从根对象(root objects)出发,沿着有向边遍历对象,可达的(reachable)对象标记为活动对象,不可达的对象(unreachable objects)就是要被清除的非活动对象。<br />标记-清除作为Python的辅助垃圾收集技术主要处理的是一些容器对象,比如list、dict、tuple,instance等,因为对于字符串、数值对象是不可能造成循环引用问题。Python使用一个双向链表将这些容器对象组织起来。不过,这种简单粗暴的标记清除算法也有明显的缺点:清除非活动的对象前它必须顺序扫描整个堆内存,哪怕只剩下小部分活动对象也要扫描所有对象。</p>]]></content>
<summary type="html"><p>这个大概是经常说的机制。</p></summary>
<category term="experience" scheme="https://laplacence.github.io/categories/experience/"/>
<category term="Python" scheme="https://laplacence.github.io/categories/Python/"/>
</entry>
<entry>
<title>Python3打包成windows的exe可执行程序</title>
<link href="https://laplacence.github.io/2020/06/16/Python_to_exe/"/>
<id>https://laplacence.github.io/2020/06/16/Python_to_exe/</id>
<published>2020-06-15T16:00:00.000Z</published>
<updated>2020-09-30T13:09:41.049Z</updated>
<content type="html"><![CDATA[<p>首先,Python打包成exe就是个大坑。</p><span id="more"></span><p>最近在做一些小程序,想着分享给一些朋友用用,就想到了打包程序。结果不看不知道,一看原来这东西是个深渊。<br />使用的是Pyinstaller 3.6/Python 3.8.3环境进行的编译打包。<br />新版本的Pyinstaller虽然支持了Python3,但是依旧有遗留下来的问题。打包后程序运行后会提示未找到模块。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ModuleNotFoundError: No module named <span class="string">'pkg_resources.py2_warn'</span></span><br></pre></td></tr></table></figure><p>这个模块照着pkg_resources源码一搜发现,在它的<code>__init__.py</code>里面import了这个模块,而且这个模块本身的内容就是一个逻辑判断,看你是不是使用了Python2,如果是就报错。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> warnings</span><br><span class="line"><span class="keyword">import</span> textwrap</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">msg = textwrap.dedent(<span class="string">"""</span></span><br><span class="line"><span class="string"> Encountered a version of Setuptools that no longer supports</span></span><br><span class="line"><span class="string"> this version of Python. Please head to</span></span><br><span class="line"><span class="string"> https://bit.ly/setuptools-py2-sunset for support.</span></span><br><span class="line"><span class="string"> """</span>)</span><br><span class="line"></span><br><span class="line">pre = <span class="string">"Setuptools no longer works on Python 2\n"</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> sys.version_info < (<span class="number">3</span>,):</span><br><span class="line"> warnings.warn(pre + <span class="string">"*"</span> * <span class="number">60</span> + msg + <span class="string">"*"</span> * <span class="number">60</span>)</span><br><span class="line"> <span class="keyword">raise</span> SystemExit(<span class="number">32</span>)</span><br></pre></td></tr></table></figure><p>不知道是哪里的咖喱代码导致这个模块无法导入,总之其中一个解决方法就是直接在<code>__init__.py</code>里面注释掉py2_warn这个import。<br />另一个方法是在打包的根目录中找到.spec,里面的hiddenimports加上’pkg_resources.py2_warn’,即手动import模块,之后再对.spec进行打包操作即可。</p>]]></content>
<summary type="html"><p>首先,Python打包成exe就是个大坑。</p></summary>
<category term="experience" scheme="https://laplacence.github.io/categories/experience/"/>
<category term="Python" scheme="https://laplacence.github.io/categories/Python/"/>
</entry>
<entry>
<title>关于Fedora的一些配置(长期更新)</title>
<link href="https://laplacence.github.io/2020/05/21/Fedora_options/"/>
<id>https://laplacence.github.io/2020/05/21/Fedora_options/</id>
<published>2020-05-20T16:00:00.000Z</published>
<updated>2020-09-30T13:03:37.098Z</updated>
<content type="html"><![CDATA[<p>之所以写这个博客是因为经常自己Fedora重装(都是Windows的锅),写来备忘以下,下次安装可以直接看这个,顺便跟大家分享下自己的配置。<br />最近更新日期2020-05-21,版本为Fedora 32。</p><span id="more"></span><p><strong>Fedora 28 重大更新,使用GNOME3后,开发团队移除了桌面图标的相关代码。</strong></p><h2 id="桌面主题工具我比较喜欢的主题和图标文件夹右键打开终端"><a class="markdownIt-Anchor" href="#桌面主题工具我比较喜欢的主题和图标文件夹右键打开终端"></a> 桌面主题工具/我比较喜欢的主题和图标/文件夹右键打开终端</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">dnf install gnome-tweak-tool arc-theme numix-icon-theme-circle nautilus-open-terminal -y</span></span><br></pre></td></tr></table></figure><p>之后在开始可以找到tweaks的图标,里面有详细设置。<br />各种插件可以去gnome的插件官网下载chrome的管理器后下载安装各类插件。</p><h2 id="设置快捷键打开终端"><a class="markdownIt-Anchor" href="#设置快捷键打开终端"></a> 设置快捷键打开终端</h2><p>找到设置里面的keyboard,添加快捷键,名字随意,command用gnome-terminal。</p><h2 id="vim编辑器大全"><a class="markdownIt-Anchor" href="#vim编辑器大全"></a> vim编辑器大全</h2><p>配置文件 ~/.vimrc 里面写入</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line">"basic"</span><br><span class="line">set history=10000</span><br><span class="line">filetype off</span><br><span class="line">filetype indent on</span><br><span class="line">filetype plugin on</span><br><span class="line">filetype plugin indent on</span><br><span class="line">set backspace=eol,start,indent</span><br><span class="line">set nocompatible</span><br><span class="line">set autoread</span><br><span class="line">set shortmess=atI</span><br><span class="line">set nobackup</span><br><span class="line">set noswapfile</span><br><span class="line">set paste</span><br><span class="line">set mouse-=a</span><br><span class="line">set selection=exclusive</span><br><span class="line">set selectmode=mouse,key</span><br><span class="line">set noerrorbells</span><br><span class="line">set novisualbell</span><br><span class="line">set t_vb=</span><br><span class="line">set tm=500</span><br><span class="line"></span><br><span class="line">"show and format"</span><br><span class="line">set number</span><br><span class="line">set nowrap</span><br><span class="line">nmap <F2> :set nonumber!<CR></span><br><span class="line">set pastetoggle=<F11></span><br><span class="line">set showmatch</span><br><span class="line">set mat=2</span><br><span class="line">set nohlsearch</span><br><span class="line">set ignorecase</span><br><span class="line">set incsearch</span><br><span class="line">set smartcase</span><br><span class="line">set tabstop=4</span><br><span class="line">set shiftwidth=4</span><br><span class="line">set expandtab</span><br><span class="line">set softtabstop=4</span><br><span class="line">set autoindent</span><br><span class="line">set cindent</span><br><span class="line">set smartindent</span><br><span class="line"></span><br><span class="line">"status"</span><br><span class="line">set ruler</span><br><span class="line">set showcmd</span><br><span class="line">set so=7</span><br><span class="line"></span><br><span class="line">"color and fonts"</span><br><span class="line">syntax enable</span><br><span class="line">syntax on</span><br><span class="line">set t_Co=256</span><br><span class="line"></span><br><span class="line">"file encode"</span><br><span class="line">set encoding=utf-8</span><br><span class="line">set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1</span><br><span class="line">set ffs=unix,dos,mac</span><br><span class="line">set formatoptions+=m</span><br><span class="line">set formatoptions+=B</span><br><span class="line"></span><br><span class="line">"others"</span><br><span class="line">autocmd! bufwritepost .vimrc source %</span><br><span class="line">set wildmenu</span><br><span class="line">set wildignore=*.o,*~,*.pyc</span><br></pre></td></tr></table></figure><h2 id="安装visual-studio-code弃用emacs"><a class="markdownIt-Anchor" href="#安装visual-studio-code弃用emacs"></a> 安装Visual Studio Code(弃用emacs)</h2><p>官网下载对应的rpm包,双击文件/命令行安装完后所有程序即出现VSC。<br />到MarketPlace下载官方的Python拓展,内置了格式化/自动补全等功能,可在File->Preference->Settings内搜索到相应设置。<br />格式化快捷键:Ctrl+Shift+I</p><p>C<ins>配置与Windows下一致,同样下载官方的C/C</ins>拓展,生成.vscode文件夹,配置launch.json/task.json。<br />需要另外安装gcc-c++,Fedora并没有自带。</p><h2 id="dnf-repo修改源"><a class="markdownIt-Anchor" href="#dnf-repo修改源"></a> dnf repo修改源</h2><p>只需要更改/etc/dnf/dnf.conf里面的内容即可,在里面多加上一句。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">fastestmirror=true</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><p>之所以写这个博客是因为经常自己Fedora重装(都是Windows的锅),写来备忘以下,下次安装可以直接看这个,顺便跟大家分享下自己的配置。<br />
最近更新日期2020-05-21,版本为Fedora 32。</p></summary>
<category term="experience" scheme="https://laplacence.github.io/categories/experience/"/>
<category term="Fedora" scheme="https://laplacence.github.io/categories/Fedora/"/>
</entry>
<entry>
<title>selenium关于chromedriver的配置</title>
<link href="https://laplacence.github.io/2020/05/21/selenium_about_chromedriver/"/>
<id>https://laplacence.github.io/2020/05/21/selenium_about_chromedriver/</id>
<published>2020-05-20T16:00:00.000Z</published>
<updated>2020-09-30T13:10:04.425Z</updated>
<content type="html"><![CDATA[<p>selenium也算是一个比较低智常用的爬虫,可以使用Firefox/Chrome/IE。</p><span id="more"></span><p>以下是在Fedora 32碰到的问题。<br />目前Fedora 32已经内置了Python3.8,所以只需通过pip安装selenium即可。<br />chromedriver放入PATH中,或者在代码中指定配置路径。</p><p>chromedriver的版本要与已安装的chrome/chromium一致,否则会导致错误,如</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 81</span><br></pre></td></tr></table></figure><p>还有一种错误也是经常见到的</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">unknown error: DevToolsActivePort file doesn't exist</span><br></pre></td></tr></table></figure><p>这时候要在options内添加一些参数</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">options = ChromeOptions()</span><br><span class="line">options.add_argument(<span class="string">"--disable-dev-shm-usage"</span>)</span><br><span class="line">options.add_argument(<span class="string">"--no-sandbox"</span>)</span><br><span class="line">driver = Chrome(options=options)</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><p>selenium也算是一个比较低智常用的爬虫,可以使用Firefox/Chrome/IE。</p></summary>
<category term="Linux" scheme="https://laplacence.github.io/categories/Linux/"/>
<category term="Python" scheme="https://laplacence.github.io/categories/Python/"/>
</entry>
</feed>