大约 2 分钟
Linux
Photo by Andrey Matveev / Unsplash
Linux
一种简单的 Linux 内存不足抢救方案
0X00 正文
前几天尝试用自己的服务器通过 docker 启一个新服务,没注意这个服务需要的内存比较大(我的服务器只有 2G 内存),导致 docker compose up -d
命令敲下去不到一分钟服务器直接卡死了......
当时还没意识到是内存不足导致的问题,以为是 CPU 卡住了,毕竟一般情况下服务刚启动的时候确实会占用比较多的资源。所以直接摆烂,等它一会儿好了。半个小时之后发现服务器还是卡死状态,ssh 也上不去,所以干脆去云平台重启。发现云平台的监控上已经看不到CPU/内存的占用率了,意味着装在服务器里的 agent 也已经完蛋了。而且,重启服务器也没有什么效果。
好在云平台可以通过类似 IPMI 的方式直接接入到服务器的 console,所以可以通过 console 登陆。虽然每一步的操作都非常非常卡,敲一串命令要等很久才能回显。使用 free -h
检查了内存占用情况之后发现确实是内存瓶颈,并且系统没有配置交换分区,所以才出了下面的这个骚招:
- 使用
free -h
确认当前内存使用情况,发现内存爆满且没有交换分区 - 意识到 Linux 所谓的「万物皆文件」,决定在没有空闲分区的情况下生造一个交换分区出来
- 使用
dd if=/dev/zero of=SWAP_FILE bs=4k count=$((256*1024*4))
创建一个 4G 大小的块文件 - 使用
mkswap SWAP_FILE
将其格式化成 swap 分区 - 使用
swapon SWAP_FILE
挂载交换分区 - 系统活过来了
⚠️ 注意:使用 swapon
只是临时挂载,重启会失效,所以需要通过常规手段增加内存(至少要增加交换分区)
dd if=/dev/zero of=SWAP_FILE bs=4k count=$((256*1024*4))
是什么意思?
dd
命令是一个硬盘层面的拷贝命令if=/dev/zero of=SWAP_FILE
指的是input file
是/dev/zero
(这是一个会源源不断输出二进制 0 的设备),output file
是SWAP_FILE
bs=4k count=$((256*1024*1024))
指的是block size
为4k
,count
为256 * 1024 * 1024
,乘到一起就是 4G
感谢您的支持
如果您喜欢这篇文章,可以通过以下方式支持我:






评论区