CDH大数据集群Linux系统参数调优
系统版本为CentOS 7。
vm.swappiness
设置方法:
-
echo 1 > /proc/sys/vm/swappiness
,或 -
sysctl -w vm.swappiness=1
,或 - 编辑/etc/sysctl.conf文件,加入
vm.swappiness=1
swap即交换空间,作用类似于Windows中的虚拟内存,也就是当物理内存不足时,将硬盘上的swap分区当做内存来使用。但是,由于磁盘的读写速率与内存相比差太多,一旦发生大量交换,系统延迟就会增加,甚至会造成服务长期不可用,这对于大数据集群而言是致命的。
vm.swappiness参数用于控制内核对交换空间的使用积极性,默认是60。值越高,就代表内核越多地使用交换空间。
对于内存较大的CDH集群,我们一般将这个值设为0或1。0表示只有当可用物理内存小于最小阈值vm.min_free_kbytes(后面会提到)时才使用交换空间,1则表示最低限度地使用交换空间。
关于这个配置的具体机制,找到了两种解释:
- 当物理内存占用率高于(100 - vm.swappiness)%时,开始使用交换分区。
- vm.swappiness通过控制内存回收时,回收的匿名内存更多一些还是回收的文件缓存更多一些来达到这个效果。如果等于100,表示匿名内存和文件缓存将用同样的优先级进行回收,默认60表示文件缓存会优先被回收掉。
vm.min_free_kbytes
设置方法:
-
echo 4194304 > /proc/sys/vm/min_free_kbytes
,或 -
sysctl -w vm.min_free_kbytes=4194304
,或 - 编辑/etc/sysctl.conf文件,加入
vm.min_free_kbytes=4194304
Linux系统中,剩余内存有3个水位线,从高到低记为high、low和min。并且有如下的关系:
min = vm.min_free_kbytes,low = min * 5 / 4,high = min * 3 / 2。
当剩余内存低于high值时,系统会认为内存有一定的压力。当剩余内存低于low值时,守护进程kswapd就会开始进行内存回收。当其进一步降低到min值时,就会触发系统的直接回收(direct reclaim),此时会阻塞程序的运行,使延迟变大。
因此vm.min_free_kbytes的值既不应过小,也不应过大。如果过小(比如只有几十M),low与min之间的差值就会非常小,极易触发直接回收,使效率降低。而如果设置得过大,又会造成内存资源的浪费,kswapd回收时也会耗费更多的时间。上面的语句中设置成了4G,视物理内存大小,一般设在1G~8G之间。
透明大页面(THP)
设置方法:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
大页面(Huge Page)是内存分页管理的一种实现方式。计算机内存是通过表映射(页表)的方式进行内存寻址,目前系统内存以4KB为一个页,作为内存寻址的最小单元。随着内存不断增大,页表的大小将会不断增大。一台256G内存的机器,如果使用4KB小页,仅页表大小就要4G左右。页表是必须装在内存的,而且是在CPU内存,太大就会发生大量miss,内存寻址性能就会下降。
Huge Page就是为了解决这个问题,它使用2MB的大页代替传统小页来管理内存,这样页表大小就可以控制的很小,进而全部装在CPU内存,防止出现miss。它有两种实现方式,一是静态大页面(Static Huge Pages,SHP),二是透明大页面(Transparent Huge Pages,THP)。从它们的名字就可以看出,SHP是静态的,而THP是动态的。由于THP是在运行期做分配和管理,因此会有一定程度的延迟,对于内存密集型的应用十分不利,必须关闭它。
vm.zone_reclaim_mode
设置方法:
-
echo 0 > /proc/sys/vm/zone_reclaim_mode
,或 -
sysctl -w vm.zone_reclaim_mode=0
,或 - 编辑/etc/sysctl.conf文件,加入
vm.zone_reclaim_mode=0
这个参数与NUMA(Non-uniform Memory Access,“非统一性内存访问”)特性有关。
如图所示,NUMA使得每个CPU都有自己专属的内存区域
只有当CPU访问自身直接attach内存对应的物理地址时,才会有较短的响应时间(Local Access)。而如果需要访问其他CPU attach的内存的数据时,就需要通过inter-connect通道访问,响应时间就相比之前变慢了(Remote Access)。
NUMA这种特性可能会导致CPU内存使用不均衡,部分CPU的local内存不够使用,频繁需要回收,进而可能发生大量swap,系统响应延迟会严重抖动。而与此同时其他部分CPU的local内存可能都很空闲。这就会产生一种怪现象:使用free命令查看当前系统还有部分空闲物理内存,系统却不断发生swap,导致某些应用性能急剧下降。因此必须改进NUMA的内存回收策略,即vm.zone_reclaim_mode。
这个参数可以取值0/1/3/4。其中0表示在local内存不够用的情况下可以去其他的内存区域分配内存;1表示在local内存不够用的情况下本地先回收再分配;3表示本地回收尽可能先回收文件缓存对象;4表示本地回收优先使用swap回收匿名内存。由此可见,将其设为0可以降低swap发生的概率。
tuned服务
从 RHEL/Centos 6.3 之后,引入了一套新的调优工具 tuned,带来了大量的调优配置,可以针对不同的业务服务调整不同的优化策略,也旨在于简化调优的实施,充分利用系统资源与能效。其原理是每个profile对应一套sysctl参数,通过改变sysctl以适应不同的业务。但是对CDH集群而言,前面已经做过了调优,且业务相对固定,所以就不需要tuned服务来添乱了。关闭它的步骤如下:
tuned-adm off
- 执行
tuned-adm list
,确定返回“No current active profile” systemctl stop tuned
systemctl disable tuned
参考
- https://www.cloudera.com/documentation/enterprise/5-13-x/topics/cdh_admin_performance.html#cdh_performance__section_xpq_sdf_jq
- https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/performance_tuning_guide/s-memory-tunables
- https://www.howtoforge.com/tutorial/linux-swappiness/
- http://hbasefly.com/2017/05/24/hbase-linux/
- https://en.wikipedia.org/wiki/Non-uniform_memory_access
- https://blog.csdn.net/liguangxianbin/article/details/80797400