文章目录
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://hbase.apache.org/2.2/book.html#direct.memory
transparent huge pages(THP)
transparent huge pages(THP)
https://www.percona.com/blog/2014/07/23/why-tokudb-hates-transparent-hugepages/