project-loom-c5m:用Project Loom虛擬執行緒實現500萬長連線的實驗

banq發表於2022-04-27

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更早版本測試比較專案

相關文章