Linux下的Swap空间

1、Swap空间定义及工作机制

Swap space是从磁盘中划分出来作为内存使用的一个磁盘分区。当系统的物理内存不足时,系统将会将内存中一些很久没使用的数据转移到swap space中。由此可见,Swap空间的使用,优点在于扩展了内存空间,缺点在于用磁盘做内存,使得读写效率降低。

工作机制如下:

Linux对于内存的回收有两种情况:

一种是分配内存的时候发现没有足够的空间内存可以分配,这时候会触发回收内存。

第二种情况是,开启了一个守护进程,周期性的对系统内存进行检查,在可用内存降低到一定的阈值之后会主动触发内存回收。

这就跟我们老家设计的自动上水装置是一样的,在大缸里放上一个悬浮球,悬浮球对应这上水总闸, 当水位持续降低到大缸的1/4的时候,悬浮球牵引的线,达到了最紧状态,牵动了上水总闸的开关,自动通电上水,当水位达到了大缸的上限阈值之后,自动停止上水。

那么既然说得到内存回收,Linux的内存回收,究竟回收的是什么?

其实回收也分两种情况:

  1. 文件缓存。我们的文件都是要读取到内存当中的,所以这部分缓存如果只是读取文件,可以收回,下次读取再从硬盘读取即可。
  2. 匿名内存, 这部分内存没有实际的载体,比如堆,栈数据等。 这部分数据回收的时候不能直接释放,我们用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中的缓存转移到物理内存中去,可能导致宕机。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值