大约 2 分钟

一种简单的 Linux 内存不足抢救方案

一种简单的 Linux 内存不足抢救方案
Photo by Andrey Matveev / Unsplash

0X00 正文

前几天尝试用自己的服务器通过 docker 启一个新服务,没注意这个服务需要的内存比较大(我的服务器只有 2G 内存),导致 docker compose up -d 命令敲下去不到一分钟服务器直接卡死了......

当时还没意识到是内存不足导致的问题,以为是 CPU 卡住了,毕竟一般情况下服务刚启动的时候确实会占用比较多的资源。所以直接摆烂,等它一会儿好了。半个小时之后发现服务器还是卡死状态,ssh 也上不去,所以干脆去云平台重启。发现云平台的监控上已经看不到CPU/内存的占用率了,意味着装在服务器里的 agent 也已经完蛋了。而且,重启服务器也没有什么效果。

好在云平台可以通过类似 IPMI 的方式直接接入到服务器的 console,所以可以通过 console 登陆。虽然每一步的操作都非常非常卡,敲一串命令要等很久才能回显。使用 free -h 检查了内存占用情况之后发现确实是内存瓶颈,并且系统没有配置交换分区,所以才出了下面的这个骚招:

  1. 使用 free -h 确认当前内存使用情况,发现内存爆满且没有交换分区
  2. 意识到 Linux 所谓的「万物皆文件」,决定在没有空闲分区的情况下生造一个交换分区出来
  3. 使用 dd if=/dev/zero of=SWAP_FILE bs=4k count=$((256*1024*4)) 创建一个 4G 大小的块文件
  4. 使用 mkswap SWAP_FILE 将其格式化成 swap 分区
  5. 使用 swapon SWAP_FILE 挂载交换分区
  6. 系统活过来了

⚠️ 注意:使用 swapon 只是临时挂载,重启会失效,所以需要通过常规手段增加内存(至少要增加交换分区)

dd if=/dev/zero of=SWAP_FILE bs=4k count=$((256*1024*4)) 是什么意思?

  1. dd 命令是一个硬盘层面的拷贝命令
  2. if=/dev/zero of=SWAP_FILE 指的是 input file/dev/zero(这是一个会源源不断输出二进制 0 的设备),output fileSWAP_FILE
  3. bs=4k count=$((256*1024*1024)) 指的是 block size4kcount256 * 1024 * 1024,乘到一起就是 4G

感谢您的支持

如果您喜欢这篇文章,可以通过以下方式支持我:

支付宝
支付宝
微信
微信
TRC20
TRC20