第1章 CPU 1
1.1 理解perf与火焰图(FlameGraph) 2
1.1.1 perf 2
1.1.2 火焰图 6
1.1.3 红蓝差分火焰图 8
1.2 使用v8-profiler分析CPU的使用情况 11
1.3 Tick Processor及Web UI 16
1.3.1 Tick Processor 16
1.3.2 Web UI 21
第2章 内存 23
2.1 gcore与llnode 24
2.1.1 Core和Core Dump 24
2.1.2 gcore 25
2.1.3 llnode 25
2.1.4 测试Core Dump 26
2.1.5 分析Core文件 27
2.1.6 --abort-on-uncaught-exception 29
2.1.7 小结 30
2.2 heapdump 30
2.2.1 使用heapdump 30
2.2.2 Chrome DevTools 32
2.2.3 对比快照 34
2.3 memwatch-next 35
2.3.1 使用memwatch-next 35
2.3.2 使用Heap Diff 38
2.3.3 结合heapdump使用 40
2.4 cpu-memory-monitor 41
2.4.1 使用cpu-memory-monitor 41
2.4.2 cpu-memory-monitor源码解读 43
第3章 代码 46
3.1 Promise 47
3.1.1 Promise/A+规范 48
3.1.2 从零开始实现Promise 48
3.1.3 Promise的实现原理 50
3.1.4 safelyResolveThen 52
3.1.5 doResolve和doReject 54
3.1.6 Promise.prototype.then和Promise.prototype.catch 55
3.1.7 值穿透 58
3.1.8 Promise.resolve和Promise.reject 60
3.1.9 Promise.all 61
3.1.10 Promise.race 62
3.1.11 代码解析 63
3.2 Async+Await 69
3.2.1 例1:async+await 70
3.2.2 例2:co+yield 71
3.2.3 例3:co+yield* 72
3.2.4 例4:co+bluebird 73
3.2.5 从yield转为yield*遇到的坑 75
3.2.6 async+bluebird 76
3.3 Error Stack 77
3.3.1 Stack Trace 78
3.3.2 Error.capture StackTrace 80
3.3.3 captureStackTrace在Mongolass中的应用 83
3.3.4 Error.prepareStackTrace 84
3.3.5 Error.prepareStackTrace的其他用法 86
3.3.6 Error&stackTraceLimit 88
3.3.7 Long Stack Trace 88
3.4 node@8 89
3.4.1 Ignition+Turbofan 90
3.4.2 版本的对应关系 91
3.4.3 try/catch 91
3.4.4 delete 93
3.4.5 arguments 95
3.4.6 async性能提升 97
3.4.7 不会优化的特性 98
3.5 Rust Addons 100
3.5.1 Rust 100
3.5.2 FFI 100
3.5.3 Neon 103
3.5.4 NAPI 108
3.6 Event Loop 110
3.6.1 什么是Event Loop 110
3.6.2 poll阶段 112
3.6.3 process.nextTick() 112
3.6.4 代码解析 113
3.7 处理uncaughtException 120
3.7.1 uncaughtException 120
3.7.2 使用llnode 121
3.7.3 ReDoS 122
第4章 工具 125
4.1 Source Map 126
4.1.1 uglify-es 126
4.1.2 TypeScript 128
4.1.3 source-map-support的高级用法 129
4.2 Chrome DevTools 129
4.2.1 使用Chrome DevTools 130
4.2.2 NIM 132
4.2.3 inspect-process 133
4.2.4 process._ debugProcess 133
4.3 Visual Studio Code 134
4.3.1 基本调试 134
4.3.2 launch json 136
4.3.3 技巧1——条件断点 138
4.3.4 技巧2—— skipFiles 139
4.3.5 技巧3——自动重启 140
4.3.6 技巧4——对特定操作系统的设置 142
4.3.7 技巧5——多配置 142
4.3.8 总结 144
4.4 debug+rep12+power-assert 144
4.4.1 debug 144
4.4.2 rep12 146
4.4.3 power-assert 148
4.5 supervisor-hot-reload 151
4.5.1 Proxy 151
4.5.2 用Proxy实现Hot Reload 153
4.5.3 supervisor-hot-reload 155
4.5.4 内存泄漏问题 160
第5章 日志 161
5.1 koa-await-breakpoint 162
5.1.1 koa-await-breakpoint的实现原理 162
5.1.2 使用koa-await-breakpoint 165
5.1.3 自定义日志存储 167
5.2 使用async_hooks 168
5.3 ELK 177
5.3.1 安装ELK 177
5.3.2 使用ELK 178
5.4 OpenTracing+Jaeger 182
5.4.1 什么是OpenTracing 182
5.4.2 什么是Jaeger 184
5.4.3 启动Jaeger及Jaeger UI 184
5.4.4 使用OpenTracing及Jaeger 185
5.4.5 koa-await-breakpoint-jaeger 187
5.5 使用Sentry 190
第6章 APM 197
6.1 使用NewRelic 198
6.2 Elastic APM 201
6.2.1 什么是Elastic APM 201
6.2.2 启动ELK 203
6.2.3 启动APM Server 203
6.2.4 使用Elastic APM 203
6.2.5 错误日志 205
第7章 监控 207
7.1 Telegraf + InfluxDB+Grafana(上) 208
7.1.1 Telegraf (StatsD) + InfluxDB + Grafana简介 208
7.1.2 启动docker- statsd-influxdb-grafana 208
7.1.3 熟悉InfluxDB 209
7.1.4 配置Grafana 210
7.1.5 node-statsd 211
7.1.6 创建Grafana图表 213
7.1.7 模拟真实环境 214
7.2 Telegraf + InfluxDB+Grafana(下) 217
7.2.1 Grafana+ELK 217
7.2.2 监控报警 220
7.2.3 脚本—键生成图表 222
第8章 应用 224
8.1 使用node-clinic 225
8.2 alinode 227
8.2.1 什么是alinode 227
8.2.2 创建alinode应用 228
8.2.3 安装alinode 228
8.2.4 使用alinode诊断内存泄露 229
8.2.5 使用alinode诊断CPU性能瓶颈 232