huge page 能给MySQL 带来性能提升吗?
最近一直在做性能压测相关的事情,有公众号的读者朋友咨询有赞的数据库服务器有没有开启huge page,我听说过huge page会对性能有所提升,本文就一探究竟。对过程没有兴趣的可以直接看结论。
二 Huge Page 来龙去脉
2.1 为什么需要Huge Page
在 Linux 操作系统上运行内存需求量较大的应用程序时,由于其采用的默认页面大小为 4KB,因而将会产生较多 TLB Miss 和缺页中断,从而大大影响应用程序的性能。当操作系统以 2MB 甚至更大作为分页的单位时,将会大大减少 TLB Miss 和缺页中断的数量,显著提高应用程序的性能。这也正是 Linux 内核引入大页面支持的直接原因。好处是很明显的,假设应用程序需要 2MB 的内存,如果操作系统以 4KB 作为分页的单位,则需要 512 个页面,进而在 TLB 中需要 512 个表项,同时也需要 512 个页表项,操作系统需要经历至少 512 次 TLB Miss 和 512 次缺页中断才能将 2MB 应用程序空间全部映射到物理内存;然而,当操作系统采用 2MB 作为分页的基本单位时,只需要一次 TLB Miss 和一次缺页中断,就可以为 2MB 的应用程序空间建立虚实映射,并在运行过程中无需再经历 TLB Miss 和缺页中断(假设未发生 TLB 项替换和 Swap)。
为了能以最小的代价实现大页面支持,Linux 操作系统采用了基于 hugetlbfs 特殊文件系统 2M 字节大页面支持。这种采用特殊文件系统形式支持大页面的方式,使得应用程序可以根据需要灵活地选择虚存页面大小,而不会被强制使用 2MB 大页面。via(InnoDB启用大内存页)
2.2 HugePage的优势:
1.增加TLB的命中率
2.Page是被锁定在内存中,降低内存交换;
3.锁定内存,降低内存释放与占用产生的性能降低;
4.提高内存的性能,降低CPU负载。
三 mysql 如何用huge page
不同系统的huge pages大小可能不一样,我们使用centos7 huge page 大小默认为2M 。
3.1 计算需要多少 huge pages
启用 huge page之前 首先我们要计算分配多少huge page给mysql 使用。一般的建议是mysql使用的总内存大小加上10%。计算公式如下
S = (query_cache_size + table_open_cache + innodb_buffer_pool_size + innodb_log_file_size + performance_schema.memory) + 10 %
那么 huge pages的个数大小是
vm.nr_hugepages=S/2M
3.2 设置mysql用户组使用huge pages
通过 id mysql 获取mysql所在的group id
# id mysqluid=27(mysql) gid=27(mysql) groups=27(mysql)
echo 27 > /proc/sys/vm/hugetlb_shm_group
3.3 为 mysql 用户提供memlock限制的“无限”值
编辑/etc/security/limits.conf 增加
#<domain> <type> <item> <value>
#
#Where:
#<domain> can be:
# - a user name
# - @mysql 表示mysql用户组的不受限
##设置mysql 使用 HugePages
@mysql
soft memlock unlimited
@mysql
hard memlock unlimited
编辑 my.cnf 在[mysqld]里面增加
large_pages=1
3.4验证hugepage是否生效
# cat /proc/meminfo | grep HugeAnonHugePages: 1294336 kBHugePages_Total: 5834HugePages_Free: 1394HugePages_Rsvd: 921HugePages_Surp: 0Hugepagesize: 2048 kB
出现不为0的值,HugePagesFree小于HugePagesTotal.
3.5 启动MySQL 可能遇到的问题
在启动mysql的时候,最容易报的错误是:
[Warning] InnoDB: Failed to allocate 140509184 bytes. errno 12[Warning] InnoDB: Using conventional memory pool
出现上面的提示大概率是因为
1.nr_hugepages的值*2M小于innodb使用的内存大小,需要调整nr_hugepages 的值。
2.针对mysql用户组的 memlock 是否设置。在启动mysql时,一定要先查看用ulimit -a 来查看max locked memory 设置是否合理。
3.6 压测结果
OS centos 7.10 内核 3.10
DB 相关压测参数
两个实例 一个开启和未开启 大页性能无差异。和网上的资料说性能会有所提升不一致。
四 总结
我根据 官方文档 和网上的相关资料,检查了开启内存大页的步骤没有异常,而且压测两次。如果读者朋友中有压测huge page且有性能提升的,欢迎留言相互交流学习。
参考文章
官方文档
https://dev.mysql.com/doc/refman/5.7/en/large-page-support.html
InnoDB启用大内存页
https://www.cnblogs.com/gomysql/p/3627915.html
Huge Page 是否是拯救性能的万能良药?
http://cenalulu.github.io/linux/huge-page-on-numa/
huge page 能给MySQL 带来性能提升吗?的更多相关文章
- Huge Page 是否是拯救性能的万能良药?
本文将分析是否Huge Page在任何条件下(特别是NUMA架构下)都能带来性能提升. 本博客已经迁移至: http://cenalulu.github.io/ 为了更好的体验,请通过此链接阅读: h ...
- [转帖]Huge Page 是否是拯救性能的万能良药?
Huge Page 是否是拯救性能的万能良药? 本文将分析是否Huge Page在任何条件下(特别是NUMA架构下)都能带来性能提升. 文章欢迎转载,但转载时请保留本段文字,并置于文章的顶部 作者:卢 ...
- 第 10 章 MySQL Server 性能优化
前言: 本章主要通过针对MySQL Server(mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化,但不包括mysqld之外的比如存储引擎相关的 ...
- MySql(十):MySQL性能调优——MySQL Server性能优化
本章主要通过针对MySQL Server( mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化,但不包括mysqld之外的比如存储引擎相关的参数优 ...
- MySQL 8.0 —— CATS事务调度算法的性能提升
原文地址:https://mysqlserverteam.com/contention-aware-transaction-scheduling-arriving-in-innodb-to-boost ...
- memcache 与 redis 为web app 带来的性能提升
memcache 与 redis 为web app 带来的性能提升 参考: 1. http://www.cnblogs.com/ToDoToTry/p/3513688.html
- 提升mysql服务器性能(复制原理与拓扑优化)
原文:提升mysql服务器性能(复制原理与拓扑优化) 版权声明:皆为本人原创,复制必究 https://blog.csdn.net/m493096871/article/details/9008171 ...
- 提升mysql服务器性能(HA MMM MHA MaxScale)
原文:提升mysql服务器性能(HA MMM MHA MaxScale) 版权声明:皆为本人原创,复制必究 https://blog.csdn.net/m493096871/article/detai ...
- 提升mysql服务器性能(索引与查询优化)
原文:提升mysql服务器性能(索引与查询优化) 版权声明:皆为本人原创,复制必究 https://blog.csdn.net/m493096871/article/details/90138407 ...
随机推荐
- 【报错】org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webSocketHandlerMapping' defined in class path resource
环境:maven+eclipse+jdk1.8 [tomcat使用的是maven自带的插件,实质原因就是出在tomcat版本问题] 背景:在进行SSM集成WebSocket的时候,项目启动报org.s ...
- SimpleDateFormat线程不安全的5种解决方案!
1.什么是线程不安全? 线程不安全也叫非线程安全,是指多线程执行中,程序的执行结果和预期的结果不符的情况就叫做线程不安全. 线程不安全的代码 SimpleDateFormat 就是一个典型的线程不 ...
- QFNU-ACM 2019.5.23组队赛 2019山东省赛复现
A.Calandar 题意:一年12个月,一个月30天,5天一周,已知某天的年月日星期数,求所给年月日的星期数是多少 思路:直接进行计算,其实每个月每年都是等长度的就使得计算的时候忽略年月,可以直接进 ...
- jQuery的入口和jQurey的对象切换
jQuery jQuery的导入 通过script标签的src属性,link标签是导入层叠样式表 jQuery和原生JS的入口函数 1.jQ在页面结构加载完毕就会执行 原生JS的入口函数是等图片.层叠 ...
- 探索专有领域的端到端ASR解决之道
摘要:本文从<Shallow-Fusion End-to-End Contextual Biasing>入手,探索解决专有领域的端到端ASR. 本文分享自华为云社区<语境偏移如何解决 ...
- [bug] ORACLE not available
参考 https://www.cnblogs.com/sank/p/10046277.html
- Linux下获取当前的目录,需执行以下命令: $(cd `dirname $0`;pwd)
Linux下获取当前的目录,需执行以下命令: $(cd `dirname $0`;pwd) 其中, dirname $0,取得当前执行的脚本文件的父目录 cd `dirname $0` ...
- python类内部方法__setattr__ __getattr_ __delattr__ hasattr __getattribute__ __getitem__(),__setitem__(), __delitem__()
主要讲类的内部方法 __setattr__ __getattr_ __delattr__ hasattr __getattribute__ __getitem__(),__setitem__ ...
- 006.Ansible自定义变量
ansible支持变量,用于存储会在整个项目中重复使用到的一些值.以简化项目的创建与维护,降低出错的机率. 变量的定义: 变量名应该由字母.数字下划数组成 变量名必须以字母开头 ansible内置关键 ...
- C语言中位运算异或“∧”的作用
1.概念异或运算符"∧"也称XOR运算符.它的规则是若参加运算的两个二进位同号,则结果为0(假):异号则为1(真).即 0∧0=0,0∧1=1, 1^0=1,1∧1=0.运算 ...