理解Swap Space

对服务器进行性能监控,除了CPU, 内存, 磁盘IO,网络外,Swap Space也是值得关注的关键项。

用户进程在内存空间中数据有以下形式:

  • 程序代码和共享库
  • 文件内容的缓存数据
  • 程序使用的堆栈空间

其中前两项都是从文件系统中读取进来的。

Linux本身是一个分页请求系统,用户进程使用的内存需要映射到物理内存。为了更好的使用内存,Linux会对物理内存中的页面进行回收:

  • 程序代码和共享库的内存空间,可以直接回收,以后需要可以从程序文件中直接读取
  • 文件内容的缓存数据,如果是脏页,需要先写回磁盘再回收,否则可以直接回收
  • 程序的堆栈空间,没有对应的文件,在回收时只能备份到磁盘的一块专门的分区即Swap Space

Linux会使用硬盘的一部分作为SWAP分区,当前处于睡眠状态的进程就有可能发生回收,其中程序堆栈空间就有可能会交换到SWAP分区,把内存空出让给别的进程。

如果系统需要更多内存,而又无法回收更多的内存时,即发生了OOM killer(Out-of-Memory killer),该机制会将占用内存过大和“它”认为不重要的进程kill掉来回收内存。

可以用free命令查看swap space的使用情况:

1free -m
2             total       used       free     shared    buffers     cached
3Mem:         15948      14285       1662          0        302       1745
4-/+ buffers/cache:      12237       3710
5Swap:        16383          4      16379

其中最后一行Swap及时Swap Space的使用情况,对系统监控时,需要注意这个值比较高并不代表着内存吃紧,只有在Swap上有大量的换入换出时才表明内存紧张。 可以用vmstat命令查看Swap的换入换出操作:

1 vmstat 5
2procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
3 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
4 0  0   4212 1684508 310216 1805280    0    0     3    17    0    0  1  1 98  0  0
5 0  0   4212 1683384 310216 1806188    0    0     9   355 4289 4270  3  2 96  0  0
6 0  0   4212 1683260 310220 1806252    0    0     0    41 4212 4256  2  1 96  0  0

其中si表示从磁盘换入到内存,so表示从内存换出到内存。这里虽然Swap Space被使用了一些,但是因为si和so都为0,所以这里Swap对系统性能是没有影响的。

Swap相关系统参数调整

如果内存足够大,可以通过调整swappiness参数数值,让系统不必太多的使用SWAP分区,其值为0时表示最大限度使用物理内存。

查看系统的swappiness:

1sysctl vm.swappiness
2vm.swappiness = 30

修改swappiness,/etc/sysctl.conf

1vm.swappiness=0
1sysctl -p /etc/sysctl.conf

使用swapoff和swapon命令刷新Swap Space

swapoff命令可以关闭系统交换分区, -a参数关闭所有交换设备:

1swapoff -a

swapon命令可以打开系统交换分分区:

1swapon -a

系统在剩余足够可用内存的情况下,如果希望把Swap分区中的内容回写到内存,可以组合使用这两个命令:

1free -m
2swapoff -a
3swapon -a
4free -m

注意一定要确保系统有足够的剩余内存;Swap分区使用比较大时,执行swapoff -a可能需要等待较长时间

参考