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更早版本測試比較專案。
相關文章
- 使用Loom建立虛擬執行緒 - davidOOM執行緒
- 【unity】 Loom實現多執行緒UnityOOM執行緒
- Java 18中啟動Project Loom數百萬執行緒JavaProjectOOM執行緒
- 使用JDK16支援的Loom虛擬執行緒的代價 – WebtideJDKOOM執行緒WebIDE
- java 21 虛擬執行緒初體驗Java執行緒
- 【連載 02】多執行緒實現執行緒
- JDK21最終版協程實現之虛擬執行緒JDK執行緒
- Project Loom搶先體驗版ProjectOOM
- 用Pthread實現多執行緒操作thread執行緒
- 執行緒池的實現執行緒
- Java21的虛擬執行緒Virtual Thread初體驗Java執行緒thread
- [Java基礎]虛擬執行緒Java執行緒
- 9.2 運用API實現執行緒同步API執行緒
- 用多執行緒,實現併發,TCP執行緒TCP
- Project Loom的使用者模式執行緒或協程的效能是否一定很好? - DukesletterProjectOOM模式執行緒
- Java多執行緒的實現Java執行緒
- python執行緒池的實現Python執行緒
- 執行緒池的實現原理執行緒
- python threading 執行緒原理實驗Pythonthread執行緒
- Java 執行緒池中的執行緒複用是如何實現的?Java執行緒
- java執行緒實現方式Java執行緒
- 如何實現多執行緒執行緒
- Tomcat 配合虛擬執行緒,一種新的程式設計體驗Tomcat執行緒程式設計
- SpringBoot執行緒池和Java執行緒池的實現原理Spring Boot執行緒Java
- 虛擬執行緒原理及效能分析執行緒
- Java中實現執行緒的方式Java執行緒
- Java21上手體驗-分代ZGC和虛擬執行緒JavaGC執行緒
- Project Loom EA搶先體驗版本釋出ProjectOOM
- Java之實現多執行緒的方式三:實現Callable介面(結合執行緒池使用)Java執行緒
- Golang實現JAVA虛擬機器-執行時資料區GolangJava虛擬機
- 執行緒屏障CyclicBarrier實現原理執行緒
- 執行緒池ThreadPoolExecutor實現原理執行緒thread
- 簡易執行緒池實現執行緒
- Java多執行緒實現方式Java執行緒
- JavaScript如何實現多執行緒?JavaScript執行緒
- Runnable介面實現多執行緒執行緒
- 多執行緒具體實現執行緒
- 3 分鐘理解 Java 虛擬執行緒Java執行緒