mysql使用large_pages来提升性能

32 篇文章 0 订阅

在Linux系统当中默认值的内存页通常为4KB。实际实现取决于底层硬件和操作系统。执行大量内存访问的应用程序可能会因为减少了转换后备缓冲区(TLB)丢失而使用大页面来提高性能。通过增大页面大小来减少 TLB 条目数。

hugepages相关概念:

Page Table: page table是一种用于物理地址到虚拟之间的映射。对于内存的访问,先是访问Page Table,然后根据Page Table 中的映射关系,隐式的转移到物理地址来存取数据。

TLB: Translation Lookaside Buffer (TLB) ,CPU中的一块固定大小的cache,包含了部分page table的映射关系,用于快速实现虚拟地址到物理地址的转换。

hugetlb: hugetlb 是TLB中指向HugePage的一个entry(通常大于4k或预定义页面大小)。 HugePage 通过hugetlb entries来实现,也可以理解为HugePage 是hugetlb page entry的一个句柄。

hugetlbfs: 一个类似于tmpfs的新的in-memory filesystem,在2.6内核被提出。

未使用Huge pages的映射过程:

process-->page table-->memory过程:

PROCESS:                                            SYSTEM CPU CACHE:                                              MEMORY:                                            

process1

pagetable   ----------------------->             process1 page table>>page table   ------------------------>   4K

pagetable   ----------------------->             process1 page table>>page table   ------------------------>   4K

 

process2

pagetable   ----------------------->             process2 page table>>page table   ------------------------>   4K

pagetable   ----------------------->             process2 page table>>page table   ------------------------>   4K

 

使用Huge pages的映射过程(process1使用Huge pages,process2未使用):

process-->page table-->memory过程:

PROCESS:                                            SYSTEM CPU CACHE:                                              MEMORY:                                            

process1

pagetable   ----------------------->             process1 page table>>page table   ------------------------>   2048 K

pagetable   ----------------------->             process1 page table>>page table   ------------------------>   2048 K

 

process2

pagetable   ----------------------->             process2 page table>>page table   ------------------------>   4K

pagetable   ----------------------->             process2 page table>>page table   ------------------------>   4K

 

在centos系统中,hugepages的大小默认为2048KB大小:

  • AnonHugePages。匿名 HugePages 数量。
  • HugePages_Total。HugePages 数量。大小为空间大小除以2M。单位为页
  • HugePages_Free。尚未分配的空闲 HugePages 数量。
  • HugePages_Rsvd。“reserved”的缩写形式,表示已经承诺分配但尚未分配的 HugePages 数量。保留的 HugePages 保证应用程序随时请求都能够从 HugePages 池分配 HugePages。
  • HugePages_Surp。“surplus”的缩写形式,表示池中大于 /proc/sys/vm/nr_hugepages 中值的 HugePages 数量。剩余 HugePages 的最大数量由 /proc/sys/vm/nr_overcommit_hugepages 控制。此值为 0 的情况很常见。
  • Hugepagesize。HugePage 的大小。此参数当前为 2048 或 2 MB,默认为2MB。

 

Hugepages有点和缺点:

优点:

无需交换。也就是说不存在swap换入换出问题。

减少 TLB 条数,释放压力,所管理的虚拟地址数量更少,可以包含更多的地址空间,寻址能力更强。

降低page table负载。

提高内存的整体性能。

缺点:

一次性分配,如果没有手动介入,那么永远不会释放

hugepages与传统4KB页使用内存不同,两者不能一起使用。

 

前提:

Linux系统必须支持Hugepages,查看是否支持:

cat /proc/meminfo | grep -i huge | wc -l > 0 则为支持

如何配置Hugepages:

一、系统层面:

1)编辑/etc/security/limits.conf文件,设置memlock值:

mysql   soft   memlock    设置为内存大小单位为K
mysql   hard   memlock    设置为内存大小单位为K

说明:soft为警告值,hard才是真正的阀值,超过会报错,mysql为用户

------或者临时改变:ulimit -l unlimited

2)修改内存中的大页数量,根据自己内存设置,如果innodb缓冲池为4G,那么应该设置为:4*1024/2+15

注意:nr_hugepages必须设置为大于innodb总大小,下面给出公式,自己计算即可。

说明:4*1024/2+15

上面公式中,4代表的是innodb缓冲池大小为4G,4*1024转换为MB,然后除以2是计算出需要多少大页,数字2代表Linux系统大页默认大小为2MB,最后+15是因为大页大小必须大于innodb配置的大小:

大于innodb_buffer_pool_size+innodb_additional_mem_pool_size+innodb_log_buffer_size+tmp_table_size

echo 1039 > /proc/sys/vm/nr_hugepages

3)修改哪个用户进程使用hugepages:

查找出mysql进程的mysql用户的所在组,mysql用户必须是该组的成员。

echo 1001 > /proc/sys/vm/hugetlb_shm_group

4)配置共享内存大小:

一般设置为和内存大小相同。

shmall 是全部允许使用的共享内存大小,shmmax 是单个段允许使用的大小。

shmmax 单位为B,shmall 单位为页(4K)

对于MySQL的使用,通常希望值 shmmax接近于的值 shmall

二、mysql层面:

1)只需在my.cnf文件中加入:

[mysqld]

large-pages

即可启用支持

 

查看是否启动成功:

查看mysql错误日志,如果显示:

说明你的参数没有配置合理,需要增大/proc/sys/vm/nr_hugepages大页的数量,使其大于innodb所需要的内存大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值