服务器内存占用过高问题解决分享
最近一段时间,我的服务器频繁出现了一个让人头疼的问题 —— 内存占用过高。这个问题直接导致了网站运行变得卡顿,无论是页面加载速度,还是用户在网站上进行操作时的响应效率,都大幅下降。
要知道,网站的流畅度直接关系到访客体验,一旦出现卡顿,不仅会让正在浏览的用户失去耐心,可能直接关闭页面离开,还会影响用户对网站的整体印象,甚至可能导致潜在客户的流失,对网站的长期发展十分不利。
面对问题,寻求解决方案
面对这个棘手的情况,我多次与阿里云官方进行了沟通。在沟通过程中,我详细说明了服务器内存占用过高的现象、网站卡顿的具体表现以及由此带来的不良影响。经过双方的反复交流和探讨,阿里云方面最终为我提供了几个针对性的解决方法,后续我会将这几个方法详细整理出来,与大家分享,希望能给遇到类似问题的朋友提供一些参考。
使用atop工具查找问题,更快找到针对方法
Atop是一款专为监控Linux系统资源与进程设计的工具,它能详尽地报告所有进程的活动情况。该工具以固定频率记录系统和进程的动态。在ECS实例遇到问题时,用户可以获取相应的atop日志文件以进行分析。本文旨在介绍如何在Linux实例中安装、使用以及自定义atop的配置。
Atop收集的数据包括CPU、内存、磁盘和网络资源的利用情况,以及进程的运行状态,并以日志文件的形式保存在磁盘上。对于每一个进程,系统会显示其CPU使用率、内存占用、磁盘使用率、优先级、用户名、状态以及退出码等信息。用户可以通过修改atop的配置文件来自定义日志的采集频率、日志文件的存储路径和轮转策略等参数。
本步骤以Ubuntu操作系统的ECS实例为例,为您介绍如何安装atop监控工具。
远程连接ECS实例。
按照您的操作系统,执行对应的安装命令。
说明如果上述列举的操作系统未包含您的发行版,请访问atop
官方网站以获取安装信息。更多内容,请参见下载atop。
更新软件源中的所有软件列表。
sudo apt update
执行如下命令,安装atop。
sudo apt install -y atop
执行如下命令,启动atop服务。
sudo systemctl start atop
查看实时系统指标
每 5 秒查看一次系统指标。
atop 5
查看当前时间之后5分钟内(共30次,间隔10秒)的系统指标。
atop -M 10 30
查看当前时间之后10分钟(10 次,间隔 60 秒)的系统指标,并将结果写入文件。
atop -M 60 10 > /log/atop.mem
排查异常进程
如果发现某个进程占用大量内存,可以通过以下命令结束该进程(请确保了解该进程的作用,避免误操作):
sudo kill -15 <PID>
如果atop显示都是正常的程序,后台安全扫描也没有挖矿、webshell等注入病毒情况,可以使用下述方案优化
如果怀疑是恶意程序,请检查安全告警处理。
方法一:配置Linux实例的swap分区
在Linux操作系统中,当系统需求增加内存资源且物理内存已达到上限时,会启用swap分区(即交换空间)。交换空间的主要作用是为不活跃的进程及数据提供临时存储,从而避免因物理内存不足而导致的系统崩溃。它实际上充当了物理内存的补充,确保即便在物理内存耗尽的情况下,系统仍能保持稳定运行。
重要
启用swap分区可能会引起内存I/O性能的降低。在ECS实例内存不足的情况下,建议优先通过调整实例规格来提升实例的物理内存。若因业务需求必须开启swap分区,请参照本文提供的配置方法。
若您采用的是常规云盘,则不推荐启用swap分区,理由是其I/O性能相对较弱,可能会引起性能降低和I/O瓶颈。至于其他类型的云盘,是否使用swap分区应结合具体情况进行判断,并需合理配置,以减少swap分区的频繁操作,从而保障系统的性能与稳定性。
查看swap分区配置
远程登录Linux实例。
执行以下命令,查看swap分区的配置。
swapon --show
如果回显信息为空,表示系统没有swap分区,您可以根据需要配置swap分区。
如果出现类似以下回显信息,表示系统已开启swap分区,您可以根据需要关闭swap分区。
NAME TYPE SIZE USED PRIO
/var/swap file 1024M 0B -2
配置swap分区
开启swap分区
1.执行以下命令,创建用于交换分区的文件。
sudo dd if=/dev/zero of=/var/swap bs=1M count=1024
说明:
of
的值/var/swap
是变量,表示交换分区的标识,请您自定义设置,该变量值不能和已有分区标识相同。bs
和count
的值表示创建的交换文件的大小,您可以自定义设置,该命令中bs=1M count=1024
表示设置交换文件的大小为1 GB。
2.执行以下命令,将文件格式化为swap分区。
sudo mkswap /var/swap
说明:
如果使用mkswap
命令创建swap时出现类似mkswap: error: swap area needs to be at least 40 KiB
报错,表示指定的swap分区文件太小,swap分区文件至少应该大于40 KB,您需要重新创建更大的交换文件。
3.执行以下命令,开启swap分区。
sudo chmod 600 /var/swap
sudo swapon /var/swap
4.执行以下命令,验证swap分区是否已开启。
swapon --show
5.如下回显信息表示swap分区已开启。
NAME TYPE SIZE USED PRIO
/var/swap file 1024M 0B -2
6.在/etc/fstab
文件中写入新分区信息,配置开机自动挂载swap分区。
echo '/var/swap none swap defaults 0 0' | sudo tee -a /etc/fstab
7.查看新分区信息。
cat /etc/fstab
8.结果如下所示,可以查询已配置的swap分区信息。
/var/swap none swap defaults 0 0
9.重启ECS实例后,再次检查swap分区是否自动启用。
swapon --show
10.(条件可选)编辑/etc/rc.local
文件, 排查是否有swapoff -a
命令。如果有将其修改为 swapon -a
,确保 /etc/rc.local
中的命令与 /etc/fstab
的配置一致,以确保swap分区能够正常启用。
相关操作
在Linux系统中,可以通过设置swappiness
参数来确定系统对swap分区的使用原则,swappiness
参数取值范围为0到100。
swappiness
值越低,表示最大限度地使用物理内存,物理内存使用完毕后,才会使用swap分区。swappiness
值越高,表示积极地使用swap分区,并且把内存中的数据及时地置换到swap分区。
重要
调整swap参数是一项需谨慎执行的任务,不恰当的修改可能引发系统性能下滑或虚拟内存使用不符合预期。请根据实际业务场景,在充分理解参数功能的基础上谨慎操作。若您不确定是否需要进行调整,建议维持默认配置。
编辑
/etc/sysctl.conf
文件,以物理内存少于10%时才使用swap分区为例,需要调整以下参数值。vm.swappiness=10
保存并退出,然后执行以下命令使配置生效。
sudo sysctl -p
执行以下命令,验证
swappiness
参数配置是否生效。cat /proc/sys/vm/swappiness
关闭swap分区
执行以下命令,关闭swap分区。
sudo swapoff /var/swap
说明
其中
/var/swap
为swap分区标识,请您根据实际环境替换。编辑
etc/fstab
文件,并删除类似以下的swap相关挂载信息,取消swap自动挂载。/var/swap none swap defaults 0 0
保存并退出,然后执行以下命令,确认swap分区是否已经关闭。
swapon --show
如果回显信息为空,表示系统已关闭swap分区。
使用方法一前后对比
方法二:优化代码和数据库查询
首先,我们可以对网站的代码进行优化。这包括检查并修复代码中的内存泄漏、减少不必要的内存分配等。例如,我们可以使用性能分析工具来定位代码中的性能瓶颈,然后针对性地进行优化。
此外,我们还需要对数据库查询进行优化。过长的查询语句、复杂的关联查询等都可能导致内存占用过高。我们可以通过以下几种方式来优化数据库查询:
使用合适的索引,提高查询效率。
避免使用SELECT *,只查询需要的字段。
使用分页查询,减少单次查询的数据量。
方法三:增加服务器资源
如果优化代码和数据库查询后,内存占用问题仍然存在,我们可以考虑增加服务器资源。这包括增加物理内存、提高CPU性能等。具体操作如下:
购买更高配置的服务器,增加物理内存和CPU性能。
使用阿里云的弹性伸缩功能,根据实际需求自动调整服务器资源。
优化服务器配置,例如调整内存分配策略、优化操作系统等。
总结
服务器内存占用过高致网站卡顿,可通过 atop 工具排查异常进程,搭配配置 Linux swap 分区(注意常规云盘不推荐)、优化代码与数据库查询、增加服务器资源(如升级配置或用弹性伸缩)解决。
鸣谢:阿里云
参考信息:
默认评论
Halo系统提供的评论