阿里云服务器内存占用过高优化

阿里云服务器内存占用过高优化

  • admin admin
  • 2026-09-12
  • 2720
  • 0

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

优惠价格:¥ 4
当前位置:首页 > 阿里云虚拟主机 > 阿里云服务器内存占用过高优化
详情介绍

阿里云服务器内存占用过高优化是指通过定位内存占用热点、调整系统与应用配置、清理缓存并合理扩展资源,降低内存使用率、避免内存溢出和提升服务器稳定性的操作。

快速定位内存占用来源

登录阿里云 ECS 后,执行以下命令查看内存使用情况:

阿里云服务器内存占用过高优化  第1张

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

常见可关闭服务包括 postfixauditdabrt-ccppkdump 等,例如关闭 postfix

systemctlstoppostfix
systemctldisablepostfix

关闭 kdump

systemctlstopkdump
systemctldisablekdump

注意不要关闭 sshdnetworkchronyd 等基础服务,否则会导致无法远程连接或时间不同步。

调整内核参数降低缓存压力

内存占用高不等于内存不足,Linux 会把空闲内存用于文件缓存,可以通过调整 swappinessvfs_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)根据内存使用率自动增加或减少实例,保证业务稳定的同时控制成本。

0