原创

Linux服务器开启Swap虚拟内存

最近因为服务器内存不足,尝试开启Swap虚拟内存缓解内存紧张的状态,记录一下。

一、开启Swap

1.创建Swap文件

swap一般建议大小和物理内存相等,我们服务器内存是2G,所以使用下面命令在根目录下创建一个2G的缓存文件:

fallocate -l 2G /swapfile

2.设置文件权限

文件权限需要设置为仅root用户可读,通过下面命令设置:

chmod 600 /swapfile

3.格式化Swap文件

mkswap /swapfile

4.启用Swap文件

swapon /swapfile

5.查看Swap状态

可以通过下面命令查看Swap是否启用:

free -h          # 查看内存
swapon --show     # 查看Swap
cat /proc/swaps   # 查看Swap详细信息

6.设置开机自动挂载

通过下面命令在/etc/fstab文件中添加Swap配置,可以开机自动加载:

echo '/swapfile none swap sw 0 0' >> /etc/fstab

二、测试Swap

Swap开启后可能会导致性能下降,因为服务器上部署的后端都是通过nginx代理的,我们接下来访问web页面看下nginx的日志。

测试的时候需要在nginx日志中打开下面两个参数查看请求处理链路的耗时:

参数说明:

  • request_time:请求处理总耗时(单位:秒)

  • upstream_response_time:请求在上游服务处理耗时(单位:秒)

查看访问请求日志:





可以看到blog首页的处理时间很快只有零点几秒的时间就响应了,但是matomo的请求后台处理时间达到了二十秒,这样肯定是不行的。

我们让AI写个脚本,看系统将哪些进程放到Swap中了,脚本内容如下:

#!/bin/bash
echo "正在分析Swap使用情况..."
echo "======================================================"
echo "PID | 进程名 | Swap占用(KB)"
echo "======================================================"

# 修复空值判断逻辑,添加错误处理
for pid_dir in /proc/[0-9]*; do
    pid=$(basename "$pid_dir")
    # 检查进程是否有效
    if ! kill -0 "$pid" 2>/dev/null; then
        continue
    fi
    
    swap_used=$(awk '/Swap:/ {sum += $2} END {print sum}' "$pid_dir/smaps" 2>/dev/null)
    # 处理空值情况
    if [ -z "$swap_used" ]; then
        swap_used=0
    fi
    
    if [ "$swap_used" -gt 0 ]; then
        process_name=$(ps -p "$pid" -o comm= 2>/dev/null)
        printf "%5s | %-20s | %s\n" "$pid" "$process_name" "$swap_used"
    fi
done | sort -k3 -nr

执行脚本后输出如下:

可以看到mysql、java、docker等程序都有部分数据被放到了Swap中,如果访问请求中正好使用到了在swap中的数据,那么响应速度就有可能从毫秒级变成了几十秒了,这就很影响用户体验了。

三、关闭Swap

因为响应速度太慢,所以我们需要关闭Swap虚拟内存。

1.关闭所有swap

swapoff -a

注意:执行swapoff时,系统会将Swap里的数据写回到内存中。如果内存不足,可能会触发OOM Killer杀死进程。

2.取消开机自动加载

编辑/etc/fstab文件,删除swap相关行:

vi /etc/fstab

光标移动到对应行,使用dd删除后输入:wq!保存:

3.移除 Swap 文件

rm /swapfile

4.重启系统

reboot

关闭swap后最好重新启动下系统,不重启系统的话也需要重启服务器上所有服务应用,不然应用可能会意外崩溃或者假死。

重启后内存占用变少了。。。


扩展说明:

1.开启swap后可能会导致系统性能下降,docker和kubernetes官方建议禁用swap。


正文到此结束
本文目录