HBase调优(一)操作系统调优

HBase调优-操作系统调优

vm.min_free_kbytes

Set vm.min_free_kbytes to at lease 1GB(8GB on larger memory systems)

HBase官方建议至少1G

# 查看系统默认值
cat /proc/sys/vm/min_free_kbytes 

# 临时修改
echo 1153434 > /proc/sys/vm/min_free_kbytes

# 永久修改
echo vm.min_free_kbytes = 1153434 >> /etc/sysctl.conf && sysctl -p

vm.swappiness

Set vm.swappiness=0

# 永久修改
echo vm.swappiness = 0 >> /etc/sysctl.conf && sysctl -p && swapoff -a

# 查看
cat /proc/sys/vm/swappiness

vm.zone_reclaim_mode

Disable NUMA zone reclaim with vm.zone_reclaim_mode=0

# 永久修改
echo vm.zone_reclaim_mode=0 >> /etc/sysctl.conf && sysctl -p

# 查看
cat /proc/sys/vm/zone_reclaim_mode

transparent huge pages(THP)

Turn transparent huge pages(THP)off

# 临时禁用
echo  never  >  /sys/kernel/mm/transparent_hugepage/enabled
echo  never  >  /sys/kernel/mm/transparent_hugepage/defrag

cat << EOF |sudo tee /sys/kernel/mm/transparent_hugepage/enabled
never
EOF


# 永久禁用,需重启节点
echo "if test -f /sys/kernel/mm/transparent_hugepage/enabled;then echo never > /sys/kernel/mm/transparent_hugepage/enabled;fi;if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag;fi">> /etc/rc.local

# 查看
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag

ulimit

# 永久修改
cat << EOF |sudo tee -a /etc/security/limits.conf
* soft nproc 655350
* hard nproc 655350
* soft nofile 655350
* hard nofile 655350
* soft core unlimited
* hard core unlimited
EOF

参数说明

Linux swap概念

swap “虚拟内存”,当物理内存不足时,拿出部分硬盘空间当swap分区(虚拟成内存)使用。

swap out: 当进程向OS申请内存时发现内存不足时,OS会把内存中暂时不用的数据交换出去,放在swap分区。

swap in: 当某进程又需要这些数据且OS发现有空闲的物理内存,把swap分区的数据交换回内存。

swap大小是有上限的,一旦swap使用完,OS会触发OOM-Killer机制,把消耗内存最多的进程kill掉以释放内存。

swap机制的设计初衷是,避免因为物理内存用尽而只能直接粗暴kill进程的问题。

大部分数据库服务都不需要swap机制:

  • 数据库系统一般响应延迟敏感,swap分区代替内存影响性能;swap场景下进程可能存在,但系统一直不可用
  • 对于诸如Hbase分布式系统一般是HA的,不担心某个节点挂掉,而担心某个节点卡住;一个节点卡住会将所有分布式请求都夯住,服务器端线程资源占用不放,导致整个集群请求阻塞。

数据库是尽量少用swap分区不是不用。

vm.min_free_kbytes

Linux触发内存回收场景:

  • 内存分配时没有足够空闲内存,会立刻触发回收;
  • 守护进程(kswapd)周期性检查系统内存,在可用内存降低到特定阈值是触发回收;

在这里插入图片描述

vm.min_free_kbytes,代表系统所保留空闲内存的最低限watermark[min],并且影响watermark[low]和watermark[high]

# 简单认为
watermark[min]  =  min_free_kbytes
watermark[low]  =  watermark[min]  *  5  /  4  =  min_free_kbytes  *  5  /  4
watermark[high]  =  watermark[min]  *  3  /  2  =  min_free_kbytes  *  3  /  2
watermark[high]-watermark[low] = watermark[low]  -  watermark[min]  =  min_free_kbytes  /  4

min_free_kbytes 不宜过大和过小:

  • 过小导致[min,low]之间水位的buffer就会很小,在kswapd回收的过程中,一旦上层申请内存的速度太快会导致空闲内存极易降至watermark[min]以下,此时内核就会直接在应用程序的进程上下文中进行回收,再用回收上来的空闲页满足内存申请,因此实际会阻塞应用程序,带来一定的响应延迟。

  • 过大导致应用程序内存减少,浪费系统资源,还会导致kswapd进程消耗大量时间回收内存。

官方文档中要求min_free_kbytes不能小于1G(在大内存系统中设置为8G),意味着不要轻易触发直接回收。

Set vm.swappiness=0

Linux内存回收对象主要分为两种:

  • 文件缓存

    为了避免每次数据都从硬盘读取,系统会将热点数据存储到内存,提升性能。仅读取内存数据,内存回收只需要释放这部分内存;读取内存数据进行修改,内存回收需要将数据写到硬盘再释放。

  • 匿名内存

    这部分内存没有实际载体,这部分内存回收时不能直接释放或写回应硬盘。因此提出swap机制,将这类内存交换到硬盘,需要时再加载进来。

