mysql使用large

    xiaoxiao2022-06-27  148

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


    最新回复(0)