Linux vm.swappiness
在使用raccheck对RAC数据库进行健康检查的时候,你可能会看到类似这样的信息:
如果这是你第一次见到它,那么它对你将不再陌生。在安装 12c GI的时候,在安装11.2.0.4GI的Patchset的时候, CUV都会检查Linux操作系统的vm.swappiness这个参数,如果没有将其设置为100, 就会报前提条件通不过。Oracle提供的理由是:在压力测试中,我们发现将swapiness设置为100可以减少或者延迟因连接风暴导致内存耗竭而引起的节点驱逐。文档提供的内容如下:
Please refer bug12890401 for more details, CVU now enforce this
swappiness=100 check, it is better to have this add to the doc.
swapiness是的一个内核参数,目的是用来控制页交换比例的一个阈值,其设置范围为0-100,这个值默认为60, 值越高说明内核使用交换区更加频繁。以下看wikipedia对于swapiness的解释:
Swappiness is a property for the Linux kernel that changes the balance between swapping out runtime memory, as opposed to dropping pages from the system page cache. Swappiness can be set to values between 0 and 100 inclusive. A low value means the kernel will try to avoid swapping as much as possible where a higher value instead will make the kernel aggressively try to use swap space. The default value is 60, and for most desktop systems, setting it to 100 may affect the overall performance, whereas setting it lower (even 0) may improve interactivity (decreasing response latency.)[1]
In short:
vm.swappiness = 0 – it will avoid swapping
vm.swappiness = 60 – default value
vm.swappiness = 100 – it will swap aggressvely
从上面的描述来看,将swapiness将使得页面的交换更加频繁,并且有可能影响到系统的总体性能。所以在redhat官方的性能调整文档,建议将这个参数设置为10, 以减少页交换的发生。根据Redhat的性能调整建议:Tuning Red Hat Enterprise Linux for Oracle and Oracle RAC 此文档提到Swapping for Oracle is bad并且建议将vm.swappiness这个参数设置为0。
这实在太令人不解了,导致将来有可能出现了这么一种场景,用户数据库服务器宕机了,Red Hat Support建议将vm.swapiness设置为0, 而Oracle Support建议将这个值设置为100,而且两个意见截然相反, 那到底该听谁的?
双方的意见可以总结如下:
Red Hat方:主要是站在性能的角度出发的。很简单,在内存足够的情况下,都应该避免使用swap,因为从性能上来说,不断的换页只会导致糟糕的性能。有一种典型的情况就是,如果进行在进行操作系统备份之类的操作,这个过程本身可能消耗大量的内存,如果这个时候发生换页,可能sga区的内存会被换出。
Oracle方:主要是出于稳定的角度。有一种很典型的场景,两节点的RAC,其中一个因为某种原因发生宕机,这个时候连接会自动转移到另外一个节点,另外一个节点由于内存不足无法处理瞬时的大量连接而挂起。如果将vm.swapiness设置为100, 那么可能不会导致挂起或者节点被驱逐,而仅仅是从前端反应较慢。
两种说法看似都有一定的道理,那么还是不知道听谁的。Oracle主要是站在GI的稳定性上来考虑的,实际如果将swapiness 设置为100, 必然会有一定的性能影响的。所以就有人给出以下建议:
1. 如果性能是最重要的,并且物理内存足够,请将swapiness设置为0。如果没有使用RAC,而是使用其它架构的单实例,那么也可以将swapiness设置为0.
2. 如果稳定性是最重要的,使用RAC并且系统负载很高而物理内存本身又不足,那么可以将swapiness设置为100, 减少挂起或者节点驱逐。
看上去综合了两家的意见,也有一定的可取之处。
我个人的看法更多倾向于和Red Hat的意见一致, 在数据库rdbms层面应该避免使用页交换,因为它是性能杀手。Just my 3 cents:
1. 通常在两节点的RAC下,数据库服务器通常其负载不要超过50%, 如果超过50%,其中一个节点因为雪崩效应宕机的概率很高。
2. 使用hugepages,保证sga区内存不会被换出。(以后会讨论hugepages)
3. 如果出现了因内存不够出现Hang或者节点驱逐的问题,应该去限制sga和pga的大小或者对内存进行扩容。
wappiness
centos默认的vm.swappiness值是60,这一默认值已经很合适了。但你可以改小一些降低swap的加载,系统性能会有提升。
cat /proc/sys/vm/swappiness
你会看到值是60, 更改:
sysctl vm.swappiness=10
这样你就将值由60改为10,这可以大大降低系统对于swap的写入,建议内存为512m或更多的朋友采用此方法。
如你你发现你对于swap的使用极少,可以将值设为0。这并不会禁止你对swap的使用,而是使你的系统对于swap的写入尽可能的少,同时尽可能多的使用你的实际内存。
这对于你在切换应用程序 时有着巨大的作用,因为这样的话它们是在物理内存而非swap分区中。
如果你想永久得改变这一值,你需要更改 sysctl.conf 文件:
添加:
vm.swappiness=10
到末行,需要重启生效。
在大内存服务器中我们需要设置这个值为0,尤其是在Mysql服务器上。