在IDC运维工作中,服务器内存占用过高是最常见的故障之一。本文将分享一套完整的排查思路和优化方案,帮助运维人员快速定位问题并解决。
一、快速排查命令
首先使用以下命令了解内存使用概况:
# 查看内存整体使用情况
free -h
# 按内存占用排序查看进程
ps aux --sort=-%mem | head -10
# 更直观的进程监控
htop二、常见内存占用大户
1. MySQL数据库
MySQL配置不当往往是内存消耗的主要原因。检查my.cnf中的以下参数:
innodb_buffer_pool_size:通常设置为物理内存的50-70%max_connections:过高会导致每个连接占用内存累加query_cache_size:8.0版本后已废弃,建议关闭
2. Nginx/Apache Web服务
- 检查worker进程数量是否合理
- 查看是否有大量keepalive连接占用内存
- PHP-FPM的进程管理配置是否适当
3. 缓存服务(Redis/Memcached)
- 设置maxmemory参数防止无限增长
- 配置合理的淘汰策略(volatile-lru或allkeys-lru)
三、内存优化实操
调整OOM Killer优先级
# 降低重要进程被OOM杀掉的概率
echo -1000 > /proc/<pid>/oom_score_adj启用Swap(谨慎使用)
虽然SSD时代swap性能尚可,但数据库服务不建议过度依赖swap。合理设置:
sysctl vm.swappiness=10定期清理缓存
# 清理pagecache
sync && echo 1 > /proc/sys/vm/drop_caches四、预防措施
- 建立内存监控基线,设置告警阈值(通常80%)
- 定期审核配置文件,避免过度分配
- 使用cgroups限制特定服务的最大内存使用
- 升级内核到较新版本,获得更好的内存管理
内存优化是一个持续的过程,需要结合业务特点不断调优。记住:留出足够的buffer比榨干每一寸内存更能保证系统稳定。
评论