最近一段时间,我的服务器频繁出现了一个让人头疼的问题 —— 内存占用过高。这个问题直接导致了网站运行变得卡顿,无论是页面加载速度,还是用户在网站上进行操作时的响应效率,都大幅下降。
要知道,网站的流畅度直接关系到访客体验,一旦出现卡顿,不仅会让正在浏览的用户失去耐心,可能直接关闭页面离开,还会影响用户对网站的整体印象,甚至可能导致潜在客户的流失,对网站的长期发展十分不利。
面对问题,寻求解决方案
面对这个棘手的情况,我多次与阿里云官方进行了沟通。在沟通过程中,我详细说明了服务器内存占用过高的现象、网站卡顿的具体表现以及由此带来的不良影响。经过双方的反复交流和探讨,阿里云方面最终为我提供了几个针对性的解决方法,后续我会将这几个方法详细整理出来,与大家分享,希望能给遇到类似问题的朋友提供一些参考。
Atop工具使用与系统优化指南
Atop是一款专为监控Linux系统资源与进程设计的工具,它能详尽地报告所有进程的活动情况。该工具以固定频率记录系统和进程的动态。在ECS实例遇到问题时,用户可以获取相应的atop日志文件以进行分析。本文旨在介绍如何在Linux实例中安装、使用以及自定义atop的配置。
Atop收集的数据包括CPU、内存、磁盘和网络资源的利用情况,以及进程的运行状态,并以日志文件的形式保存在磁盘上。对于每一个进程,系统会显示其CPU使用率、内存占用、磁盘使用率、优先级、用户名、状态以及退出码等信息。用户可以通过修改atop的配置文件来自定义日志的采集频率、日志文件的存储路径和轮转策略等参数。
一、安装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分区的频繁操作,从而保障系统的性能与稳定性。
1. 查看swap分区配置
远程登录Linux实例。
执行以下命令,查看swap分区的配置:
swapon --show
如果回显信息为空,表示系统没有swap分区,您可以根据需要配置swap分区。
如果出现类似以下回显信息,表示系统已开启swap分区,您可以根据需要关闭swap分区。
NAME TYPE SIZE USED PRIO
/var/swap file 1024M 0B -2
2. 配置swap分区
开启swap分区
执行以下命令,创建用于交换分区的文件:
sudo dd if=/dev/zero of=/var/swap bs=1M count=1024说明: of的值/var/swap是变量,表示交换分区的标识,请您自定义设置,该变量值不能和已有分区标识相同。
bs和count的值表示创建的交换文件的大小,您可以自定义设置,该命令中bs=1M count=1024表示设置交换文件的大小为1 GB。
执行以下命令,将文件格式化为swap分区:
sudo mkswap /var/swap说明: 如果使用mkswap命令创建swap时出现类似mkswap: error: swap area needs to be at least 40 KiB报错,表示指定的swap分区文件太小,swap分区文件至少应该大于40 KB,您需要重新创建更大的交换文件。
执行以下命令,开启swap分区:
sudo chmod 600 /var/swapsudo swapon /var/swap执行以下命令,验证swap分区是否已开启:
swapon --show如下回显信息表示swap分区已开启:
NAME TYPE SIZE USED PRIO/var/swap file 1024M 0B -2在/etc/fstab文件中写入新分区信息,配置开机自动挂载swap分区:
echo '/var/swap none swap defaults 0 0' | sudo tee -a /etc/fstab查看新分区信息:
cat /etc/fstab结果如下所示,可以查询已配置的swap分区信息:
/var/swap none swap defaults 0 0重启ECS实例后,再次检查swap分区是否自动启用:
swapon --show(条件可选)编辑/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 分区(注意常规云盘不推荐)、优化代码与数据库查询、增加服务器资源(如升级配置或用弹性伸缩)解决。
鸣谢:阿里云
参考信息: