易君召
发布于 2026-08-24 / 作者:易君召 / 1 阅读
0

如何提高服务器并发性能

并发本质:单位时间处理更多请求,同时控制 CPU、内存、IO、网络、锁竞争、数据库压力,避免瓶颈。优化分为:架构层、应用层、中间件、数据库、操作系统、网络、硬件七个维度。

一、操作系统层面优化(Linux)

1. 文件句柄与进程限制

高并发下大量连接会耗尽 fd,调大最大打开文件数

# 临时生效
ulimit -n 65535

/etc/security/limits.conf

* soft nofile 65535
* hard nofile 65535

2. TCP 内核参数调优 /etc/sysctl.conf

# 扩大端口可用范围
net.ipv4.ip_local_port_range = 1024 65535
# 减少TIME_WAIT堆积,快速回收
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# 连接队列
net.core.somaxconn = 4096
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

sysctl -p生效。

注意:不要盲目开老旧的tcp_tw_recycle,NAT 环境会出问题。

3. 调度与内存

  • CPU 调度:IO 密集型用noop,CPU 密集用cfq;云服务器一般保持默认。

  • 关闭 swap:高并发业务 swap 会严重拖垮性能,swapoff -a,生产环境尽量关闭 swap。

二、Web / 应用服务器层优化

Nginx 优化

  1. 工作进程:worker_processes auto; 等于 CPU 核数

  2. 每个 worker 连接数:worker_connections 65535;

  3. 开启 epoll 多路复用 use epoll;

  4. 长连接 keepalive,减少 TCP 握手开销

keepalive_timeout 65;
keepalive_requests 1000;
  1. 启用 gzip 压缩、静态资源缓存;静态文件交给 Nginx 处理,不转发后端。

  2. 开启多阶段缓存:proxy_cache 做后端响应缓存。

Java (SpringBoot) 应用服务优化

  1. 线程池:不要无界线程池,根据业务区分 IO 密集 / CPU 密集

    • IO 密集(数据库、RPC):线程数 > CPU 核数

    • CPU 密集:线程数 ≈ CPU 核数

  2. JVM 调优:堆大小,降低 FullGC 频率;优先 G1/ZGC,减少 STW 停顿。

  3. 禁用不必要的拦截器、序列化冗余字段。

误区:线程不是越多并发越高,线程过多会上下文切换暴涨,性能暴跌。

三、应用代码层面(最容易成为瓶颈)

  1. 异步化:非核心逻辑异步处理,消息队列解耦。

例:用户注册,发送短信、日志记录丢 MQ,接口只做入库返回,提升接口吞吐。

  1. 避免同步阻塞

    • 禁止循环内串行调用 RPC/DB;批量接口代替循环单条查询。

    • IO 密集场景使用异步非阻塞框架(WebFlux、Netty)。

  2. 锁优化

    • 缩小锁粒度,避免大锁;优先 CAS、分段锁;

    • 减少 synchronized 大块代码;避免全局锁。

  3. 内存对象复用,减少频繁 GC;避免大对象。

  4. 限流 & 熔断保护:高并发下防止雪崩,Sentinel/Hystrix。

四、缓存体系优化(提升并发的核心手段)

大部分系统瓶颈不在 CPU,在数据库 IO。缓存扛住大部分读请求。

  1. 多级缓存 本地缓存(Caffeine/Guava) → Redis分布式缓存 → 数据库

  • 热点数据放 JVM 本地缓存,省去网络开销;

  • Redis 做分布式缓存,集群、主从 + 哨兵,避免单点。

  1. 缓存策略:缓存预热、缓存过期策略,解决缓存击穿、穿透、雪崩。

  2. 静态资源缓存:CDN 加速图片、js/css,请求不回源服务器。

五、数据库并发优化(数据库往往是最大瓶颈)

MySQL

  1. 索引优化:避免全表扫描,避免索引失效;不滥用索引。

  2. 避免大事务:大事务持有锁时间长,引发锁等待、死锁,并发直接打垮。

  3. SQL 优化:禁止 select *;limit 大分页优化;join 尽量小表驱动大表。

  4. 读写分离:主库写,多个从库读,分担查询压力。

  5. 分库分表:单表千万级以上,水平拆分。

  6. 连接池:合理设置 maxActive,不要过大;数据库连接是昂贵资源。

其它

  • 热点大查询,走 OLAP 引擎 (Doris),不让业务库承担统计查询。

六、架构层面:水平扩展

  1. 负载均衡:Nginx / 硬件 LB/K8s Service,多台应用服务器水平扩容,把流量分摊多实例。

  2. 无状态设计:应用服务不要存会话在本机,session 放 Redis,才可以随意扩容。

  3. MQ 削峰填谷:瞬时高并发请求,通过消息队列异步处理,把突发流量转为平缓流量。

注意:MQ 要做好消息可靠性,防止消息丢失。

  1. 微服务拆分:隔离不同业务流量,避免一个模块拖垮整体。

七、网络优化

  1. 合理使用 HTTP 长连接、HTTP/2 / HTTP3,减少握手;

  2. 减少跨机房调用,尽量内网访问,降低 RTT;

  3. 减少接口往返次数,接口聚合,避免多次请求。

八、性能定位思路(先定位瓶颈,再优化,不要盲调参)

用工具定位瓶颈,不要上来就改参数:

  1. CPU:top、htop、pidstat,看是用户态高还是内核态高(上下文切换 cs)

  2. IO:iostat、vmstat,磁盘 IO 是否打满

  3. 网络:ss -s看 TCP 连接、TIME_WAIT 数量

  4. JVM:jstat、arthas 看 GC、线程栈

  5. MySQL:show processlist,慢查询日志

常见瓶颈排序:数据库慢 SQL > 锁竞争 > IO 阻塞 > GC 卡顿 > 线程池不合理 > 内核参数 > 硬件。

九、常见误区

  1. 服务器 CPU 越多,并发一定越高:业务是 IO 瓶颈时,再多 CPU 没用。

  2. 线程池开越大并发越高:线程过多上下文切换,性能恶化。

  3. 只调操作系统,不优化 SQL 代码:90% 并发问题根源在业务代码和数据库。

  4. 只做扩容,不做缓存:数据库很快被打垮。

简单总结落地优先级

  1. 先优化 SQL、业务代码,消除慢查询;

  2. 引入缓存,拦截大部分读请求;

  3. 操作系统、中间件合理参数调优;

  4. 异步 + MQ 削峰;

  5. 负载均衡水平扩容;

  6. 数据库读写分离、分库分表。


本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。

原文链接 https://www.yijunzhao.cn/archives/improve-server-concurrency-performance-guide

欢迎访问 小易撩挨踢

https://www.yijunzhao.cn/