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