服务器响应变慢、并发上不去时,直接扩容硬件往往是成本最高的选择。实际上,多数性能损耗来自系统默认参数与业务场景不匹配。这些默认设置偏保守,照顾的是通用环境,在高负载下会频繁触发限制。通过从操作系统内核到上层应用的逐层调整,可以在不升级硬件的前提下显著改善响应速度与吞吐量。
内核参数决定服务器处理网络连接和文件读写的基础能力,也限制进程和用户可占用的系统资源总量。优先处理这两块,后续中间件和应用层的优化才有支撑。
大量短连接请求完成后,连接会进入 TIME_WAIT 状态,占用本地端口资源。请求越频繁,这种残留连接越多,最终导致新连接无法建立。
修改完 /etc/sysctl.conf 后执行 sysctl -p 即可生效。判断是否遇到端口耗尽问题,可用 ss -s 命令查看 TIME_WAIT 数量;若数值持续超过几万,且新连接频繁失败,说明回收参数确实需要调整。
数据库、缓存服务等进程同时打开的文件句柄可达数千个,系统默认的 1024 上限会直接导致服务报错甚至中断。编辑 /etc/security/limits.conf,为指定用户或进程组增加 nofile 和 nproc 的数值即可解决。需要注意的是,修改后必须重新登录会话或重启相关进程,新限制才会加载。调整幅度应循序渐进,参考实际运行时的打开文件数来设定,因为过高的权限也可能带来安全隐患。
Nginx、Tomcat 等组件出厂参数同样偏向兼容性设计,在高流量环境下往往成为瓶颈。根据服务器资源实况进行针对性调整,能明显提升请求处理效率。
先将 worker_processes 设为物理 CPU 核心数,保证每个核心处理一个进程,减少调度开销。随后调高 worker_connections,增加单进程可承载的连接数。静态文件响应方面,开启 sendfile 和 tcp_nopush,能绕过用户态和内核态之间的无用数据拷贝,显著加快文件传输速度。
执行改动前用 nginx -t 验证配置语法是否正确,确认无误后再通过 nginx -s reload 平滑生效。这种方式不会中断现有连接,但仍建议避开流量高峰时段。
Tomcat 默认线程数依据低配置环境设定,生产环境并发稍高就会出现排队等待。根据可用内存和业务接口的平均响应时间,适当提高 minSpareThreads 和 maxThreads 的初始值与上限值。同时设置合理的 maxKeepAliveRequests,避免客户端复用同一长连接长期占住线程资源,把新请求挡在门外。
线程池参数并非越大越好。线程数过高会加剧 CPU 上下文切换,整体吞吐反而下降。建议结合压测工具观察活跃线程数和失败连接数,每轮只调整一个参数,观察稳定运行一段时间后再继续。
系统与中间件的调优解决了基础设施问题,但真正决定单请求响应时长的,仍是应用代码和数据库交互语句本身的效率。
打开数据库慢查询日志,记录执行时间超过阈值(如 1 秒)的语句。针对高频出现的慢 SQL,优先分析其执行计划,检查是否存在全表扫描。常用的改进方向包括:为 WHERE 条件常用列建立复合索引;避免在索引列上使用函数运算导致索引失效;必要时对统计报表类查询改用汇总表或缓存。
建立索引并非越多越好。每个索引都会拖慢写入性能,占用额外存储。一张表中超过五六个单列索引时,应该考虑合并或删除冗余项,只保留高命中率和高区分度的字段组合。
应用频繁读取但变化不频繁的数据,应积极引入缓存层,如 Redis 或本地内存缓存。缓存键设计要注意有效期和淘汰策略,防止缓存击穿或雪崩。批量操作方面,避免在循环中逐条发送数据库请求,改用批量插入或批量查询接口,一次网络往返完成多组数据处理。
以订单状态更新为例,逐条执行 UPDATE 需要 N 次交互,改用 CASE WHEN 的多条合并语句只需一次交互,耗时可能下降一个数量级。编写代码时多留意这类有明显改进空间的循环场景。
调优讲究先后顺序和验证闭环,不必追求一步到位。从系统层到应用层逐级排查,每次改动都要有对应的观测数据支撑,才能避免盲目调试。
监控是贯穿始终的手段。接入开源的 Prometheus 加 Grafana 方案,可以持续记录请求延迟分位数、线程池占用率、JVM 内存等数据,让每次调整都能用数据说话,而不是凭感觉判断。
有风险,但可控。像 tcp_tw_reuse、somaxconn 这类参数对绝大多数业务是安全的,而涉及内存分配、文件系统挂载方式的参数则需要谨慎。建议在测试环境先行验证,确认稳定后再应用到生产机器,且每次修改都备份原始配置,方便回退。
调优能消除软件层面的浪费,释放出被默认配置压制的硬件潜力。比如从单核利用率偏低、连接大量排队,到满载处理请求,吞吐量可能提升数倍。但如果 CPU 和内存本身常年处于 90% 以上的繁忙状态,调优空间就有限,此时增加硬件仍有必要。
没有绝对的先后,但推荐先做系统层和中间件的基础调优,它能快速扩大并发承接能力。随后将精力集中到应用层瓶颈上,因为单个请求的响应速度主要取决于代码和 SQL 效率。两者互为条件,基础能力不足时,应用层再快也难以处理大量并发请求。
服务器性能优化是一个层层递进的过程,核心思路是先用最小的改动消除最直接的瓶颈。建议从内核参数检查和文件句柄放开开始,处理完中间件连接池与线程配置后,再回归到应用代码和数据库查询层面。每完成一项调整,都记录前后数据对比,保持可持续性的观察。性能改善通常来自多个小优化的叠加,逐层修补,才能让现有硬件真正物尽其用。