服务器性能优化实战:从问题发现到完美调优
背景:一次意外的性能之旅
最开始只是想看看服务器上跑着什么进程,没想到这一看,开启了一次深度的服务器性能优化之旅。
从一个简单的ps aux
命令开始,我发现了一个有趣的现象:
MySQL占用261MB内存(25.9%)
Apache跑了十几个进程
系统里还有一堆不知道干什么的服务
这激发了我的好奇心:这台1GB内存的小服务器,到底能压榨出多少性能?
第一阶段:系统瘦身
清理无用服务
首先发现了几个"占着茅坑不拉屎"的服务:
# Postfix邮件服务 - 我根本不需要发邮件
sudo systemctl stop postfix
sudo systemctl disable postfix
# unattended-upgrades - 自动更新服务,占内存还可能搞坏系统
sudo systemctl disable unattended-upgrades
# networkd-dispatcher - 网络事件处理,静态IP用不着
sudo systemctl disable networkd-dispatcher
这一轮操作下来,释放了约22MB内存。看起来不多,但这只是开始。
数据库大扫除
用phpMyAdmin看了看数据库,发现了两个巨无霸:
pro库:714MB
geolbs库:681MB
仔细一看,都是些多年前的测试数据和垃圾数据。一番清理后:
优化前:1.7GB
优化后:475MB
释放空间:943MB!
这个效果立竿见影。重启MySQL后,内存占用从261MB降到了182MB,节省了79MB内存。
第二阶段:性能测试
压测神器:Apache Bench
想知道服务器真实性能,最直接的方法就是压测。用link-server作为压测机,对小程序API进行测试:
# 基础测试
ab -c 5 -n 50 https://xdjsq.codekissyoung.com/api/test
第一次结果让我皱眉:
吞吐量:19.68 RPS
平均响应时间:254ms
SSL握手时间:188ms
188ms的SSL握手时间?这也太夸张了!
SSL性能调优:从瓶颈到飞跃
问题出在SSL配置上。经过一番调研,发现了几个关键优化点:
# 延长SSL会话复用时间
SSLSessionCacheTimeout 600 # 从300改为600秒
# 确保Keep-Alive启用
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
优化后再测试,效果惊人:
优化前:19.68 RPS, 254ms响应
优化后:43.94 RPS, 114ms响应
性能提升:123%!
更重要的是,Keep-Alive生效后,大部分请求的连接时间变成了0ms,SSL握手得到了完美的复用。
高并发测试:寻找极限
既然优化效果这么好,那就测试一下极限在哪里:
# 20并发测试
ab -c 20 -n 200 -k https://xdjsq.codekissyoung.com/api/test
结果:96.14 RPS, 208ms响应
# 50并发测试
ab -c 50 -n 500 -k https://xdjsq.codekissyoung.com/api/test
结果:107.67 RPS, 464ms响应
107 RPS的HTTPS性能,对于一台1GB内存的小服务器来说,这个成绩相当不错了!
第三阶段:架构思考
MySQL分离的诱惑与现实
看着182MB的MySQL内存占用,我动了"歪脑筋":能不能把数据库迁移到link-server上?
理论很美好:
释放182MB内存
数据库独立scaling
架构更清晰
但现实很骨感:
# 测试两台服务器延迟
ping 120.77.216.243
结果:42ms往返延迟
42ms的网络延迟,对于数据库访问来说还是有点高的。特别是考虑到:
数据库有475MB,不全在内存缓存中
每次查询都要走网络,延迟累积
网络故障会影响整个系统可用性
经过权衡,决定保持单机架构。毕竟当前性能已经很好,"不要修复没有破坏的东西"是最明智的选择。
Apache配置的艺术平衡
发现Apache使用的是prefork MPM + mod_php,这是内存占用较高但最稳定的组合。
理论上可以切换到worker或event MPM来节省内存,但考虑到:
需要重新配置PHP-FPM
25+个虚拟主机需要重新测试
稳定性风险较高
当前性能已经满足需求
最终选择保持现有架构不变,这体现了一个重要的运维原则:稳定性优于极致性能。
关键收获:优化的哲学
1. 数据驱动的决策
每一个优化决策都基于具体的数据:
内存占用分析:
ps aux --sort=-%mem
磁盘使用检查:
du -sh
性能测试验证:
ab
压测网络延迟测量:
ping
没有测量就没有优化,盲目调优往往适得其反。
2. 收益递减定律
优化过程中明显感受到收益递减:
数据清理:释放943MB,效果显著
MySQL配置:节省79MB,价值很高
SSL优化:性能提升123%,立竿见影
微调服务:节省几MB,意义不大
把精力花在影响最大的地方,而不是纠结于细枝末节。
3. 稳定性vs性能的平衡
面对多个优化选择时,始终把稳定性放在第一位:
保持Ubuntu 18.04而不升级(避免兼容性问题)
保持prefork MPM而不切换(避免配置复杂化)
保持单机架构而不分离(避免网络依赖)
这些决策看起来"保守",但对于生产环境来说是最明智的。
最终成果:性能的蜕变
优化前后对比
指标 | 优化前 | 优化后 | 改善 |
---|---|---|---|
磁盘占用 | 1.7GB | 475MB | -72% |
MySQL内存 | 261MB | 182MB | -30% |
HTTPS性能 | 19.68 RPS | 107.67 RPS | +447% |
可用内存 | ~300MB | 478MB | +59% |
系统承载能力评估
基于107 RPS的性能,这台服务器可以支撑:
轻量小程序:3000-5000并发用户
日活用户:20,000-50,000(假设5-10%同时在线)
每分钟请求:6400个请求
对于我的德州扑克计分器小程序来说,这个性能完全够用了。
写在最后:运维的智慧
这次优化过程让我深刻体会到,好的运维不是追求极致的参数,而是在性能、稳定性、可维护性之间找到最佳平衡点。
有时候,知道什么时候停止优化,比知道怎么优化更重要。
当系统已经满足业务需求,运行稳定时,保持现状往往比继续折腾更明智。毕竟,一台能稳定运行、性能良好的服务器,胜过十台被过度优化搞崩的服务器。
PS:这次会话最有价值的不是具体的优化技巧,而是整个分析和决策的思维过程。数据驱动、风险评估、收益权衡——这些才是运维工作的核心竞争力。
2025-08-29 记录