阿里云服务器内存占用过高优化是指通过定位内存占用热点、调整系统与应用配置、清理缓存并合理扩展资源,降低内存使用率、避免内存溢出和提升服务器稳定性的操作。
快速定位内存占用来源
登录阿里云 ECS 后,执行以下命令查看内存使用情况:

free-h
输出中 used 表示已用内存,buff/cache 表示缓存和缓冲占用,available 表示可用内存,若 available 长期低于总内存的 10%,需要继续排查。
使用 top 按内存排序:
top-M
进入后按 Shift+M 按 %MEM 排序,记录占用最高的进程。
使用 ps 查看进程详细内存:
psaux--sort=-%mem|head-20
RSS 列表示进程实际占用的物理内存,单位 KB,找出异常进程后,判断是否属于业务进程、系统进程还是异常进程。
关闭不必要的系统服务
阿里云 ECS 默认会启动一些非必需服务,这些服务会占用部分内存,执行以下命令查看已启用服务:
systemctllist-unit-files--state=enabled
常见可关闭服务包括 postfix、auditd、abrt-ccpp、kdump 等,例如关闭 postfix:
systemctlstoppostfix systemctldisablepostfix
关闭 kdump:
systemctlstopkdump systemctldisablekdump
注意不要关闭 sshd、network、chronyd 等基础服务,否则会导致无法远程连接或时间不同步。
调整内核参数降低缓存压力
内存占用高不等于内存不足,Linux 会把空闲内存用于文件缓存,可以通过调整 swappiness 和 vfs_cache_pressure 控制缓存与交换行为。
编辑 /etc/sysctl.conf,添加:
vm.swappiness=10 vm.vfs_cache_pressure=50
执行 sysctl -p 生效。vm.swappiness 值越低,系统越少使用 swap;vm.vfs_cache_pressure 值越低,系统保留更多的文件缓存。
如果内存紧张且确认缓存无用,可以临时释放 page cache、dentries 和 inodes:
sync echo3>/proc/sys/vm/drop_caches
该操作会瞬间降低 buff/cache,但生产环境需谨慎,因为缓存被清空后,部分数据需要重新从磁盘读取,可能短暂影响 IO 性能。
优化 Nginx 与 Apache 内存占用
Nginx 优化
打开 Nginx 主配置文件 /etc/nginx/nginx.conf,调整以下参数:
worker_processesauto; worker_connections1024; keepalive_timeout15; client_body_buffer_size16k; client_max_body_size10m; gzipon; gzip_typestext/plaintext/cssapplication/jsonapplication/javascript;
worker_processes auto 让 Nginx 根据 CPU 核数创建工作进程,避免过多进程消耗内存。keepalive_timeout 降低保持连接时间,减少长时间占用内存的连接。client_body_buffer_size 设置较小缓冲区,避免大请求占用过多内存,开启 gzip 可以降低传输数据量,但会占用少量 CPU,需根据服务器 CPU 情况取舍。
Apache 优化
如果使用 Apache,建议切换到 event 工作模式,编辑 /etc/httpd/conf.modules.d/00-mpm.conf,确认加载:
LoadModulempm_event_modulemodules/mod_mpm_event.so
然后调整 /etc/httpd/conf.modules.d/00-mpm.conf 中的参数:
<IfModulempm_event_module> StartServers2 MinSpareThreads25 MaxSpareThreads75 ThreadLimit64 ThreadsPerChild25 MaxRequestWorkers150 MaxConnectionsPerChild1000 </IfModule>
这些参数限制了同时处理的连接数和每个进程的线程数,避免 Apache 在高并发下创建过多线程占用内存。
优化 MySQL 与 Redis 内存
MySQL 内存优化
编辑 MySQL 配置文件 /etc/my.cnf,根据实际内存调整:
[mysqld] innodb_buffer_pool_size=512M max_connections=200 table_open_cache=400 tmp_table_size=32M max_heap_table_size=32M performance_schema=OFF
innodb_buffer_pool_size 是 MySQL 最大的内存消耗项,通常设置为服务器物理内存的 50%,如果服务器还运行其他应用,需要适当降低。max_connections 不宜设置过大,每个连接都会分配内存,过大会导致内存耗尽。performance_schema 在不需要监控时可以关闭,能节省约几百 MB 内存。
修改后重启 MySQL:
systemctlrestartmysqld
Redis 内存优化
编辑 Redis 配置文件 /etc/redis.conf:
maxmemory512mb maxmemory-policyallkeys-lru
maxmemory 限制 Redis 最大使用内存,避免 Redis 无限增长占用系统内存。allkeys-lru 策略在内存达到上限时淘汰最近最少使用的键。
Redis 是纯缓存场景,可以关闭持久化:
save"" appendonlyno
关闭 RDB 和 AOF 持久化能减少内存和磁盘开销,但会丢失数据,需要根据业务场景决定。
优化 PHP-FPM 进程数量
PHP-FPM 进程管理方式对内存影响很大,编辑 /etc/php-fpm.d/www.conf:
pm=dynamic pm.max_children=50 pm.start_servers=10 pm.min_spare_servers=5 pm.max_spare_servers=15 pm.max_requests=1000
pm.max_children 越大,PHP-FPM 创建的子进程越多,内存占用越高,计算方法是:每个 PHP 进程平均内存 × max_children 不能超过服务器剩余内存。
如果内存非常紧张,可以将 pm 改为 ondemand:
pm=ondemand pm.max_children=50 pm.process_idle_timeout=10s
ondemand 模式在有请求时才创建进程,空闲 10 秒后回收,能显著降低常驻内存。
同时启用 OPCache:
opcache.enable=1 opcache.memory_consumption=128 opcache.max_accelerated_files=4000
OPCache 将 PHP 脚本编译结果缓存在内存中,避免重复编译,减少每个请求的临时内存分配。
设置 Swap 交换分区
当物理内存不足时,swap 可以提供额外空间,阿里云 ECS 有些镜像默认不启用 swap,可以手动创建。
创建 2GB swap 文件:
fallocate-l2G/swapfile chmod600/swapfile mkswap/swapfile swapon/swapfile
写入 /etc/fstab 实现开机自动挂载:
/swapfileswapswapdefaults00
使用 free -h 查看 swap 是否生效,swap 只能缓解内存不足,无法替代物理内存,大量使用 swap 会导致性能下降,因此仍需优化实际内存占用。
检查并处理异常进程
内存占用过高可能是生产病度、内存泄漏或异常脚本导致,使用 top 找到高内存进程后,执行:
ls-l/proc/PID/exe cat/proc/PID/cmdline
确认进程路径和启动命令,如果路径可疑,例如位于 /tmp、/var/tmp 下的随机名称文件,可能是生产程序。
使用 kill -9 PID 终止进程,并删除相关文件,同时检查计划任务:
crontab-l ls-l/etc/cron.d/ ls-l/var/spool/cron/
删除可疑计划任务,重启服务器后再观察内存占用是否恢复正常。
使用阿里云监控与告警
阿里云 ECS 提供免费的云监控,可以查看内存使用率趋势,在 CloudMonitor 中为内存使用率设置告警阈值,例如超过 85% 触发告警。
安装云监控插件:
wgethttp://cloudmonitor-agent.oss-cn-hangzhou.aliyuncs.com/cloudmonitor-agent-1.2.24.tar.gz tar-zxvfcloudmonitor-agent-1.2.24.tar.gz cdcloudmonitor-agent-1.2.24 ./install.sh
安装后可以在控制台看到内存指标,配置告警规则,当内存持续过高时通知运维人员。
升级实例规格或横向扩容
如果上述优化后内存仍然不足,说明业务本身需要更多内存,可以在阿里云 ECS 控制台进行变配,选择更高内存规格,变配前建议创建快照,防止数据丢失。
对于高并发业务,可以考虑使用负载均衡配合多台 ECS 分担压力,或者将 Redis、MySQL 迁移到云数据库,减少应用服务器的内存压力。
同时可以使用弹性伸缩(Auto Scaling)根据内存使用率自动增加或减少实例,保证业务稳定的同时控制成本。