简单理解Linux Swap Space
2016-10-20
理解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
可能需要等待较长时间