为什么在 Node 中生成一个新进程如此缓慢?

主要观点:在 Val Town 中,Node 服务器在负载下每秒 spawn 次数受限,通过多种方式优化 Node 的 spawn 性能,如使用cluster模块、将 spawn 调用移至工作线程或子进程等,并比较了 Node 与 Deno、Bun、Go、Rust 在不同实现下的性能。
关键信息

  • 在 Hetzner CCX33 机器上用不同语言和运行时进行基准测试,Node 最慢,Deno 和 Bun 较快,编译的线程池语言(Go、Rust)更快。
  • 使用cluster模块可增加进程数,但每个 HTTP 服务器在独立进程中,可能影响内存缓存等全局状态。
  • 将 spawn 调用移至工作线程或子进程,Node 性能有所提升,但仍不如 Deno 和 Bun,且在处理日志方面存在挑战。
  • 尝试了多种日志处理方式,如通过抽象套接字或process.send,但各有优劣。
  • 探讨了负载均衡的不同方式,但未明显提升性能。
    重要细节
  • 测试命令为bombardier -c 30 -n 10000 http://localhost:8001,预热各服务器后进行测试,使用的语言和运行时版本分别为 Go v1.22.2、Rust v1.77.2、Node v22.3.0、Bun 1.1.20、Deno 1.44.2。
  • 在将 spawn 调用移至子进程时,可混合使用 Node 和 Bun,Bun 实现了 Node IPC 协议。
  • 在处理日志时,通过不同方式传递日志存在各种问题,如文件描述符传递不成功、process.send在 Deno 和 Bun 中性能不佳等。
  • 负载均衡方面,尝试了随机选择、轮询和最少连接数等方式,但性能提升不明显。
阅读 20
0 条评论