在Linux服务器运行程序时,在代码无误且前序任务运行正常的情况下,突然出现任务终止。首先查看了下负载,业务进程和相关日志,都没有错误日志记录。查看了下内存占用情况(free -m)发现,Swap free为0,意味是是由于内存不足引起的程序终止。本篇博文将介绍一下SWAP是什么,以及如何扩展。
其实,早期内存一般都比较小,很容易就出现内存不足的问题,所以很早就提出了一个交换分区(swap partition)的概念。
swap 分区是将磁盘当作内存使用,使得虚拟地址空间的范围大小可以超出物理内存的实际大小,在物理内存空间不足时,可以将物理内存中的一些不重要数据拷贝到磁盘的 swap 分区中,从而让出内存空间,并且在需要那些已被拷出数据时再从 swap 分区中拷回到内存。也就是说物理内存和缓存区内存不够用的时候,才会用到SWAP。
只有在出现物理内存耗尽或即将耗尽的时候,如果进程继续请求分配内存,将报错 out-of-memory(OOM)表示内存不足,并且在出现 OOM 的时候,操作系统将触发 OOM Killer 程序从进程列表中筛选出一个内存密集型进程杀掉,从而释放大片内存。
一般来说可以按照如下规则设置swap大小(以实际情况为准,这只是建议)
4G以内的物理内存,SWAP 设置为内存的2倍。
4-8G的物理内存,SWAP 等于内存大小。
8-64G 的物理内存,SWAP 设置为8G。
64-256G物理内存,SWAP 设置为16G。
实际上并不是等所有的物理内存都消耗完毕之后,才去使用swap的空间,而是由swappiness 参数值 来控制物理内存够不够用。
cat /proc/sys/vm/swappiness
本人使用服务器默认是60
swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,
swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。
查看占用SWAP排名前10的进程pid
for i in $(cd /proc;ls | grep "^[0-9]"|awk '$0 >100');do awk '/Swap:/{a=a+$2}END{print "'$i'", a/1024"M"}' /proc/$i/smaps 2>/dev/null;done | sort -k2nr | head -10
lsblk
free -h
可以看到当前服务器Swap分区大小为2G,已使用1.2G,余量730M
dd if=/dev/zero of=/swap2 bs=1M count=10240
非root用户需要sudo开启临时root权限
这里会新建一个目录(/swap2),该目录为新增的swap分区
各参数含义:
dd:用指定大小的块拷贝文件,并在拷贝的同时进行指定的转换
if=:(input file) 数据的来源 (源)
of=:(outpu file)输出文件 (目标)
bs=:(block size) 每次复制多大(bytes)
count=:次数
/dev/zero 白洞 源源不断的输出
/dev/null 黑洞 吸收
/dev/urandom 随机字符
查看新增分区的文件类型
file /swap2
使用mkswap命令来设置交换文件,即相当于格式化新建立的交换分区。
mkswap /swap2
要立即启用交换文件而不是在引导时自动启用,使用swapon命令。
swapon /swap2
如果要停止使用新建立的交换分区则用swapoff命令。
检查增加后的交换情况,增加后的交换分区为12238M。
free -m
chmod 600 /swap2
swapon -s
参考链接
一条报警引起的对 swap 认识
linux下扩展swap分区方法
http://t.csdn.cn/uEiGO