1、Swap空间定义及工作机制
Swap space是从磁盘中划分出来作为内存使用的一个磁盘分区。当系统的物理内存不足时,系统将会将内存中一些很久没使用的数据转移到swap space中。由此可见,Swap空间的使用,优点在于扩展了内存空间,缺点在于用磁盘做内存,使得读写效率降低。
工作机制如下:
Linux对于内存的回收有两种情况:
一种是分配内存的时候发现没有足够的空间内存可以分配,这时候会触发回收内存。
第二种情况是,开启了一个守护进程,周期性的对系统内存进行检查,在可用内存降低到一定的阈值之后会主动触发内存回收。
这就跟我们老家设计的自动上水装置是一样的,在大缸里放上一个悬浮球,悬浮球对应这上水总闸, 当水位持续降低到大缸的1/4的时候,悬浮球牵引的线,达到了最紧状态,牵动了上水总闸的开关,自动通电上水,当水位达到了大缸的上限阈值之后,自动停止上水。
那么既然说得到内存回收,Linux的内存回收,究竟回收的是什么?
其实回收也分两种情况:
- 文件缓存。我们的文件都是要读取到内存当中的,所以这部分缓存如果只是读取文件,可以收回,下次读取再从硬盘读取即可。
- 匿名内存, 这部分内存没有实际的载体,比如堆,栈数据等。 这部分数据回收的时候不能直接释放,我们用swap将这类内存换出到硬盘中,需要的时候在加载出来。
2、Swap空间不足所导致的问题
Swap空间本身就是解决内存不足的问题。如果Swap空间已满,那么当内存中的数据继续增多时,内存的数据将无法转移,从而导致内存溢出,严重时会导致整个系统卡顿,甚至无法远程登录系统或无法访问服务,此时只有重启系统才能解决问题,这种情况在IO操作频繁的应用中所见比较多。所以当Swap空间已满,而内存还未满时,可以根据业务情况考虑是否释放Swap空间或者释放内存。
3、Swap空间查看
3.1、htop命令
使用htop可以查看CPU,内存,Swp等基本情况,如图所示。
3.2、free命令
使用free命令可以查看内存和Swap空间使用情况,如图所示。
4、内存与Swap空间释放
4.1、内存释放
配置文件/proc/sys/vm/drop_caches存储了缓存释放的配置参数,drop_caches的值可以是0-3之间的数字,代表不同的含义:
- 0:不释放(系统默认值)
- 1:释放页缓存
- 2:释放dentries和inodes
- 3:释放所有缓存
要释放所有的缓存,只需执行以下命令:
echo 3 > /proc/sys/vm/drop_caches
释放完内存后再修改drop_caches让系统自动分配内存:
echo 0 >/proc/sys/vm/drop_caches
4.2、Swap空间释放
Swap空间释放需要注意,Swap空间释放的缓存会被转移到内存中,所以释放Swap空间时,确保系统物理内存大于Swap空间使用量,否则导致宕机。
Swap空间释放只需要重新挂载一下Swap分区即可。
查看swap分区状态:
swapon -s #查看swap状态
卸载swap分区:
swapoff /dev/vda1
重新挂载swap分区:
swapon /dev/vda1
5. 何时进行swap扩容
zabbix一直告警: swap空间不足。 事实上现在的云服务器都没有swap空间,所以这个时候你需要用到扩容。
Jmeter的节点服务器的剩余交换空间为0B
当然凡是涉及到环境检查的时候,发现swap空间检查不通过,我们就要第一时间对swap分区进行扩容。
6. swap扩容实战
方案一: 使用硬盘做swap分区
1) 分区
2) 格式化成swap格式
3) 开启与关闭swap
关闭来测试下:
方法二: 通过文件增加swap空间
1) 使用dd命令生成1G大小的文件
[root@gaosh-1 ~]# dd if=/dev/zero of=swap_file bs=1M count=1000
记录了1000+0 的读入
记录了1000+0 的写出
1048576000字节(1.0 GB)已复制,22.4257 秒,46.8 MB/秒
[root@gaosh-1 ~]#
2)查看生成的文件并给权限
[root@gaosh-1 ~]# chmod 0600 /root/swap_file
[root@gaosh-1 ~]# mkswap -f /root/swap_file #格式化
Setting up swapspace version 1, size = 1023996 KiB
no label, UUID=678f0d13-3105-4930-a89a-21e7a30a5d26
[root@gaosh-1 ~]# swapon /root/swap_file #加入swap
[root@gaosh-1 ~]# free -m
total used free shared buffers cached
Mem: 3547 2604 943 3 76 2064
-/+ buffers/cache: 462 3084
Swap: 3255 0 3255
[root@gaosh-1 ~]#
可以看到在方法一的时候,swap是2255, 方法二又加了1G内存,现在是3547
5、小结
对于内存使用过多的应用,手动释放内存并不是合适的选择,应该限制请求的qps或者扩容。如果临时手动释放,最好先释放物理内存再释放swap,因为swap释放会使得swap中的缓存转移到物理内存中去,可能导致宕机。