减轻阿里云 ECS(云服务器)的系统负载,不能只盯着“降配”或者“加机器”这两条路看。这是一个系统工程,得从应用层、系统内核、存储 I/O、网络以及架构设计这几个维度分层去排查和优化。
很多新手一看到 CPU 飙高就想着扩容,其实很多时候是代码写得烂或者配置没调优导致的。下面我结合实战经验,梳理一套比较落地的优化思路:
1. 先定位瓶颈:别盲目下手
在动手改之前,先用工具看清楚到底是谁在占资源。
- 监控大盘:登录阿里云控制台,查看云监控(CloudMonitor)。重点关注 CPU 使用率、内存使用率、磁盘 IOPS、网络流入/流出带宽。
- 如果 CPU 高但 IO 低:通常是计算密集型任务或死循环。
- 如果 IO Wait 高:通常是数据库查询慢、日志写入频繁或磁盘性能不足。
- 如果带宽打满:通常是静态资源未缓存、视频流过大或遭受 CC 攻击。
- 服务器内部排查:
top/htop:看进程占用,注意wa(iowait) 和si(softirq) 的值。vmstat 1:观察上下文切换频率,如果 ctxt 极高,说明线程竞争严重。iotop:找出是哪个进程在疯狂读写磁盘。
2. 应用层优化(性价比最高)
大多数负载问题根源都在代码或中间件配置上。
- 缓存策略(Redis/Memcached):
- 这是最立竿见影的手段。把热点数据(如用户信息、商品详情、配置项)全部打入 Redis。
- 检查是否有“缓存穿透”或“缓存击穿”,设置合理的过期时间和互斥锁。
- 对于非实时性要求极高的数据,可以考虑本地缓存(Caffeine/Guava),减少 RPC 调用开销。
- 异步化处理:
- 将耗时操作(发邮件、生成报表、处理图片、写日志)通过消息队列(RocketMQ/Kafka/RabbitMQ)异步解耦。
- 主接口只负责快速响应业务逻辑,后台 Worker 慢慢处理后续动作。这样能极大降低瞬时并发对 CPU 的压力。
- SQL 优化:
- 开启慢查询日志(Slow Query Log),定期分析执行计划(EXPLAIN)。
- 确保所有 WHERE 条件都有索引覆盖,避免全表扫描。
- 大分页查询(LIMIT 10000, 10)要改为游标查询或 ID 范围查询。
- JVM/运行时调优:
- 如果是 Java 服务,检查 GC 日志。频繁 Full GC 会导致 Stop-The-World,让 CPU 看起来很高但实际干活很少。适当调整堆大小和垃圾回收器(G1/ZGC)。
3. 系统与内核参数调优
Linux 默认参数往往不是针对高并发场景优化的,稍微 tweak 一下就能提升不少吞吐量。
- 文件描述符限制:
- 高并发下容易触达
ulimit -n上限。修改/etc/security/limits.conf,增加 soft/hard nofile 值(如 65535)。
- 高并发下容易触达
- TCP 连接复用与 TIME_WAIT 处理:
- 调整
/etc/sysctl.conf:net.ipv4.tcp_tw_reuse = 1 # 允许重用 TIME-WAIT sockets net.ipv4.tcp_max_syn_backlog = 8192 net.core.somaxconn = 1024 net.ipv4.ip_local_port_range = 1024 65535 - 这些参数能显著缓解因大量短连接导致的端口耗尽或连接拒绝问题。
- 调整
- I/O 调度算法:
- 对于 SSD 云盘,推荐使用
none或mq-deadline调度器,避免传统cfq带来的额外开销。可以通过cat /sys/block/vda/queue/scheduler查看并修改。
- 对于 SSD 云盘,推荐使用
4. 存储与 I/O 优化
磁盘往往是隐形的杀手。
- 升级云盘类型:
- 如果还在用普通云盘(HDD),强烈建议升级为 ESSD PL0/PL1 或 SSD 云盘。IOPS 和吞吐量差距巨大,直接决定数据库和日志写入的速度。
- 分离读写:
- 不要把系统和数据放在同一个分区。如果可能,将数据库、日志、临时文件挂载到独立的云盘上,分散 I/O 压力。
- 日志轮转与压缩:
- 检查是否有日志文件无限增长。配置 logrotate,及时归档和删除旧日志。
- 对于高频写入的日志,考虑使用 async writer 或批量写入机制,减少 syscalls 次数。
5. 架构层面的“减负”
如果单机优化到了极限,就该考虑架构了。
- 动静分离 + CDN:
- 静态资源(JS/CSS/图片)必须放到 OSS + CDN。不仅提速访问,还直接省下了服务器的带宽成本和 CPU 渲染开销。
- 负载均衡(SLB/ALB):
- 不要单点扛流量。使用 ALB(应用型负载均衡)进行分发,后端挂多台 ECS。
- 开启健康检查,自动剔除异常节点。
- 弹性伸缩(ESS):
- 根据 CPU 使用率或自定义指标(如 QPS)设置伸缩组。高峰期自动增加实例,低谷期自动释放。这比长期购买大规格服务器更省钱,也更灵活。
- 数据库读写分离:
- 主库负责写,多个只读副本负责读。使用XX中间件(如 PolarDB Proxy 或 ShardingSphere)透明路由请求。
6. 安全与防御
有时候负载高是因为被攻击了。
- DDoS/CC 防护:
- 开启阿里云 DDoS 高防或 Web 应用防火墙(WAF)。
- 在 SLB 层面配置频率控制(Rate Limiting),限制单个 IP 的请求速率。
- 关闭不必要的服务:
- 清理不用的 systemd 服务,禁用开机自启的非必要进程,释放基础资源。
总结建议
- 第一步:看监控,定瓶颈(CPU/IO/Network)。
- 第二步:查代码,加缓存,搞异步(解决 80% 的应用层问题)。
- 第三步:调内核,升磁盘(解决底层性能瓶颈)。
- 第四步:上架构,做拆分(CDN、SLB、ESS、读写分离)。
记住,没有银弹。最好的方案是“组合拳”。另外,建议在测试环境充分压测后再上线变更,避免优化过程中引入新的 Bug。
云技术博客