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

参考资料

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