下图是 HBase 官方文档上对操作系统环境的几点配置要求:
1, 关闭透明大页
- echo 'never'>/sys/kernel/mm/transparent_hugepage/enabled
- echo 'never'>/sys/kernel/mm/transparent_hugepage/defrag
- // 这一步是需要加入到开机自启动中, 才可以关闭的
- //THP 是一种动态管理策略, 会在运行期分配管理大页, 因此会有一定程度的分配延时, 这对追求响应延时的数据库系统来说不可接受. TPH 关闭场景下(never)HBase 性能最优, 比较稳定. 而 THP 开启的场景(always), 性能相比关闭的场景有 30% 左右的下降, 而且曲线抖动很大. 可见, HBase 线上切记要关闭 THP.
- 2,set vm.swappiness = 0 // 这里要设置成 0
- // 禁止交换(可选), 内存页面交换在某些情况下会导致 CDH 性能下降
- [[email protected] parcels513.el7]# echo vm.swappiness=1>> /etc/sysctl.conf
- [[email protected] parcels513.el7]# sysctl -p
- vm.swappiness = 1
- // 具体含义解释为:
swappiness, 这个值用来定义内核使用 swap 的积极程度, 值越高, 内核就会积极地使用 swap, 值越低, 就会降低对 swap 的使用积极性. 该值取值范围在 0~100, 默认是 60.
对于数据库来讲, swap 是尽量需要避免的, 所以需要将其设置为 1. 此处需要注意, 设置为 1 并不代表不执行 swap 哦!
提示:
swappiness 的值的大小对如何使用 swap 分区是有着很大的联系的. 先前, 人们建议把 vm.swapiness 设置为 0, 它意味着 "除非发生内存益处, 否则不要进行内存交换". 直到 Linux 内核 3.5-rcl 版本发布, 这个值的意义才发生了变化. 这个变化被一直到其他的发行版本上, 包括 RedHat 企业版内核 2.6.32-303. 在发生变化之后, 0 意味着 "在任何情况下都不要发生交换". 所以现在建议把这个值设置为 1.swappiness=100 的时候表示积极的使用 swap 分区, 并且把内存上的数据及时的搬运到 swap 空间里面.
- 3,set vm.min_free_kbytes to least 1GB(8GB on larger memory systems)
- // 该文件表示强制 Linux VM 最低保留多少空闲内存(Kbytes). // 代表系统所保留空闲内存的最低限
官方文档中要求 min_free_kbytes 不能小于 1G(在大内存系统中设置 8G), 就是不要轻易触发直接回收.
当可用内存低于这个参数时, 系统开始回收 cache 内存, 以释放内存, 直到可用内存大于这个值.
- vm.min_free_kbytes=409600;
- vm.vfs_cache_pressure=200;
- vm.swappiness=40.
调整 MIN_FREE_KBYTES 的目的是保持物理内存有足够的空闲空间, 防止突发性的换页.
swapiness 缺省为 60, 减少 swapiness 会使系统尽快通过 swapout 不使用的进程资源来释放更多的物理内存.
vfs_cache_pressure 的缺省值是 100, 加大这个参数设置了虚拟内存回收 directory 和 i-node 缓冲的倾向, 这个值越大, 回收的倾向越严重. 调整这 3 个参数的目的就是让操作系统在平时就尽快回收缓冲, 释放物理内存, 这样就可以避免突发性的大规模换页.
具体操作如下:
- [[email protected] ~]# cat /proc/sys/vm/min_free_kbytes // 原来的
- 67584
- [[email protected] ~]# cat /proc/sys/vm/min_free_kbytes // 设置成
- 1048576
- [[email protected] ~]# ll /proc/sys/vm/|wc -l
- 42
- 4,disable numa zone reclaim with vm.zone_reclaim_mode = 0
- // 官方建议把 vm.zone_reclaim_mode = 0 设置成 0
- [[email protected] vm]# cat /proc/sys/vm/zone_reclaim_mode // 这个参数系统默认就是 0
- 0
- //UMA 是什么? NUMA 和 swap 有什么关系? zone_reclaim_mode 的具体意义?
zone_reclaim_mode, 这个参数定义了 NUMA 架构下不同的内存回收策略, 可以取值 0/1/3/4, 其中 0 表示在 local 内存不够用的情况下可以去其他的内存区域分配内存; 1 表示在 local 内存不够用的情况下本地先回收再分配; 3 表示本地回收尽可能先回收文件缓存对象; 4 表示本地回收优先使用 swap 回收匿名内存.
swap 是干什么的?
SWAP 意思是交换, 顾名思义, 当某进程向 OS 请求内存发现不足时, OS 会把内存中暂时不用的数据交换出去, 放在 SWAP 分区中, 这个过程称为 SWAP OUT. 当某进程又需要这些数据且 OS 发现还有空闲物理内存时, 又会把 SWAP 分区中的数据交换回物理内存中, 这个过程称为 SWAP IN.
当然, swap 大小是有上限的, 一旦 swap 使用完, 操作系统会触发 OOM-Killer 机制, 把消耗内存最多的进程 kill 掉以释放内存.
显然, swap 机制的初衷是为了缓解物理内存用尽而选择直接粗暴 OOM 进程的尴尬.
数据库系统为什么嫌弃 swap?
1, 数据库系统一般都对响应延迟比较敏感, 如果使用 swap 代替内存, 数据库服务性能必然不可接受.
2, 对于响应延迟极其敏感的系统来讲, 延迟太大和服务不可用没有任何区别, 比服务不可用更严重的是, swap 场景下进程就是不死, 这就意味着系统一直不可用...... 再想想如果不使用 swap 直接 oom, 是不是一种更好的选择, 这样很多高可用系统直接会主从切换掉, 用户基本无感知.
3, 另外对于诸如 HBase 这类分布式系统来说, 其实并不担心某个节点宕掉, 而恰恰担心某个节点夯住.
4, 一个节点宕掉, 最多就是小部分请求短暂不可用, 重试即可恢复. 但是一个节点夯住会将所有分布式请求都夯住, 服务器端线程资源被占用不放, 导致整个集群请求阻塞, 甚至集群被拖垮.
swap 的工作机制
既然数据库们对 swap 不待见, 那是不是就要使用 swapoff 命令关闭磁盘缓存特性呢? 非也
HBase 官方文档的几点要求实际上就是落实这个方针: 尽可能降低 swap 影响. 知己知彼才能百战不殆, 要降低 swap 影响就必须弄清楚 Linux 内存回收是怎么工作的, 这样才能不遗漏任何可能的疑点.
先来看看 swap 是如何触发的?
Linux 会在两种场景下触发内存回收,
1, 一种是在内存分配时发现没有足够空闲内存时会立刻触发内存回收;
2, 一种是开启了一个守护进程 (swapd 进程) 周期性对系统内存进行检查, 在可用内存降低到特定阈值之后主动触发内存回收.
Linux 内存回收对象主要分为两种:
文件缓存, 这个容易理解, 为了避免文件数据每次都要从硬盘读取, 系统会将热点数据存储在内存中, 提高性能.
匿名内存, 这部分内存没有实际载体, 不像文件缓存有硬盘文件这样一个载体, 比如典型的堆, 栈数据等. 这部分内存在回收的时候不能直接释放或者写回类似文件的媒介中, 这才搞出来 swap 这个机制, 将这类内存换出到硬盘中, 需要的时候再加载出来.
找到 MySQL 服务器发生 SWAP 罪魁祸首
物理内存还有不少空闲, 但把 swap 都耗尽了.
绝大多数情况是因为没有关闭 NUMA 引起的. 在运行数据库进程的服务器上, 强烈建议关闭 NUMA,
解决方法:
由于服务器硬件, 系统设置不当, 没有关闭 NUMA, 导致发生 SWAP. 建议方案有:
在 BIOS 设置层面关闭 NUMA, 缺点是需要重启 OS;
或修改 GRUB 配置文件, 缺点也是要重启 OS;
升级 MySQL 版本到 5.6.27 及以后, 新增了一个选项 innodb_numa_interleave, 只需要重启 mysqld 实例, 无需重启 OS, 推荐此方案.
以上部分在 Linux 初始化脚本 (centos6 centos7 通用)https://blog.51cto.com/12445535/2362407 中提到
参考链接为: http://hbasefly.com/2017/05/24/hbase-linux/
hbase 服务器优化之硬件优化(用好操作系统)
来源: http://www.bubuko.com/infodetail-3016751.html