编辑推荐
适读人群:中级Node.js开发者
√Node.js经典《Node.js实战(双色)》及《Node.js实战(第2季)》作者又一力作
√专门讲调试的Node.js书,资料少有,从CPU、内存、代码、工具、APM、日志、监控、应用8方面讲解
√大部分小节都会以一段经典的问题代码为例进行分析并给出解决方案
√Node.js进阶参考书,适合有一定Node.js开发经验的人阅读
√只讲干货,没废话
内容简介
《Node.js调试指南(全彩)》从CPU、内存、代码、工具、APM、日志、监控、应用这8个方面讲解如何调试Node.js,大部分小节都会以一段经典的问题代码为例进行分析并给出解决方案。其中,第1章讲解CPU相关的知识,涉及各种CPU性能分析工具及火焰图的使用;第2章讲解内存相关的知识,例如CoreDump及如何分析heapsnapshot文件;第3章讲解代码相关的知识,例如如何从代码层面避免写出难以调试的代码,并涉及部分性能调优知识;第4章讲解工具相关的知识,涉及常用的Node.js调试工具和模块;第5章讲解APM(ApplicationPerformanceManagement)相关的知识,例如两个不同的应用程序性能管理工具的使用;第6章讲解日志相关的知识,例如如何使用Node.js的async_hooks模块实现自动日志打点,并结合各种工具进行使用;第7章讲解监控相关的知识,例如如何使用Telegraf+InfluxDB+Grafana搭建一个完整的Node.js监控系统;第8章讲解应用相关的知识,给出了两个完整的Node.js应用程序的性能解决方案。
《Node.js调试指南(全彩)》并不适合Node.js初学者,适合有一定Node.js开发经验的人阅读。笔者倾向于将《Node.js调试指南(全彩)》定位成参考书,每一小节基本独立,如果遇到相关问题,则可以随时翻到相应的章节进行阅读。
作者简介
赵坤,网名nswbmw,资深Node.js开发者,开源项目Paloma、Mongolass和EverBlog作者,崇尚开源,热爱分享。
曾出版《Node.js实战(双色)》和《Node.js实战(第2季)》。
目录
第1章CPU1
1.1理解perf与火焰图(FlameGraph)2
1.1.1perf2
1.1.2火焰图6
1.1.3红蓝差分火焰图8
1.2使用v8-profiler分析CPU的使用情况11
1.3TickProcessor及WebUI16
1.3.1TickProcessor16
1.3.2WebUI21
第2章内存23
2.1gcore与llnode24
2.1.1Core和CoreDump24
2.1.2gcore25
2.1.3llnode25
2.1.4测试CoreDump26
2.1.5分析Core文件27
2.1.6--abort-on-uncaught-exception29
2.1.7小结30
2.2heapdump30
2.2.1使用heapdump30
2.2.2ChromeDevTools32
2.2.3对比快照34
2.3memwatch-next35
2.3.1使用memwatch-next35
2.3.2使用HeapDiff38
2.3.3结合heapdump使用40
2.4cpu-memory-monitor41
2.4.1使用cpu-memory-monitor41
2.4.2cpu-memory-monitor源码解读43
第3章代码46
3.1Promise47
3.1.1Promise/A+规范48
3.1.2从零开始实现Promise48
3.1.3Promise的实现原理50
3.1.4safelyResolveThen52
3.1.5doResolve和doReject54
3.1.6Promise.prototype.then和Promise.prototype.catch55
3.1.7值穿透58
3.1.8Promise.resolve和Promise.reject60
3.1.9Promise.all61
3.1.10Promise.race62
3.1.11代码解析63
3.2Async+Await69
3.2.1例1:async+await70
3.2.2例2:co+yield71
3.2.3例3:co+yield*72
3.2.4例4:co+bluebird73
3.2.5从yield转为yield*遇到的坑75
3.2.6async+bluebird76
3.3ErrorStack77
3.3.1StackTrace78
3.3.2Error.captureStackTrace80
3.3.3captureStackTrace在Mongolass中的应用83
3.3.4Error.prepareStackTrace84
3.3.5Error.prepareStackTrace的其他用法86
3.3.6Error.stackTraceLimit88
3.3.7LongStackTrace88
3.4node@889
3.4.1Ignition+Turbofan90
3.4.2版本的对应关系91
3.4.3try/catch91
3.4.4delete93
3.4.5arguments95
3.4.6async性能提升97
3.4.7不会优化的特性98
3.5RustAddons100
3.5.1Rust100
3.5.2FFI100
3.5.3Neon103
3.5.4NAPI108
3.6EventLoop110
3.6.1什么是EventLoop110
3.6.2poll阶段112
3.6.3process.nextTick()112
3.6.4代码解析113
3.7处理uncaughtException120
3.7.1uncaughtException120
3.7.2使用llnode121
3.7.3ReDoS122
第4章工具125
4.1SourceMap126
4.1.1uglify-es126
4.1.2TypeScript128
4.1.3source-map-support的高级用法129
4.2ChromeDevTools129
4.2.1使用ChromeDevTools130
4.2.2NIM132
4.2.3inspect-process133
4.2.4process._debugProcess133
4.3VisualStudioCode134
4.3.1基本调试134
4.3.2launch.json136
4.3.3技巧1——条件断点138
4.3.4技巧2——skipFiles139
4.3.5技巧3——自动重启140
4.3.6技巧4——对特定操作系统的设置142
4.3.7技巧5——多配置142
4.3.8总结144
4.4debug+repl2+power-assert144
4.4.1debug144
4.4.2repl2146
4.4.3power-assert148
4.5supervisor-hot-reload151
4.5.1Proxy151
4.5.2用Proxy实现HotReload153
4.5.3supervisor-hot-reload155
4.5.4内存泄漏问题160
第5章日志161
5.1koa-await-breakpoint162
5.1.1koa-await-breakpoint的实现原理162
5.1.2使用koa-await-breakpoint165
5.1.3自定义日志存储167
5.2使用async_hooks168
5.3ELK177
5.3.1安装ELK177
5.3.2使用ELK178
5.4OpenTracing+Jaeger182
5.4.1什么是OpenTracing182
5.4.2什么是Jaeger184
5.4.3启动Jaeger及JaegerUI184
5.4.4使用OpenTracing及Jaeger185
5.4.5koa-await-breakpoint-jaeger187
5.5使用Sentry190
第6章APM197
6.1使用NewRelic198
6.2ElasticAPM201
6.2.1什么是ElasticAPM201
6.2.2启动ELK203
6.2.3启动APMServer203
6.2.4使用ElasticAPM203
6.2.5错误日志205
第7章监控207
7.1Telegraf+InfluxDB+Grafana(上)208
7.1.1Telegraf(StatsD)+InfluxDB+Grafana简介208
7.1.2启动docker-statsd-influxdb-grafana208
7.1.3熟悉InfluxDB209
7.1.4配置Grafana210
7.1.5node-statsd211
7.1.6创建Grafana图表213
7.1.7模拟真实环境214
7.2Telegraf+InfluxDB+Grafana(下)217
7.2.1Grafana+ELK217
7.2.2监控报警220
7.2.3脚本一键生成图表222
第8章应用224
8.1使用node-clinic225
8.2alinode227
8.2.1什么是alinode227
8.2.2创建alinode应用228
8.2.3安装alinode228
8.2.4使用alinode诊断内存泄露229
8.2.5使用alinode诊断CPU性能瓶颈232
前言/序言
笔者和同事在过去一年多主要把工作精力放在如何提高Node.js服务端的性能、稳定性和基础设施搭建上,随着公司业务量的快速增长,我们遇到了各种各样的挑战,也取得了不错的成绩:从起初啥都没有,到后来建立了比较完善的日志、监控和报警系统;从起初遇到问题不知道如何下手,到后来在遇到问题时能及时发现并定位问题。总之,付出得到了回报。
笔者曾将在这一段时间内遇到的调试、调优过程整理并记录成文章,发表在公司的知乎专栏上,《Node.js调试指南(全彩)》就是在其基础上修改、补充和润色而成的,算是笔者对这几年在Node.js开发中进行调试的经验和思路的总结,笔者希望授人以鱼,亦能授人以渔。
《Node.js调试指南(全彩)》概要
《Node.js调试指南(全彩)》从CPU、内存、代码、工具、APM、日志、监控、应用这8个方面讲解如何调试Node.js,大部分小节都会以一段经典的问题代码为例进行分析并给出解决方案。
第1章讲解CPU相关的知识,涉及各种CPU性能分析工具及火焰图的使用。
第2章讲解内存相关的知识,例如CoreDump及如何分析heapsnapshot文件。
第3章讲解代码相关的知识,例如如何避免在代码层面写出难以调试的代码,并涉及部分性能调优知识。
第4章讲解工具相关的知识,涉及常用的Node.js调试工具和模块。
第5章讲解APM(ApplicationPerformanceManagement)相关的知识,例如两个不同的应用程序性能管理工具的使用。
第6章讲解日志相关的知识,例如如何使用Node.js的async_hooks模块实现自动日志打点,并结合各种工具进行使用。
第7章讲解监控相关的知识,例如如何使用Telegraf+InfluxDB+Grafana搭建一个完整的Node.js监控系统。
第8章讲解应用相关的知识,给出了两个完整的Node.js应用程序的性能解决方案。
《Node.js调试指南(全彩)》定位
《Node.js调试指南(全彩)》并不适合Node.js初学者,适合有一定Node.js开发经验的人阅读。笔者倾向于将《Node.js调试指南(全彩)》定位成参考书,每一小节基本独立,如果遇到相关问题,则可以随时翻到相应的章节进行阅读。
开发环境
MacOS或Linux(Ubuntu@16.0464位),Windows用户请在使用虚拟机安装Ubuntu后进行操作。
Node.js@8.9.4。
致谢
感谢石墨文档为笔者提供了良好的成长环境和技术氛围,感谢一起努力并解决问题的同事们,感谢张国霞编辑的耐心指导,感谢寸志、老雷、Yorkie、王政、杨海剑、黄一君在百忙之中抽出时间审阅《Node.js调试指南(全彩)》并给出反馈。谢谢你们。
交流&勘误
扫描下方的二维码,便可与笔者交流并提交勘误,您的反馈及意见对笔者来说非常重要,再次感谢!