nodejs / nodejs/node

TLS memory overflow - V8 garbage collection

未关闭
#65,263 2 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

tls
主要语言
JavaScript
星标
122k
派生
37.4k
平均合并
4 天 3 小时
30 天内合并 PR
272

描述

Version

26.7.0

Platform
Microsoft Windows NT 10.0.26200.0 x64
Subsystem

No response

What steps will reproduce the bug?
  1. git clone https://github.com/prettydiff/aphorio
  2. npm run server
  3. Open a web browser to localhost and the specified port number
  4. In the browser use the left side navigation and choose Performance Test
  5. Choose these experiment settings:
    • WebSocket
    • Encrypted
    • Send Only
    • Force GC Between Tests
    • Location - 127.0.0.1
    • Port - specified secure port
    • Test Quantity - 5000000
    • Number of tests - 10
    • Message Body - "test"
How often does it reproduce? Is there a required condition?

50%, no required condition

What is the expected behavior? Why is that the expected behavior?

The expected behavior is the application remains executing and returns test results.

What do you see instead?
<--- Last few GCs --->

[16960:00000220C3725000]   178739 ms: Scavenge (during sweeping) 7914.8 (7952.1) -> 7887.9 (7954.4) MB, pooled: 0.0 MB, 3.29 / 0.00 ms (average mu = 0.348, current mu = 0.370) allocation failure;
[16960:00000220C3725000]   179468 ms: Incremental Mark-Compact (reduce) 7919.9 (7957.1) -> 7890.5 (7896.4) MB, pooled: 0.0 MB, 33.63 / 0.00 ms (+ 668.4 ms in 133 steps since start of marking, biggest step 5.2 ms, walltime since start of marking 720 ms) (a
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
----- Native stack trace -----

 1: 00007FF748A7641D node::OnFatalError+1325
 2: 00007FF749840FB1 v8::Function::NewInstance+577
 3: 00007FF749625287 SSL_CTX_set_stateless_cookie_verify_cb+504087
 4: 00007FF749622E4D SSL_CTX_set_stateless_cookie_verify_cb+494813
 5: 00007FF74961D511 SSL_CTX_set_stateless_cookie_verify_cb+471969
 6: 00007FF749624DEA SSL_CTX_set_stateless_cookie_verify_cb+502906
 7: 00007FF7493C8C8F v8::MemorySpan<v8::internal::DirectHandle<v8::internal::Map> >::operator[]+890943
 8: 00007FF749665ADE v8::internal::StrongRootAllocatorBase::deallocate_impl+201886
 9: 00007FF74986B73C v8::ArrayBuffer::New+172
10: 00007FF748AD2A7F node::Buffer::New+43359
11: 00000220EBD501DA
Additional information

Unencrypted tests never fail in this manner as they will run to completion as long as it takes. This problem is specific to TLS. I have been able to run experiments comprising greater than 50,000,000 WebSocket messages repeatedly without any failures.

The error messaging indicates garbage collection in V8 is the culprit, but I suspect the problem could be OpenSSL causing V8 to hang unexpectedly until all memory is consumed.

This is an aside, but it seems at maximum efficiency I can send 3,250,000 messages in 0.002 seconds but the next 0.998 seconds is spent on garbage collection. I don't know if this is a potentially untapped optimization target. Aside from the garbage collection time it seems executing WebSockets like this application does is about 2300x faster than Bun.
I had a defect in my profiler.

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

使用 npm run server 和 issue 中描述的加密 WebSocket Performance Test 设置,在 aphorio repository 中重现。观察 V8 垃圾回收和堆错误输出,同时比较 TLS 运行与未加密运行。加密测试完成并返回结果,且未耗尽内存,即表示完成。

由索引模型根据 Issue 内容生成。

评估

技术栈
javascript, nodejs
领域
backend, networking, security
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
冷清
描述清晰度
基本清楚
新手友好度
45/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。