周末的时候HBase集群一台子节点宕机,查看Ganglia及内存使用情况,发现节点Swap空间耗尽,但奇怪的是,系统物理内存却还是非常的富足。我们都知道
Swap空间的作用:
Swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。
Swap配置对性能的影响:
分配太多的Swap空间会浪费磁盘空间,而Swap空间太少,则系统会发生错误。 如果系统的物理内存用光了,系统就会跑得很慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误。例如,Web服务器能根据不同的请求数量衍生出多个服务进程(或线程),如果Swap空间用完,则服务进程无法启动,通常会出现“application is out of memory”的错误,严重时会造成服务进程的死锁。因此Swap空间的分配是很重要的。
那么,真的是当系统物理内存不够用的时候,系统才会使用Swap空间吗?否!他娘的。。。
其实虚拟内存并不是等到物理内存用尽了才使用的,是否尽量的使用或不使用swap在内核空间有一个参数控制。
cat /proc/sys/vm/swappiness
60
swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。
对于现在动辄上百G物理内存的服务器来说,究竟为其Linux系统设置多大的交换分区合适呢,为此,引用红帽官方文库里的一段文字进行说明。
目前Red Hat推荐交换分区的大小应当与系统物理内存的大小保持线性比例关系。不过在小于2GB物理内存的系统中,交换分区大小应该设置为内存大小的两倍,如果内存大小多于2GB,交换分区大小应该是物理内存大小加上2GB。其原因在于,系统中的物理内存越大,对于内存的负荷可能也越大。
但是,如果物理内存大小扩展到数百GB,这样做就没什么意义了。
实际上,系统中交换分区的大小并不取决于物理内存的量,而是取决于系统中内存的负荷。Red Hat Enterprise Linux 5可以在这样的情况下工作:完全没有交换分区,而且系统中匿名内存页和共享内存页小于3/4的物理内存量。在这种情况下,系统会将匿名内存页和共享内存页锁定在物理内存中,而使用剩余的物理内存来缓冲文件系统数据(pagecache),当内存耗尽时,系统内核只会回收利用这些pagecache内存。
考虑到以下情况:
1)安装系统时难以确定内存的负荷,如何设置交换分区大小
2)系统中物理内存越大,所需交换分区就会越少
因此,在Red Hat Enterprise Linux 5中,以下是设置合适的交换分区大小的规则:
小于等于4G物理内存的系统,至少设置2GB的交换分区
4G~16G物理内存的系统,至少设置4GB的交换分区
16G~64G物理内存的系统,至少设置8GB的交换分区
64G~256G物理内存的系统,至少设置16GB的交换分区
如何修改呢?
1.修改此处vm.swappiness=10,但是你会发现重启后又变成60.
2.要彻底修改,还是要修改配置/etc/sysctl.conf
在这个文档的最后加上这样一行:vm.swappiness=10
然后保存,重启。ok,你的设置就生效了。
涉及到HBase来说,其在系统配置一节中,也有建议,可见,HBase建议设置swappiness为0,尽量使用物理内存:
==================================
查看修改swap
==================================
1 查看swap 空间大小(总计):
# free -m 默认单位为k, -m 单位为M
total used free shared buffers cached
Mem: 377 180 197 0 19 110
-/+ buffers/cache: 50 327
Swap: 572 0 572
2 查看swap 空间(file(s)/partition(s)):
包括 文件 和 分区的详细信息
# swapon -s
等价于
# cat /proc/swaps
3.在空间合适处创建swap文件
- [root@ema usr]# cd swap
- [root@ema swap]# dd if=/dev/zero of=swapfile bs=402400 count=10000
- 10000+ records in
- 10000+ records out
- [root@ema swap]# ls -al
- total 10024
- drwxr-xr-x 2 root root 4096
- drwxr-xr-x 19 root root 4096
- -rw-r--r-- 1 root root 4013500000
- [root@emaswap]# mkswap swapfile
- 激活swap文件
swapon swapfile
total used free shared buffers cached
Mem: 202619299771755
-/+ buffers/cache: 1661860
Swap: 40084008