前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >huge page 能给MySQL 带来性能提升吗?

huge page 能给MySQL 带来性能提升吗?

作者头像
田帅萌
发布于 2019-08-23 06:26:23
发布于 2019-08-23 06:26:23
1.2K00
代码可运行
举报
文章被收录于专栏:「3306 Pai」社区「3306 Pai」社区
运行总次数:0
代码可运行

一 前言

最近一直在做性能压测相关的事情,有公众号的读者朋友咨询有赞的数据库服务器有没有开启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%。计算公式如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# id mysql
uid=27(mysql) gid=27(mysql) groups=27(mysql)

echo 27 > /proc/sys/vm/hugetlb_shm_group

3.3 为 mysql 用户提供memlock限制的“无限”值

编辑/etc/security/limits.conf 增加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#<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是否生效
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# cat /proc/meminfo | grep Huge
AnonHugePages:   1294336 kB
HugePages_Total:    5834
HugePages_Free:     1394
HugePages_Rsvd:      921
HugePages_Surp:        0
Hugepagesize:       2048 kB

出现不为0的值,HugePagesFree小于HugePagesTotal.

3.5 启动MySQL 可能遇到的问题

在启动mysql的时候,最容易报的错误是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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且有性能提升的,欢迎留言相互交流学习。

参考文章

官方文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://dev.mysql.com/doc/refman/5.7/en/large-page-support.html

InnoDB启用大内存页

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://www.cnblogs.com/gomysql/p/3627915.html
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 3306pai 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二 Huge Page 来龙去脉
    • 2.1 为什么需要Huge Page
    • 2.2 HugePage的优势:
  • 三 mysql 如何用huge page
    • 3.1 计算需要多少 huge pages
    • 3.2 设置mysql用户组使用huge pages
    • 3.3 为 mysql 用户提供memlock限制的“无限”值
    • 3.4验证hugepage是否生效
    • 3.5 启动MySQL 可能遇到的问题
    • 3.6 压测结果
  • 四 总结
    • 参考文章
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档