【系统运维】系统内存与SWAP交换分区介绍与配置教程
通常所说的内存容量指的是物理内存。物理内存也称为主存,只有内核才可以直接访问物理内存。当进程要访问内存时,Linux内核会给每个进程提供一个独立且连续的虚拟地址,也就是虚拟内存。虚拟内存又被分为内核空间和用户空间两部分
一、SWAP的作用
当系统出现内存紧张时会通过一系列机制回收内存:
· 回收缓存,比如使用 LRU(Least Recently Used)算法,回收最近使用最少的内存页
· 回收不常访问的内存,把不常用的内存通过交换分区直接写到磁盘中(SWAP)
· OOM(Out of Memory),直接杀掉占用大量内存的进程
SWAP分区可以是一块磁盘分区,也可以是通过一个文件形成,它用于存放操作系统内存中所置换出来的数据。操作系统通过kswapd进程周期性对内存进行检查,当服务器物理内存不足的时候,根据特定算法把一部分内存当中的数据(不是所有内存数据都可以交换)交换到SWAP分区进行存放,这种交换行为也可以称为发生了SWAP。
对于类似数据库这种核心服务,SWAP的好处是当内存不足的时候可以将一部分内存数据交换出去,避免OOM,不过随之带来的坏处就是会产生较高IO,降低系统性能。
二、创建SWAP方法
如果本机已有2G SWAP分区,又新建新的分区并启动后,SWAP空间将会累加
· 通过系统文件创建SWAP
#创建一个2G的文件 dd if=/dev/zero of=/data/swapfile bs=1024M count=2 #格式化成swap分区 mkswap /data/swapfile #开启swap分区 swapon /data/swapfile #在/etc/fstab中增加一条记录如下 /data/swapfile swap swap defaults 0 0
· 通过系统分区创建SWAP
#创建swap分区
fdisk /dev/sdb
# 新建一个分区
n
p
default
default
...
# 修改分区 id 为swap
t
82
# 写入分区表
w
# 同步内存和分区表信息
partprobe
# 格式化swap 分区
mkswap /dev/sdb1
# 打开 swap 分区
swapon /dev/sdb1
#在/etc/fstab中增加一条记录如下
/opt/swapfile swap swap defaults 0 0
三、SWAP的查看
#查看进程占用内存情况,单位是M
cd /proc
for i in `ls | grep "^[0-9]" | awk ' $0 >100'`
do
awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps
done 2>&1 | sort -k2nr | head
3131 102.676M
3127 94.4414M
3136 69.9648M
3129 61.1445M
3097 50.7695M
3086 47.0078M
3119 46.4102M
3106 42.4648M
3094 37.5547M
3092 36.8398M
# 注:以上结果输出PID与内存占用大小,通过PID可以找到对应进程
四、如何禁用SWAP
对于ES、Redis这种追求极致性能的服务,基本是不允许发生SWAP的,所以可以考虑禁用SWAP
swapoff -a #如果永久禁用记得修改/etc/fstab
五、调整swappiness
如果不打算完全禁用SWAP,可以通过降低swappiness的值进行优化。swappiness决定了操作系统交换内存的频率,系统默认值为60(内存使用到100-60=40%开始使用交换分区)。当swappiness=0表示最大限度使用物理内存,然后才是SWAP空间,但是由于未知原因,当设置为0的时候会有概率触发OOM,而设置为1则不会。当swappiness=100表示积极使用SWAP,并且主动把内存数据交换到SWAP中。所以可以考虑将值调低以防止正常情况下发生交换,但仍允许紧急情况进行SWAP。
#临时配置
sysctl vm.swappiness=1
#查看是否生效
cat /proc/sys/vm/swappiness
1
#永久生效
vim /etc/sysctl.conf
vm.swappiness=1
#刷新配置生效
sysctl -p
评论