1. 測試結果
- 瞬間併發量1200左右,當請求總數達到1.8萬時,錯誤率達50%左右
- 持續穩定併發量334
使用nacos
- 結果:222296次請求,用時11分05秒,錯誤率 0%,吞吐量334.0/秒
- 個人評價:相對直連方式吞吐量略低,但穩定
直連方式
- 結果:224216次請求,用時9分44秒,錯誤率 0.41%,吞吐量384.2/秒
- 個人評價:相對nacos集羣方式吞吐量略高,但在請求數過20萬後開始出現失敗情況,沒有集羣穩定
個人感慨
- 高併發好難,不是寫好代碼就可以搞定!
- Tomcat可以支撐5000併發(網上搜的,未求證),但操作系統的默認配置限制了高併發實現。
- 單機持續1000併發還是夢!(瞬間1000+併發沒問題)因爲Linux系統有最大連接數限制,請求數量超過2萬後就會出現各種狀況。
- 單機10萬併發是怎麼配置的?
- 單機1萬併發也行啊
- 原來以爲Go的高併發相對Java性能更高,開發更容易,想使用Go開發。今天才發現Linux系統纔是高併發的第一道關卡!
- 希望早日在測試環境壓垮Java服務升級到Go
來自Linux的門檻
- java.net.NoRouteToHostException
java.net.NoRouteToHostException: Can't assign requested address (Address not available)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
- Can’t assign requested address (connect failed)
org.apache.http.conn.HttpHostConnectException: Connect to 192.168.1.29:7001 [/192.168.1.29] failed: Can't assign requested address (connect failed)
- 通過搜索,修改了內核配置纔到了300的吞吐量……
vim /etc/sysctl.conf
vm.max_map_count=262144
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_abort_on_overflow = 1
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 66384 4194304
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.core.optmem_max = 81920
net.core.wmem_default = 8388608
net.core.wmem_max = 16777216
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.ipv4.tcp_max_syn_backlog = 1020000
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000
2. 測試場景
測試環境
- 操作系統:CentOS Linux release 7.6.1810 (Core)
- CPU:12 Intel® Core™ i7-8700 CPU @ 3.20GHz
- 內存:64G
- 硬盤:普通機械硬盤
- 客戶端與服務端鏈接方式:局域網內通過交換機有線鏈接
- 測試工具:JMeter
- 註冊中心:nacos 1.0.0 單機模式
- 防火牆開啓:firewall
測試項目
1. id生成器
- 功能描述
Spring Cloud項目,通過redis遞增實現主鍵遞增功能。 - 啓動方式
java -jar 自帶的Tomcat
2. nacos服務的生產者
- 功能描述
Spring Cloud項目,使用FeignClient從nacos裏得到3個消費者,通過輪訓進行消費 - 啓動方式
java -jar 自帶的Tomcat
單機QPS可達600萬怎麼做到的?
百度開源UidGenerator是Java實現的, 基於Snowflake算法的唯一ID生成器。UidGenerator以組件形式工作在應用項目中, 支持自定義workerId位數和初始化策略, 從而適用於docker等虛擬化環境下實例自動重啓、漂移等場景。 在實現上, UidGenerator通過借用未來時間來解決sequence天然存在的併發限制; 採用RingBuffer來緩存已生成的UID, 並行化UID的生產和消費, 同時對CacheLine補齊,避免了由RingBuffer帶來的硬件級「僞共享」問題. 最終單機QPS可達600萬。