nodejs
文章平均质量分 79
theanarkh
这个作者很懒,什么都没留下…
展开
-
Node.js 是如何处理请求的
在服务器软件中,如何处理请求是非常核心的问题。不管是底层架构的设计、IO 模型的选择,还是上层的处理都会影响一个服务器的性能,本文介绍 Node.js 在这方面的内容。原创 2023-09-29 22:24:58 · 2244 阅读 · 0 评论 -
Node.js C++ 层的任务管理
无原创 2022-12-02 23:13:05 · 694 阅读 · 0 评论 -
如何写一个 JS 运行时
无原创 2022-10-06 01:29:18 · 438 阅读 · 0 评论 -
聊聊 JS 断点的实现
无原创 2022-09-29 21:27:53 · 523 阅读 · 0 评论 -
如何追踪 JS 对象是否被 GC
如何追踪 JS 对象是否被 GC原创 2022-08-08 02:00:47 · 415 阅读 · 2 评论 -
Node.js 子线程 crash 问题的排查
Node.js 子线程原创 2022-06-22 23:21:51 · 342 阅读 · 0 评论 -
如何把 Node.js 嵌入自己的项目中
如何把 Node.js 嵌入自己的项目中原创 2022-06-04 00:05:44 · 668 阅读 · 0 评论 -
如何优雅地 hack 用户的代码
前言:做基础技术的时候,会经常碰到一个问题就是如何让自己提供的代码对用户少侵入,无感。比如我提供了一个 SDK 收集 Node.js 进程的 HTTP 请求耗时,最简单的方式就是给用户提供一个 request 方法,然后让用户统一调用,这样我就可以在 request 里拿到这些数据。但是这种方式很多时候并不方便,这时候我们就需要去 hack Node.js 的 HTTP 模块或者给 Node.js 提 PR。在操作系统层面,有提供很多技术解决这种问题,比如 ebpf、uprobe、kprobe。但是应用层无原创 2022-05-24 01:19:52 · 395 阅读 · 0 评论 -
V8 global.gc() 的实现
前言:在 Node.js 中我们有时候会使用 global.gc() 主动触发 gc 来测试一些代码,因为我们知道 V8 gc 的执行时机是不定的。但是可能很少同学知道 global.gc() 的实现,本文介绍一些在 V8 中关于这部分的实现。了解 global.gc() 实现之前,首先看一下 V8 的 Extension 机制。Extension 机制用于拓展 V8 的能力。在 V8 初始化的过程中,V8::Initialize 会初始化 Extension 机制,具体在 Bootstrapper::原创 2022-05-23 23:15:35 · 717 阅读 · 0 评论 -
利用 V8 的 trace API 追踪代码
V8 和 Node.js 提供了 trace_event 机制,但是因为稳定性原因,Node.js 目前没有支持用户自定义 trace event 能力,所以写了一个 addon 支持该能力(npm i v8_trace_event)。更多信息可以参考。https://github.com/nodejs/node/pull/42462https://nodejs.org/dist/latest-v18.x/docs/api/tracing.htmlhttps://zhuanlan.zhihu.com原创 2022-05-04 05:24:25 · 772 阅读 · 0 评论 -
V8 新生代垃圾回收的实现
前言:因为最近在做一些 gc track 的事情,所以打算了解一下 V8 GC 的实现。介绍 V8 GC 的文章网上已经有很多,就不打算再重复介绍。本文主要介绍一下新生代 GC 的实现,代码参考 V8 10.2,因为 GC 的实现非常复杂,只能介绍一些大致的实现,读者需要对 V8 GC 有一定的了解,比如新生代是分为 from 和 to 两个 space,然后在 GC 时是如何处理的。说到 GC 首先需要介绍内存,具体来说,是堆内存,V8 把内存分为新生代和老生代,其中老生代又分为很多种类型,不过本文只关原创 2022-04-29 02:36:49 · 315 阅读 · 0 评论 -
通过代码缓存加速 Node.js 的启动
前言:之前的文章介绍了通过快照的方式加速 Node.js 的启动,除了快照,V8 还提供了另一种技术加速代码的执行,那就是代码缓存。通过 V8 第一次执行 JS 的时候,V8 需要即时进行解析和编译 JS代码,这个是需要一定时间的,代码缓存可以把这个过程的一些信息保存下来,下次执行的时候,通过这个缓存的信息就可以加速 JS 代码的执行。本文介绍在 Node.js 里如何利用代码缓存技术加速 Node.js 的启动。首先看一下 Node.js 的编译配置。'actions': [ { 'act原创 2022-04-02 01:54:44 · 1505 阅读 · 0 评论 -
通过快照加速 Node.js 的启动
前言:随着 Node.js 的越来越强大,代码量也变得越来越多,不可避免地拖慢了 Node.js 的启动速度,针对这个问题,Node.js 社区通过 V8 的 snapshot 技术对 Node.js 的启动做了优化,在 github 有很多关于此的 issue 讨论,大家有兴趣也可以去看一下。通过快照加速启动是一个非常复杂的过程,这需要对 V8 有深入的理解。本文介绍一下如何在 Node.js 中使用快照加速 Node.js 的启动。以 v16.13.1 为例,社区一直在优化这里面的速度,不同的版本的速度原创 2022-04-01 04:10:12 · 536 阅读 · 0 评论 -
聊聊最近给 Node.js 提交的几个PR
前言:最近因为工作中碰到的一些问题,希望给 Node.js 提交一些代码来解决我碰到的问题,一共提交了 4 个 PR,目前一个已经在 17.8.0 中发布,一个刚合到主干,一个等 reviewer 回复,一个等 31 号 tsc 开会讨论。总的来说,提交的代码并不复杂,但是的确解决了我的问题,同时我觉得也是开发者需要的一些功能。下面介绍一下这几个 PR 做的事情。1 通过 perf_hooks 收集 HTTP 模块的耗时了解 HTTP Server 处理一个请求的耗时和发送一个 HTTP Request原创 2022-03-30 02:26:05 · 229 阅读 · 0 评论 -
Node.js 的 trace events 架构
前言: trace 系统用于收集内核的数据,本文介绍在 Node.js 中 trace 系统的架构和实现,因为 Node.js 的 trace 系统是基于 V8 的,所以也会介绍 V8 部分。Node.js 中 trace 数据通过两种方式产生,第一种方式是在 JS 层通过 V8 提供的 trace C++ API,第二种方式是通过 Node.js C++ 层。下面首先看一下第一种。// binding.trace(phase, category, name, id, data) SimpleIns原创 2022-03-26 16:18:06 · 1407 阅读 · 0 评论 -
Node.js 的 perf_hooks
前言:perf_hooks 是 Node.js 中用于收集性能数据的模块,Node.js 本身基于 perf_hooks 提供了性能数据,同时也提供了机制给用户上报性能数据。文本介绍一下 perk_hooks。PerformanceEntryPerformanceEntry 是 perf_hooks 里的一个核心数据结构,PerformanceEntry 代表一次性能数据。下面来看一下它的定义。template <typename Traits>struct PerformanceE原创 2022-03-20 01:48:46 · 1923 阅读 · 0 评论 -
通过 Inspector 收集 Node.js 的 trace event 数据
前言:Node.js 提供了 trace event 的机制,在 Node.js 内核代码里,静态地埋了一些点,比如同步文件 IO 耗时,DNS 解析耗时等。每次执行这些代码时,Node.js 就会执行这些点的钩子,从而收集相应的数据。不过这个能力默认是关闭的,毕竟对性能会产生影响。我们可以通过 trace_events 模块打开这个功能。trace_events 模块会源源不断地把数据写到一个到多个文件中。除了通过 trace_events 模块之外,Node.js 也实现了通过 Inspector 协议原创 2022-03-13 02:10:08 · 179 阅读 · 0 评论 -
Node.js 事件循环全景图
原创 2022-02-06 10:03:06 · 624 阅读 · 0 评论 -
深入理解 Node.js 的 trace_event
前言: trace event 简单来说就是在代码里静态插入埋点,当开启 trace event 的时候,每次经过这些埋点,就会记录执行的相关数据,通过这些数据,我们可以对系统进行分析。Node.js 内核支持 trace event 的功能,并实现了对某些模块的 trace 能力。本文介绍 trace event 在 Node.js 中的实现。在 Node.js 收集 trace_event 数据的方式有两种,第一种是在启动 Node.js 时通过命令行参数。node --trace-event-ca原创 2022-01-29 19:15:12 · 1523 阅读 · 0 评论 -
Node.js 内核的幕后英雄 --- 子线程
前言:Node.js 为人所知的是单线程应用,也为人所知的是底层其实利用了多线程。单线程会使得代码实现上变得容易好理解,但是带来好处的同时,也往往会存在一些限制,这些限制导致在 Node.js 内核中,不得不引入其他子线程,最终形成多线程。本文介绍 Node.js 中的这些幕后英雄。1 Libuv 线程池Node.js 中,Libuv 线程池是最为人所知的子线程。Node.js 的整体架构是单线程 + 事件驱动,其本质是一个生产者消费者的模型。Node.js 不断通过事件驱动模块订阅 fd 的事件,原创 2022-01-29 03:01:29 · 1973 阅读 · 0 评论 -
Node.js ObjectWrap 的弱引用问题
前言:最近在写 Node.js Addon 的过程中,遇到了一个问题,然后发现是 ObjectWrap 弱引用导致的,本文介绍一下具体的问题和排查过程,以及 ObjectWrap 的使用问题。ObjectWrap 用于写 Addon 的时候导出 C++ 对象给 JS 层使用,大致用法如下。首先定义一个 C++ 类。class Demo: public node::ObjectWrap { public: static void create(const FunctionCallbackInfo原创 2022-01-02 05:29:43 · 844 阅读 · 0 评论 -
Node.js 的微任务处理(基于Node.js V17)
前言:Node.js 的事件循环已经老生常谈,但是在 Node.js 的执行流程中,事件循环并不是全部,在事件循环之外,微任务的处理也是核心节点,比如 nextTick 和 Promise 任务的处理。本文介绍 Node.js 中微任务处理的相关内容。网上文章和很多面试题中有很多关于 Promise、nextTick、setTimeout 和 setImmediate 执行顺序的内容。通过本文,让你从原理上理解他们,碰到相关的问题就引刃而解,不再拘泥于背诵和记录。1 事件循环本文不打算详细地讲解事件循环原创 2021-12-25 14:29:07 · 929 阅读 · 0 评论 -
使用 ebpf 监控 Node.js 事件循环的耗时
前言:强大的 ebpf 使用越来越广,能做的事情也越来越多,尤其是无侵入的优雅方式更加是技术选型的好选择。本文介绍如何使用 ebpf 来监控 Node.js 的耗时,从而了解 Node.js 事件循环的执行情况。不过这只是粗粒度的监控,想要精细地了解 Node.js 的运行情况,需要做的事情还很多。在 Node.js 里,我们可以通过 V8 Inspector 的 cpuprofile 来了解 JS 的执行耗时,但是 cpuprofile 无法看到 C、C++ 代码的执行耗时,通常我们可以使用 perf原创 2021-12-18 00:25:53 · 1029 阅读 · 0 评论 -
探索 ebpf 在 Node.js 中的应用
前言:ebpf 是现代 Linux 内核提供的非常复杂和强大的技术,它使得 Linux 内核变得可编程,不再是完全的黑盒子。随着 ebpf 的发展和成熟,其应用也越来越广泛,本文介绍如何使用 ebpf 来追踪 Node.js 底层的代码。介绍ebpf 的设计思想虽然很简单,但是实现和使用上非常复杂。ebpf 本质上内核实现了一个虚拟机,用户可以把自己编写的 c 代码加载进内核中执行,从而参与内核的逻辑处理。这听起来很简单,但是整个技术其实非常复杂,从实现来说,内核需要对加载的代码进行非常多而复杂的校验,原创 2021-11-30 23:55:13 · 288 阅读 · 0 评论 -
something about Node.js
1 如何监听 Node.js 的所有函数这是一次危险的探索,但是或许某些场景下可以用到。主要想做的事情是劫持所有的 Node.js 函数,在函数执行前后,插入钩子做些事情。但是由于场景很多而且负责,劫持的风险非常高,如果你使用以下代码有问题,可以提个 issue。以下代码可以通过预加载方式加载或者在你的代码执行前加载。module-wrap.jsconst { Module } = require('module');function before(...args) { console.l原创 2021-11-21 08:21:10 · 364 阅读 · 0 评论 -
Node.js 的底层原理
前言:之前分享了 Node.js 的底层原理,主要是简单介绍了 Node.js 的一些基础原理和一些核心模块的实现,本文从 Node.js 整体方面介绍 Node.js 的底层原理。分享内容主要包括五个部分。第一部分是首先介绍一下 Node.js 的组成,还有他的代码架构。然后接下来会介绍一下 Node.js 中的 Libuv, 还有 V8 和模块加载器。然后最后介绍一下 Node.js 的服务器架构。1 Node.js 的组成下面我们先来看一下Node.js 的组成。Node.js 主要是由 V8、原创 2021-11-06 16:12:19 · 2622 阅读 · 7 评论 -
深入理解 Node.js 的 Buffer
前言:Buffer 模块是 Node.js 非常重要的模块,很多模块都依赖它。本文介绍一下 Buffer 模块底层的原理,包括 Buffer 的核心实现和 V8 堆外内存等内容。Buffer 的实现Buffer 模块的实现虽然非常复杂,代码也非常多,但是很多都是编码解码以及内存分配管理的逻辑,我们从常用的使用方式 Buffer.from 来看看 Buffer 的实现。Buffer.from = function from(value, encodingOrOffset, length) { ret原创 2021-10-16 00:00:48 · 1233 阅读 · 0 评论 -
Node.js 一问一答
一问一答是以问答的形式聊一下 Node.js 的一个个知识点。1 setTimeout 和 setImmediatesetTimeout(() => {}, 0) 和 setImmediate 谁先执行,这个是 Node.js 里经常会被提到的一个问题,其实这两没什么关系,setImmediate 是 Node.js check 阶段的任务,setTimeout 是 timer 阶段的任务,在 Node.js 事件循环中,timer 阶段是在 check 阶段执行的,看起来 setTimeout原创 2021-10-12 23:38:51 · 112 阅读 · 0 评论 -
No.js 支持 HTTP 模块
前言:No.js 初步支持了 HTTP 能力,目前只是支持解析 HTTP 请求,很多地方还需要慢慢琢磨,本文简单介绍其实现。1 HTTP 解析器No.js 使用 Node.js 的 HTTP 解析器 llhttp 实现 HTTP 协议的解析,llhttp 负责解析 HTTP 报文,No.js 需要做的事情是保存解析的结果并封装具体的能力。看看 No.js 是如何封装 llhttp 的。class HTTP_Parser { public: HTTP_Parser(llhttp_原创 2021-10-04 19:00:31 · 403 阅读 · 1 评论 -
Node.js HTTP 解析器 llhttp 的使用
前言:llhttp 是 Node.js 的 HTTP 1.1 解析器,用于替代早期的http_parser,性能上有了非常大的提升,最近打算在 No.js 里引入 llhttp 来处理 HTTP 协议的解析,本文简单介绍一下如何使用。llhttp 项目是 Node.js 中的子项目,地址在:https://github.com/nodejs/llhttp。使用步骤如下:安装 npx:npm i npx -g执行 ts 生成 c 代码:npx ts-node bin/generate.ts,或者执行原创 2021-10-03 11:39:07 · 410 阅读 · 0 评论 -
聊聊 Node.js 的模块机制
前言:模块机制是 Node.js 中非常重要的组成,模块机制使得我们可以以模块化的方式写代码,而不是全部代码都写到一个文件里。我们平时使用的比较多的通过 require 加载模块,但是我们可能不是很清楚 require 的实现原理,另外 Node.js 里存在多种模块类型,加载原理也不太一样,本文将会介绍 Node.js 模块机制以及实现原理。1 模块机制的初始化和使用1.1 注册 C++ 模块在 Node.js 启动的时候,会通过 RegisterBuiltinModules 注册 C++ 模块。原创 2021-09-25 16:52:32 · 348 阅读 · 0 评论 -
No.js 的模块加载器实现
前言:最近在 No.js 里实现了一个简单的模块加载器,本文简单介绍一下加载器的实现。因为 JS 本身没有模块加载的概念,随着前端的发展,各种加载技术也发展了起来,早期的seajs,requirejs,现在的 webpack,Node.js等等,模块加载器的背景是代码的模块化,因为我们不可能把所有代码写到同一个文件,所以模块加载器主要是解决模块中加载其他模块的问题,不仅是前端语言,c语言、python、php同样也是这样。No.js 参考的是 Node.js的实现。比如我们有以下两个模块。module1原创 2021-09-16 00:53:21 · 516 阅读 · 0 评论 -
vscode调试Node.js指南
1 调试JS{ // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "node", "request": "attach",原创 2021-08-25 01:27:46 · 1495 阅读 · 0 评论 -
Node.js子线程调试和诊断指南
1 初始化在Node.js启动子线程的时候,会初始化Inspector。env_->InitializeInspector(std::move(inspector_parent_handle_));在分析InitializeInspector之前,我们先看一下inspector_parent_handle_。std::unique_ptr<inspector::ParentInspectorHandle> inspector_parent_handle_;inspector_原创 2021-08-23 23:25:11 · 321 阅读 · 0 评论 -
深入理解Node.js的Async hooks
前言:虽然Async hooks至此还是实验性API,但是他的确可以解决应用中的一些问题,比如日志和调用栈跟踪。本文从应用和原理方便介绍一下Node.js的Async hooks。1 env中的AsyncHooks在Node.js的env对象中有一个AsyncHooks对象,负责Node.js进程中async_hooks的管理。我们看一下定义。1.1 类定义class AsyncHooks : public MemoryRetainer { public: enum Fields {原创 2021-08-12 00:10:41 · 868 阅读 · 0 评论 -
Node.js Inspector源码解析
前言:之前的文章分析了Node.js Inspector的使用和原理,并粗略地分析了其源码,因为Node.js Inspector的实现非常复杂,逻辑又非常绕,所以本文打算更深入、更通俗地讲解Node.js Inspector的实现。当我们以以下方式执行我们的应用时node inspect app.js1 初始化Node.js在启动的过程中,就会初始化Inspector相关的逻辑。inspector_agent_ = std::make_unique<inspector::Agent>原创 2021-08-07 02:55:47 · 288 阅读 · 1 评论 -
深入理解Node.js的Inspector
前言:Node.js提供的Inspector不仅可以用来调试Node.js代码,还可以实时收集Node.js进程的内存,CPU等数据,同时支持静态、动态开启,是一个非常强大的工具,本文从使用和原理详细讲解InspectorNode.js的文档中对inspector的描述很少,但是如果深入探索,其实里面的内容还是挺多的。我们先看一下Inspector的使用。1 Inspector的使用1.1 本地调试我们先从一个例子开始。下面是一个http服务器。const http = require('http原创 2021-08-05 00:56:15 · 639 阅读 · 0 评论 -
Node.js源码解析之TCP
本章摘自:《Node.js源码剖析十七章-TCP》本章我们主要看一下Node.js中对TCP的封装,我们首先看一下在网络编程中,是如何编写一个服务器和客户端的(伪代码)。服务器1. const fd = socket(); 2. bind(fd, ip, port); 3. listen(fd); 4. const acceptedFd = accept(fd); 5. handle(acceptedFd); 我们看一下这几个函数的作用1 socket:socket函数用于从操原创 2021-08-02 23:08:13 · 554 阅读 · 0 评论 -
在Node.js中使用SO_RESUEPORT
前言:今天下载了Node.js最新版代码,并为Node.js增加了SO_RESUEPORT的能力,本文介绍具体的实现,关于SO_RESUEPORT的知识可以参考之前的文章或者网上文章。1 LibuvSO_RESUEPORT是操作系统内核提供的能力,所以第一步首先修改Libuv。考虑到操作系统兼容性的问题,目前只支持Linux系统,旧版Mac OS也支持相关shuxing...原创 2021-07-23 02:43:54 · 265 阅读 · 3 评论 -
使用Node.js Addon实现类继承
前言:昨天有个同学问怎么通过NAPI把C++类的继承关系映射到JS,很遗憾,NAPI貌似还不支持,但是V8支持,因为V8在头文件里导出了这些API,并Node.js里也依赖这些API,所以可以说是比较稳定的。本文介绍一下如何实现这种映射(不确定是否能满足这位同学的需求)。下面我们看一下Addon的实现。会涉及到V8的一些使用,可以先阅读该文章《一段js理解nodejs中js调用c++/c的过程》。首先看一下基类的实现。#ifndef BASE_H#define BASE_H#include <原创 2021-07-16 01:43:41 · 349 阅读 · 1 评论