最近一直在做性能压测相关的事情,有公众号的读者朋友咨询有赞的数据库服务器有没有开启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 带来性能提升吗?的更多相关文章

  1. Huge Page 是否是拯救性能的万能良药?

    本文将分析是否Huge Page在任何条件下(特别是NUMA架构下)都能带来性能提升. 本博客已经迁移至: http://cenalulu.github.io/ 为了更好的体验,请通过此链接阅读: h ...

  2. [转帖]Huge Page 是否是拯救性能的万能良药?

    Huge Page 是否是拯救性能的万能良药? 本文将分析是否Huge Page在任何条件下(特别是NUMA架构下)都能带来性能提升. 文章欢迎转载,但转载时请保留本段文字,并置于文章的顶部 作者:卢 ...

  3. 第 10 章 MySQL Server 性能优化

    前言: 本章主要通过针对MySQL Server(mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化,但不包括mysqld之外的比如存储引擎相关的 ...

  4. MySql(十):MySQL性能调优——MySQL Server性能优化

    本章主要通过针对MySQL Server( mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化,但不包括mysqld之外的比如存储引擎相关的参数优 ...

  5. MySQL 8.0 —— CATS事务调度算法的性能提升

    原文地址:https://mysqlserverteam.com/contention-aware-transaction-scheduling-arriving-in-innodb-to-boost ...

  6. memcache 与 redis 为web app 带来的性能提升

    memcache 与 redis 为web app 带来的性能提升 参考: 1. http://www.cnblogs.com/ToDoToTry/p/3513688.html

  7. 提升mysql服务器性能(复制原理与拓扑优化)

    原文:提升mysql服务器性能(复制原理与拓扑优化) 版权声明:皆为本人原创,复制必究 https://blog.csdn.net/m493096871/article/details/9008171 ...

  8. 提升mysql服务器性能(HA MMM MHA MaxScale)

    原文:提升mysql服务器性能(HA MMM MHA MaxScale) 版权声明:皆为本人原创,复制必究 https://blog.csdn.net/m493096871/article/detai ...

  9. 提升mysql服务器性能(索引与查询优化)

    原文:提升mysql服务器性能(索引与查询优化) 版权声明:皆为本人原创,复制必究 https://blog.csdn.net/m493096871/article/details/90138407 ...

随机推荐

  1. 鼠标右键添加vscode

    实现效果 右键文件夹,可以使用vscode打开 右键文件,可以使用vscode打开 右键空白处,可以使用vscode打开 进行实现 下载压缩包 为了方便操作,和减少错误,将.reg文件上传到网盘中,点 ...

  2. 【maven】mvn不是内部命令 也不是可运行的程序

    按解压.配置环境变量,重启cmd,还是出现这个问题 使用java -version确定是不是安装了jdk.因为maven是java开发,需要依赖jdk 将系统变量中Path的%MAVEM_HOME%\ ...

  3. PHP 上传文件至阿里云OSS对象存储

    简述 1.阿里云开通对象存储服务 OSS 并创建Bucket 2.下载PHP SDK至框架扩展目录,点我下载 3.码上code 阿里云操作 开通对象存储服务 OSS 创建 Bucket 配置Acces ...

  4. mybatis增删改返回的int是-2147482646,并不是想要返回结果

    MyBatis发现更新和插入返回值一直为"-2147482646"的错误是由defaultExecutorType设置引起的,如果设置为batch,更新返回值就会丢失,返回结果就只 ...

  5. @JsonFormat 格式化时间 时出现时间不准确问题

    今天突然报个问题,简单来说说就是数据库某一字段的记录时间为 14点,然而展示到前台却是 6点 我腚眼一看,postman测试的数据也是6点 然而idea查出来的并不是6点 再仔细一瞅idea实体类的时 ...

  6. 服务治理演进剖析 & Service Mesh、 xDS核心原理梳理

    基于XDS协议实现控制面板与数据面板通信分享 基于这段时间在同程艺龙基础架构部的蹲坑,聊一聊微服务治理的核心难点.历史演进.最新动态, 以上内容属自我思考,不代表同程艺龙技术水准.如理解有偏差.理解不 ...

  7. Java匿名对象导致的内存泄漏

    这几天与在某群与群友讨论了Runnable匿名对象导致内存泄漏的相关问题,特此记录一下. 示例代码如下: package com.memleak.memleakdemo; public class L ...

  8. X Sever —— Xorg

    X Sever -- Xorg  发表于 2020-03-20 分类于 系统服务 , Xorg 阅读次数:39 阅读次数:48 本文字数: 7k 阅读时长 ≈ 6 分钟 Xorg:基于X11协议的服务 ...

  9. 马哥Linux SysAdmin学习笔记(二)

    Linux网络属性管理: 局域网:以太网,令牌环网 Ethernet:CSMA/CD 冲突域 广播域 MAC:media access control地址 48bit: 24bits 24bits  ...

  10. linux rpm包解压

    rpm2cpio xxx.rpm | cpio -div