swappiness:用来定义内核使用swap的积极程度,值越高,内核就越积极地使用swap,值越低,会降低对swap的使用积极性。取值范围为0~100,默认是60。swappiness在内存回收时,通过控制回收的匿名页更多还是回收的文件缓存更多来达到目的。swappiness等于100,表示匿名内存和文件缓存将用同样的优先级进行回收,默认60表示文件缓存会优先被回收。对于数据库来说,swap是尽量需要避免的,所以需要将其设置为0。此处需要注意,设置为0并不代表不执行swap。

Disable NUMA zone reclaim

NUMA(Non-Uniform Memory Access)是相对统一内存访问(Uniform Memory Access,UMA)来说的,两者都是CPU的设计架构,早期CPU设计为UMA结构

UMA结构:

在这里插入图片描述

NUMA结构:

在这里插入图片描述

NUMA结构:缓解多核CPU读取同一块内存所遇到的通道瓶颈问题,不同CPU有local内存(专属内存)区,为了实现CPU之间的“内存隔离”,需要软件层面提供两点支持:

  • 内存分配需要在请求线程当前所处CPU的local内存进行;如果分配到其他CPU local内存,影响隔离性,并且跨越总线的内存访问性能降低。
  • 一旦local内存不够用,优先淘汰local内存中的内存页。

NUMA结构提升了隔离性,可能会导致CPU内存使用不均衡;部分CPU local内存不够使用,频繁回收,可能发生swap,系统响应延迟会严重抖动;部分CPU local内存空闲。这会产生奇怪的现象:使用free命令查看当前内存有部分空闲,系统却不断发生swap,导致某些应用性能急剧下降。

小内存应用,NUMA带来的问题不突出,local内存性能提升较大;大内存应用,需要修改NUMA的默认策略。

  • 将内存分配策略由默认的亲和模式改为interleave模式,将内存page打散分配到不同的CPU zone中。通过这种方式解决内存可能分布不均的问题,可以在一定程度上缓解上述问题。

  • 改进内存回收策略,此处涉及参数zone_reclaim_mode,这个参数定义了NUMA架构下不同的内存回收策略,取值0/1/2/4。

    • 0 local内存不够用,可以去其他的内存区域分配内存;
    • 1 local内存不够用,本地先回收再分配;
    • 2 本地回收尽可能先回收文件缓存对象;
    • 4 本地回收尽可能先匿名内存

HBase推荐配置zone_reclaim_mode=0,在一定程度上降低了swap发生的概率。

Turn transparent huge pages(THP)off

​ 计算机内存是通过表映射(内存索引表)的方式进行内存寻址的,目前系统内存以4KB为一页,作为内存寻址的最小单元。随着内存不断增大,内存索引表的大小将会不断增大。一台256G内存的机器,如果使用4KB小页,仅索引表大小就要4G左右。要知道这个索引表是必须放在内存的,而且是在CPU内存,表太大就会发生大量miss,内存寻址性能就会下降。
​ HugePage是为了解决这个问题而设计的,HugePage使用2MB大小的大页代替传统小页来管理内存,这样内存索引表就可以控制到很小,进而全部装在CPU内存,防止出现miss。

HugePage是一种大页理论,目前系统提供了两种使用方式:

  • Static Huge Pages

    静态管理策略,需要用户自己根据系统内存大小手动配置大页个数,这样在系统启动的时候就会生成对应个数的大页,后续将不再改变。

  • Transparent Huge Pages

    动态管理策略,它会在运行期动态分配大页给应用,并对这些大页进行管理,对用户来说完全透明,不需要进行任何配置。另外,目前THP只针对匿名内存区域。

THP是一种动态管理策略,会在运行期分配管理大页,因此会有一定程度的分配延时,这对追求响应延时的数据库系统来说不可接受。

ulimit

Most UNIX-like operating systems, including Linux and macOS, provide ways to limit and control the usage of system resources such as threads, files, and network connections on a per-process and per-user basis. These “ulimits” prevent single users from using too many system resources.

参考

vm.min_free_kbytes

https://linuxhint.com/vm_min_free_kbytes_sysctl/

https://discuss.aerospike.com/t/how-to-tune-the-linux-kernel-for-memory-performance/4195

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/performance_tuning_guide/sect-red_hat_enterprise_linux-performance_tuning_guide-configuration_tools-configuring_system_memory_capacity

https://hbase.apache.org/2.2/book.html#direct.memory

transparent huge pages(THP)

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/performance_tuning_guide/sect-red_hat_enterprise_linux-performance_tuning_guide-configuring_transparent_huge_pages

transparent huge pages(THP)

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/performance_tuning_guide/sect-red_hat_enterprise_linux-performance_tuning_guide-configuring_transparent_huge_pages

https://www.percona.com/blog/2014/07/23/why-tokudb-hates-transparent-hugepages/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值