project-loom-c5m:用Project Loom虚拟线程实现500万长连接的实验


5,000,000 个持久连接,200,000,000 条消息,使用 Project Loom 的单个进程出现 0 个错误。
Project Loom C5M 是一个使用OpenJDK Project Loom 虚拟线程在客户端和服务器 Java 应用程序中分别实现 500 万个持久连接的实验。

C5M 名称的灵感来自于 1999 年提出的C10k 问题。

该项目由两个简单的组件EchoServer和EchoClient.

EchoServer创建许多 TCP 被动服务器套接字,当它们进入时接受每个新连接。对于创建的每个活动套接字,EchoServer接收字节并回显它们。

EchoClient向单个目标服务器上的一系列端口发起许多传出 TCP 连接。对于创建的每个套接字,EchoClient向服务器发送一条消息,等待响应,并在再次发送之前进入睡眠状态。

EchoClient如果发生以下任何情况,立即终止:

  • 连接超时
  • 套接字读取超时
  • 收到消息的完整性错误
  • TCP 连接关闭
  • TCP 连接重置
  • 任何其他意外的 I/O 条件

以下关于使用 Erlang 实现 100 万个持久连接的文章在这方面非常有帮助

/etc/sysctl.conf:

fs.file-max=10485760
fs.nr_open=10485760

net.core.somaxconn=16192
net.core.netdev_max_backlog=16192
net.ipv4.tcp_max_syn_backlog=16192

net.ipv4.ip_local_port_range = 1024 65535

net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 16777216
net.core.wmem_default = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 87380 16777216
net.ipv4.tcp_mem = 1638400 1638400 1638400

net.netfilter.nf_conntrack_buckets = 1966050
net.netfilter.nf_conntrack_max = 7864200

EC2 Amazon Linux
net.core.netdev_max_backlog = 65536
net.core.optmem_max = 25165824
net.ipv4.tcp_max_tw_buckets = 1440000

/etc/security/limits.conf:

* soft nofile 8000000
* hard nofile 9000000

两台服务器级主机用于裸机测试:

  • HPE ProLiant BL460c Gen10
  • 2 个 20 核 CPU
  • 128GB 内存
  • 至强金牌 6230 CPU
  • CentOS 7.9
  • Project Loom Early Access Build 19-loom+5-429 (2022/4/4) 来自https://jdk.java.net/loom/

服务器以 [​​9000, 9099] 的被动服务器端口范围启动。
客户端使用相同的服务器目标端口范围和每端口连接数 50,000 启动,总共有 5,000,000 个目标连接。
我在连续运行大约 40 分钟后停止了实验。没有发生上述任何错误、关闭或超时。

点击标题

Loom更早版本测试比较项目