Skip to content

Commit 145144e

Browse files
author
Maledong
authored
zh-CN: Sync changes for 'Diagnostics' (#4737)
Refs: #4734.
1 parent 08cc05e commit 145144e

File tree

4 files changed

+46
-51
lines changed

4 files changed

+46
-51
lines changed

locale/zh-cn/docs/guides/diagnostics/memory/index.md

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,10 @@ layout: docs.hbs
1111
* [内存溢出](#my-process-runs-out-of-memory)
1212
* [相关症状](#symptoms)
1313
* [副作用](#side-effects)
14-
* [Debugging](#debugging)
15-
* [My process utilizes memory inefficiently](#my-process-utilizes-memory-inefficiently)
16-
* [Symptoms](#symptoms-1)
17-
* [Side Effects](#side-effects-1)
18-
* [Debugging](#debugging-1)
14+
* [低效率内存使用](#my-process-utilizes-memory-inefficiently)
15+
* [相关症状](#symptoms-1)
16+
* [副作用](#side-effects-1)
17+
* [调试](#debugging)
1918

2019
## <!--my-process-runs-out-of-memory-->内存耗尽
2120

@@ -37,15 +36,6 @@ _(负载均衡返回 502)_。
3736
* 增长的内存交换(由 GC 活动引起)使得进程变慢。
3837
* 没有足够的内存空间来存储一个堆快照。
3938

40-
### <!--debugging-->调试
41-
42-
调试一个内存泄露的问题,我们需要看特定的对象占用了多少内存空间,以及什么变量占有了
43-
他们从而使得垃圾回收。为了使我们有效地调试,我们同时也需要了解变量随时间的分配模式。
44-
45-
* [使用堆剖析器](/en/docs/guides/diagnostics/memory/using-heap-profiler/)
46-
* [使用堆快照](/en/docs/guides/diagnostics/memory/using-heap-snapshot/)
47-
* [GC 跟踪](/en/docs/guides/diagnostics/memory/using-gc-traces)
48-
4939
## <!--my-process-utilizes-memory-inefficiently-->低效率内存使用
5040

5141
### <!--symptoms-1-->相关症状
@@ -57,11 +47,11 @@ _(负载均衡返回 502)_。
5747
* 分页错误数持续增长。
5848
* 较高的 GC 活动以及 CPU 使用率。
5949

60-
### <!--debugging-1-->调试
50+
## <!--debugging-->调试
6151

6252
调试一个内存泄露的问题,我们需要看特定的对象占用了多少内存空间,以及什么变量占有了
6353
他们从而使得垃圾回收。为了使我们有效地调试,我们同时也需要了解变量随时间的分配模式。
6454

65-
* [使用堆剖析器](/en/docs/guides/diagnostics/memory/using-heap-profiler/)
66-
* [使用堆快照](/en/docs/guides/diagnostics/memory/using-heap-snapshot/)
67-
* [GC 跟踪](/en/docs/guides/diagnostics/memory/using-gc-traces)
55+
* [使用堆剖析器](/zh-cn/docs/guides/diagnostics/memory/using-heap-profiler/)
56+
* [使用堆快照](/zh-cn/docs/guides/diagnostics/memory/using-heap-snapshot/)
57+
* [GC 跟踪](/zh-cn/docs/guides/diagnostics/memory/using-gc-traces)

locale/zh-cn/docs/guides/diagnostics/memory/using-gc-traces.md

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ setTimeout(() => { v8.setFlagsFromString('--notrace_gc'); }, 60e3);
3939
[23521:0x10268b000] 120 ms: Mark-sweep 100.7 (122.7) -> 100.6 (122.7) MB, 0.15 / 0.0 ms (average mu = 0.132, current mu = 0.137) deserialize GC in old space requested
4040
```
4141

42-
这里给出如何解析这些信息(以第二行数据举例)
42+
以上面第二行数据举例,这里给出如何解析这些信息:
4343

4444
<table>
4545
<tr>
@@ -48,7 +48,7 @@ setTimeout(() => { v8.setFlagsFromString('--notrace_gc'); }, 60e3);
4848
</tr>
4949
<tr>
5050
<td>23521</td>
51-
<td>正在运行的进程号</td>
51+
<td>正在运行的线程号</td>
5252
</tr>
5353
<tr>
5454
<td>0x10268db0</td>
@@ -64,25 +64,32 @@ setTimeout(() => { v8.setFlagsFromString('--notrace_gc'); }, 60e3);
6464
</tr>
6565
<tr>
6666
<td>100.7</td>
67-
<td>GC 运行前占有内存(MB)</td>
67+
<td>GC 运行前占有内存(MiB)</td>
6868
</tr>
6969
<tr>
7070
<td>122.7</td>
71-
<td>GC 运行前总占有内存(MB)</td>
71+
<td>GC 运行前总占有内存(MiB)</td>
7272
</tr>
7373
<tr>
7474
<td>100.6</td>
75-
<td>GC 运行后占有内存(MB)</td>
75+
<td>GC 运行后占有内存(MiB)</td>
7676
</tr>
7777
<tr>
7878
<td>122.7</td>
79-
<td>GC 运行后总占有内存(MB)</td>
79+
<td>GC 运行后总占有内存(MiB)</td>
8080
</tr>
8181
<tr>
82-
<td>0.15 / 0.0 <br/>
83-
(average mu = 0.132, current mu = 0.137)</td>
82+
<td>0.15</td>
8483
<td>GC 所耗费时间(毫秒)</td>
8584
</tr>
85+
<tr>
86+
<td>0.0</td>
87+
<td>GC 垃圾回收回调所话费的时间(毫秒)</td>
88+
</tr>
89+
<tr>
90+
<td>(average mu = 0.132, current mu = 0.137)</td>
91+
<td>增变因子利用率(0 —— 1 之间)</td>
92+
</tr>
8693
<tr>
8794
<td>deserialize GC in old space requested</td>
8895
<td>GC 原因</td>
@@ -100,8 +107,8 @@ const { PerformanceObserver } = require('perf_hooks');
100107
const obs = new PerformanceObserver((list) => {
101108
const entry = list.getEntries()[0];
102109
/*
103-
The entry would be an instance of PerformanceEntry containing
104-
metrics of garbage collection.
110+
The entry is an instance of PerformanceEntry containing
111+
metrics of a single garbage collection event.
105112
For example:
106113
PerformanceEntry {
107114
name: 'gc',
@@ -113,7 +120,7 @@ const obs = new PerformanceObserver((list) => {
113120
*/
114121
});
115122

116-
// Subscribe notifications of GCs
123+
// Subscribe to notifications of GCs
117124
obs.observe({ entryTypes: ['gc'] });
118125

119126
// Stop subscription
@@ -175,15 +182,15 @@ A. 如何获取糟糕的内存分配的上下文信息?
175182
1. 假定我们观察到旧内存持续增长。
176183
2. 但根据 GC 的负重来看,堆的最大值并未达到,但进程慢。
177184
3. 回看跟踪的数据,找出在 GC 前后总的堆占用量。
178-
4. 使用 `--max-old-space-size` 降低内存,使得总的内存堆更接近于极限值。
179-
5. 再次运行程序,达到内存耗尽
185+
4. 使用 [`--max-old-space-size`][] 降低内存,使得总的内存堆更接近于极限值。
186+
5. 再次不断地运行程序,直到内存耗尽
180187
6. 该过程的日志将显示失败的上下文信息。
181188

182189
B. 如何确定在堆增长之时,存在内存泄露现象?
183190
1. 假定我们观察到旧内存持续增长。
184191
2. 但根据 GC 的负重来看,堆的最大值并未达到,但进程慢。
185192
3. 回看跟踪的数据,找出在 GC 前后总的堆占用量。
186-
4. 使用 `--max-old-space-size` 降低内存,使得总的内存堆更接近于极限值。
193+
4. 使用 [`--max-old-space-size`][] 降低内存,使得总的内存堆更接近于极限值。
187194
5. 再次运行程序,观察是否内存耗尽。
188195
6. 如果发生内存耗尽,尝试每次提升 10% 的堆内存,反复数次。
189196
如果之前的现象复现被观察到,这就能证明存在内存泄露。
@@ -196,6 +203,7 @@ C. 如何断定是否存在太多次的垃圾回收,或者因为太多次垃
196203
4. 如果两次 GC 间隙时间和所话费的时间都非常高,证明该程序应该用一个更小点的堆。
197204
5. 如果两次 GC 的时间远大于 GC 运行的时间,应用程序则相对比较健康。
198205

199-
[performance hooks]: https://nodejs.org/api/perf_hooks.html
200206
[PerformanceEntry]: https://nodejs.org/api/perf_hooks.html#perf_hooks_class_performanceentry
201207
[PerformanceObserver]: https://nodejs.org/api/perf_hooks.html#perf_hooks_class_performanceobserver
208+
[`--max-old-space-size`]: https://nodejs.org/api/cli.html#--max-old-space-sizesize-in-megabytes
209+
[performance hooks]: https://nodejs.org/api/perf_hooks.html

locale/zh-cn/docs/guides/diagnostics/memory/using-heap-profiler.md

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@ layout: docs.hbs
55

66
# 使用内存堆剖析器
77

8-
为了调试一个与内存相关的问题,我们需要观察特定对象占有了多少内存空间,以及哪些对象占用
9-
了他们触发了垃圾回收。为了有效的调试,我们也需要知道连续时间下我们的变量是如何在内存里
10-
分配的。
11-
128
内存堆剖析器处于 V8 的顶部,能持续对内存分配进行快照。在这篇文章里我们将设计到内存的
139
剖析,将使用:
1410

@@ -23,7 +19,7 @@ layout: docs.hbs
2319
堆剖析器与堆采样分析器相似,不同处在于它会跟踪每次的内存分配状况,它的开销也就
2420
高于堆采样分析器,所以不建议在生产环境中使用。
2521

26-
> 你可借助 [@mmarchini/observe][] 通过编码方式实现
22+
> 你可借助 [@mmarchini/observe][] 通过编码方式来启动和停止剖析器
2723
2824
### 怎么用堆剖析器?
2925

@@ -43,8 +39,9 @@ node --inspect index.js
4339

4440
![堆剖析器步骤 1][heap profiler tutorial 1]
4541

46-
然后堆剖析就开始运行了,在此我们强烈建议您运行示例,这样便于确认内存相关的问题。
47-
拿本例子而言,我们将使用 `Apache Benchmark` 工具弄出应用程序中的负载。
42+
堆剖析一旦开始运行,我们强烈建议您运行示例,这样便于确认内存相关的问题。
43+
举个例子:如果我们对一个 Web 应用程序进行堆剖析,`Apache Benchmark`
44+
可以用来产出(模拟)应用程序中的负载。
4845

4946
> 在这个示例中,我们假定堆剖析基于 Web 应用程序。
5047
@@ -56,18 +53,18 @@ $ ab -n 1000 -c 5 http://localhost:3000
5653

5754
![堆剖析器步骤 2][heap profiler tutorial 2]
5855

59-
然后针对内存分配情况看一下快照
56+
最后针对内存分配情况看一下快照
6057

6158
![堆剖析器步骤 3][heap profiler tutorial 3]
6259

63-
请查阅下列有助于你了解关于更多内存相关术语的[链接部分](#usefull-links)
60+
请查阅下列有助于你了解关于更多内存相关术语的[链接部分](#useful-links)
6461

6562
## 堆剖析的采样
6663

67-
对堆剖析器的采样是在一定时间内持续跟踪内存份分配状况,以及后备内存。由于采样基于低
64+
对堆剖析器的采样是在一定时间内持续跟踪内存份分配状况和后备内存。由于采样基于低
6865
开销进行,所以它可以用在生产环境。
6966

70-
> 你可以借助 [`heap-profiler`][] 模块,通过编程方式实现此功能
67+
> 你可以借助 [`heap-profiler`][] 模块,通过编程方式控制堆内存剖析的开与关
7168
7269
### 如何对堆剖析进行采样?
7370

@@ -87,8 +84,8 @@ $ node --inspect index.js
8784

8885
![堆剖析器步骤 4][heap profiler tutorial 4]
8986

90-
在负载产生后停止剖析器,它会自动生成一个基于堆栈跟踪的内存分配总结。你可以查找某时间
91-
间隔内函数的内存堆分配状况,可以参照下面的例子:
87+
在负载产生后停止剖析器,它会自动生成一个基于堆栈跟踪的内存分配总结。你可以关注
88+
函数的内存堆分配状况,可以参照下面的例子:
9289

9390
![堆剖析器步骤 5][heap profiler tutorial 5]
9491

locale/zh-cn/docs/guides/diagnostics/memory/using-heap-snapshot.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,10 @@ Heap.20190718.133405.15554.0.001.heapsnapshot
6969
require('v8').writeHeapSnapshot();
7070
```
7171

72-
请查阅 [writeHeapSnapshot 文档][] 了解文件名的可用选项。
72+
请查阅 [`writeHeapSnapshot` 文档][] 了解文件名的可用选项。
7373

74-
在不停掉进程的前提下你需要有一个方式来生成快照,建议在 http handler 里调用,亦或是从操作
75-
系统中对某个信号量做出反应。但你需小心一点:不要暴漏触发生成快照的 http 终端地址,它不应该
74+
在不停掉进程的前提下你需要有一个方式来生成快照,建议在 HTTP Handler 里调用,亦或是从操作
75+
系统中对某个信号量做出反应。但你需小心一点:不要暴漏触发生成快照的 Http 终端地址,它不应该
7676
被其他人直接访问。
7777

7878
对于 v11.13.0 之前的 Node.js 版本,请借助 [heapdump 包][]来实现。
@@ -111,7 +111,7 @@ done < <(cat out | tail -n +2 | head -n -1)
111111
exec 3>&-
112112
```
113113

114-
以下是与检查器协议一起使用的内存分析工具的详尽列表
114+
这里提供一份与检查器协议一起使用的内存分析工具的详尽列表
115115

116116
* [适用于 Node.js 的 OpenProfiling][openprofiling]
117117

@@ -136,7 +136,7 @@ exec 3>&-
136136
[take a heap snapshot image]: /static/images/docs/guides/diagnostics/snapshot.png
137137
[内存快照信号量标志符]: https://nodejs.org/api/cli.html#--heapsnapshot-signalsignal
138138
[heapdump 包]: https://www.npmjs.com/package/heapdump
139-
[writeHeapSnapshot 文档]: https://nodejs.org/api/v8.html#v8_v8_writeheapsnapshot_filename
139+
[`writeHeapSnapshot` 文档]: https://nodejs.org/api/v8.html#v8_v8_writeheapsnapshot_filename
140140
[openprofiling]: https://github.com/vmarchaud/openprofiling-node
141141
[load button image]: /static/images/docs/guides/diagnostics/load-snapshot.png
142142
[comparison image]: /static/images/docs/guides/diagnostics/compare.png

0 commit comments

Comments
 (0)