nacos高併發沒有想象的那麼容易

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萬。

參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章