阿里云ECS连接数过高、Tomcat并发问题,通常是由于服务器资源(CPU、内存、网络)或应用配置不当导致的。以下是排查和优化建议:
一、排查思路
1. 确认当前连接数
- 使用命令查看当前连接数:
netstat -ant | grep :8080 | wc -l # 查看Tomcat端口(如8080)的连接数 ss -ant | grep :8080 | wc -l # 更快的替代方式 - 查看系统总连接数限制:
ulimit -n
2. 检查Tomcat线程池配置
Tomcat默认使用的是maxThreads="200",超过后会排队等待或拒绝请求。
- 打开
conf/server.xml:<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="50"/> <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> - 建议:根据CPU核心数适当增加
maxThreads,但不要过大,否则线程切换开销大。
3. 查看系统资源瓶颈
- CPU使用率:
top 或 htop - 内存使用情况:
free -h - 网络IO:
iftop 或 nload
4. 查看Tomcat日志
- 检查是否有以下异常:
java.lang.OutOfMemoryErrorConnection reset,Broken pipe- 长时间请求未返回
5. 检查是否遭受攻击
- 是否有大量来自某个IP的连接?
netstat -ant | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -n 20 - 如果是攻击,可考虑使用防火墙或WAF拦截。
二、常见原因及解决方案
| 问题类型 | 描述 | 解决方案 |
|---|---|---|
| 连接数过高 | 大量短连接未及时释放 | 调整keepAliveTimeout、启用Keep-Alive |
| Tomcat线程不足 | 请求堆积,响应慢 | 增加maxThreads,使用NIO协议 |
| 数据库瓶颈 | 数据库连接池耗尽 | 优化SQL、增大连接池、添加缓存 |
| 代码阻塞 | 同步操作、死锁等 | 异步处理、多线程、优化业务逻辑 |
| 垃圾回收频繁 | JVM内存不足 | 调整JVM参数,增加堆内存 |
| 外部服务调用慢 | 第三方接口响应慢 | 设置超时、降级、熔断机制 |
三、优化建议
1. 调整Tomcat配置
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
keepAliveTimeout="5000"
maxKeepAliveRequests="100"
maxThreads="500"
minSpareThreads="50"
acceptCount="100"
disableUploadTimeout="true"
enableLookups="false"
URIEncoding="UTF-8"/>
2. JVM参数优化示例
在启动脚本中设置:
JAVA_OPTS="-Xms2g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+PrintGCDetails -Dfile.encoding=UTF-8"
3. 使用反向(Nginx)
- Nginx可以做负载均衡、静态资源缓存、限流、压缩等。
-
示例配置:
upstream backend { least_conn; server 127.0.0.1:8080; } server { listen 80; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 60s; proxy_read_timeout 120s; } }
4. 开启监控
- 使用Prometheus + Grafana监控Tomcat性能指标
- 使用APM工具(如SkyWalking、Pinpoint)分析链路性能
四、其他建议
- 减少同步阻塞操作:如文件上传、第三方API调用应异步处理。
- 合理设置超时:防止请求长时间挂起。
- 数据库优化:索引优化、慢查询日志、连接池大小。
- 使用缓存:如Redis,减轻后端压力。
- 限流与熔断:防止雪崩效应。
五、总结
当出现ECS连接数高、Tomcat并发不足的问题时,通常需要从以下几个方面入手:
- 系统层面:CPU、内存、网络、连接数限制;
- Tomcat层面:线程池、协议、连接超时;
- 代码层面:是否有阻塞、死循环、慢查询;
- 架构层面:是否需要引入缓存、消息队列、微服务拆分;
- 安全层面:是否遭受DDoS或CC攻击。
如果你能提供具体的日志片段、系统配置、Tomcat版本等信息,我可以进一步帮你定位问题。
是否需要我帮你写一个一键检测脚本?
CLOUD技术博