在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所需要的内存大小。