在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

四、预防措施

  1. 建立内存监控基线,设置告警阈值(通常80%)
  2. 定期审核配置文件,避免过度分配
  3. 使用cgroups限制特定服务的最大内存使用
  4. 升级内核到较新版本,获得更好的内存管理

内存优化是一个持续的过程,需要结合业务特点不断调优。记住:留出足够的buffer比榨干每一寸内存更能保证系统稳定。