您的当前位置:首页Linux HugePages及MySQL 大页配置

Linux HugePages及MySQL 大页配置

2023-11-10 来源:哗拓教育

      ㈠ HugePages简介             HugePages是kernel 2.6引入以便适应越来越大的物理内存        在Linux下、page size默认是4K、如果使用HugePages、默认是2M             再看2个术语:        page table 映射表:物理内存和swap的对应关系、访问内存是先读page table、根据表里的映射关系操作        TLB :cpu cache组件、缓存部分page table以提高转换速度                    ㈡ MySQL 配置大页            好处              ① 提高TLB的命中率         ② 利用HugePages不会被Swap 的特性保证MySQL内存不会被交换到Swap中              目前在MySQL中HugePages只被InnoDB所支持              以下简单介绍其配置流程       

       ⑴ 配置前:

 

[plain] view plain copy  print?
  1. [root@cdio ~]# cat /proc/meminfo | grep -i huge  
  2. HugePages_Total:     0  
  3. HugePages_Free:      0  
  4. HugePages_Rsvd:      0  
  5. Hugepagesize:     2048 kB  
       ⑵ 设置大页数量、每页通常2M、20个就40M、系统要有足够的内存待分配

 

 

[plain] view plain copy  print?
  1. [root@obe11g ~]# echo 20 > /proc/sys/vm/nr_hugepages  
       ⑶ 增加最大共享内存段的大小、本例12G

 

 

[plain] view plain copy  print?
  1. [root@obe11g ~]# echo 1560281088 > /proc/sys/kernel/shmmax  
       ⑷ 增加共享内存的大小、每页4K

 

 

[plain] view plain copy  print?
  1. [root@obe11g ~]# echo 4194304 > /proc/sys/kernel/shmall  
       ⑸ 将mysql用户所属组添加到系统内核中

 

 

[plain] view plain copy  print?
  1. [root@obe11g ~]# more /proc/sys/vm/hugetlb_shm_group  
  2. 0  
  3. [root@obe11g ~]# id mysql  
  4. uid=501(mysql) gid=501(dba) groups=501(dba)  
  5. [root@obe11g ~]# echo 501 > /proc/sys/vm/hugetlb_shm_group  
       ⑹ 再次确认配置情况

 

 

[plain] view plain copy  print?
  1. [root@obe11g ~]# cat /proc/meminfo | grep -i huge  
  2. HugePages_Total:    20  
  3. HugePages_Free:     20  
  4. Hugepagesize:     4096 kB  
       ⑺ 设置max locked memory

 

 

[plain] view plain copy  print?
  1. [root@obe11g ~]# cat /etc/security/limits.conf  | grep -i mysql  
  2. mysql            hard    memlock         unlimited  
  3. mysql            soft    memlock         unlimited  
       ⑻ 配置 my.cnf

 

 

[plain] view plain copy  print?
  1. [mysqld]  
  2. large-pages  
       ⑼ 启动mysqld            ⑽ 观察HugePages 使用情况

 

 

[plain] view plain copy  print?
  1. [root@obe11g ~]# grep -i huge /proc/meminfo  
  2. HugePages_Total:    20  
  3. HugePages_Free:     16  
  4. Hugepagesize:     4096 kB  
 

 

Linux HugePages及MySQL 大页配置

标签:

小编还为您整理了以下内容,可能对您也有帮助:

如何使用 Linux Huge Pages 配置大型数据库的 x86 内存性能

大型数据库系统的性能调优颇具挑战性。根据操作系统 (OS) 和硬件的不同,有些性能问题可能难以通过常规分析方法(如 AWR 报表)和操作系统工具(如 sar、top 和iostat)来检测。

x86 环境中的内存利用率就是一个难以识别的问题,但如果分析和配置得当,可显著提升性能。

想对本文发表评论吗?请将链接发布在 的 OTN Garage 页面上。有类似文章要分享?请将其发布在 或 Twitter 上,我们来进行讨论。

现在的系统内存更大,内存利用率成为一个亟待解决的重要问题。本文介绍如何最佳配置大型数据库的 x86 系统内存性能。

适用于 x86 平台的虚拟内存架构

与最初时相比,x86 和 x86-64 芯片组的内存架构已经发生巨大变化;但默认内存页面大小却一直未变。遇到使用大量内存的大型应用程序(如数据库)时,这可能导致效率低下或开销过大。

x86 架构是一种虚拟内存架构,其允许寻址范围超过硬件中的可用物理内存。这通过允许每个进程拥有自己可寻址的内存来实现。该进程认为此内存是专供自己使用的。这称为进程的虚拟内存。实际上,此内存可以是实际驻留于 RAM 芯片上的物理内存,也可以存储在物理磁盘上被称作交换区 或分页区 的专用区域中。

进程不知道虚拟内存是存储在 RAM 中还是磁盘上;内存由操作系统管理。如果所需内存超过可用物理内存,操作系统会将一些内存移出到分页区。这种活动效率极低,是导致性能问题的常见原因。由于磁盘的存取速度远低于 RAM,“分页”的进程会遇到显著的性能问题。

Oracle 数据库和 Linux 内存管理

系统中使用的内存越多,管理该内存所需的资源也就越多。对于 Linux 操作系统,通过 Linux kswapd 进程和页表内存结构(针对系统中存在的每个进程包含一条记录)实现内存管理。每条记录包含进程使用的每页虚拟内存及其物理地址(RAM 或磁盘)。通过使用处理器的转换旁路缓冲区(TLB,一小块缓存)为该进程提供帮助。

当大量内存用于 Oracle 数据库时,操作系统将消耗大量资源来管理虚拟地址到物理地址转换,其结果往往是一个非常大的页表结构。由于每条页表条目包含进程正在使用的所有内存页面的虚拟地址到物理地址的转换,因此对于非常大的系统全局区 (SGA),每个进程的页表条目都可能很大。例如,使用 8 GB 内存的 Oracle 数据库进程的页表条目将达 8 GB/4 KB(即 2097152 条记录或页面)。如果有 100 个 Oracle 数据库会话/进程,则将页面数乘以 100。您可以看到,要管理的页面数量巨大。

同样,操作系统使用页表条目管理系统中进程所用的内存。在 Linux 中,执行此管理的操作系统进程被称作 kswapd,可在操作系统工具中找到。

TLB 缓存将缓存页表条目来提高性能。典型的 TLB 缓存可保存 4 到 4096 个条目。对于数百万甚至数十亿个页表条目,这种缓存就不够用了。

如上所述,对于使用大型 SGA 的系统,页表结构可能会变得非常大。清单 1 中的 Linux 系统输出示例显示页表条目占用了 766 MB 的 RAM。这可能导致显著的系统开销。我亲眼见过数 GB 的页表条目。

HugePages 是 Linux 操作系统的一个内核特性,让操作系统可以支持现代硬件架构的大页面容量功能。对于 Oracle 数据库,通过启用 HugePages 并使用大页面,可以用一个页表条目代表一个大页面,而不是使用许多条目代表较小的页面,从而可以管理更多内存,减少操作系统对页面状态的维护并提高 TLB 缓存命中率。在 Linux 中,大页面大小为 2 MB。

在 Oracle Linux 6 或 Red Hat Enterprise Linux 6 (RHEL 6) 中,可在 /proc/meminfo 中找到分配的 HugePages 数,如清单 1 所示:

[root@ptc1 ~]# cat /proc/meminfo

MemTotal: 4045076 kB

MemFree: 14132 kB

Buffers: 656 kB

Cached: 1271560 kB

SwapCached: 6184 kB

Active: 2536748 kB

Inactive: 625616 kB

HighTotal: 0 kB

HighFree: 0 kB

LowTotal: 4045076 kB

LowFree: 14132 kB

SwapTotal: 1052216 kB

SwapFree: 0 kB

Dirty: 0 kB

Writeback: 0 kB

Mapped: 2036576 kB

Slab: 49712 kB

CommitLimit: 3074752 kB

Committed_AS: 8054664 kB

PageTables: 766680 kB

VmallocTotal:536870911 kB

VmallocUsed: 263168 kB

VmallocChunk:536607347 kB

HugePages_Total: 0

HugePages_Free: 0

Hugepagesize: 2048 kB

清单 1

在 Oracle Linux 6 中,分配的 HugePages 略有不同,如清单 2 所示:

AnonHugePages: 0 kB

HugePages_Total: 1508

HugePages_Free: 60

HugePages_Rsvd: 57

HugePages_Surp: 0

Hugepagesize: 2048 kB

DirectMap4k: 10240 kB

DirectMap2M: 16766976 kB

清单 2

Oracle Linux 6 HugePages 值如下所示:

AnonHugePages。匿名 HugePages 数量。Oracle Linux 6.5 中已删除此计数器。与透明 HugePages 有关。(有关透明 HugePages 的详细信息,请参见“透明 HugePages 和 Oracle 数据库”一节。)

HugePages_Total。HugePages 数量。空间大小为 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。

解决方案

通过在 Linux 中启用 HugePages,可以通过增大页面大小来减少 TLB 条目数。对于 Linux,HugePages 大小为 2 MB。通过为 Oracle 数据库 SGA 选用更大的页面,可大大减少要管理的页面数。

在清单 1 所示示例中,单条记录的虚拟地址到物理地址转换数将从 2097152 减少至 4096。这将减小页表结构的大小,提高 TLB 命中率,并降低 kswapd 使用率。

注:启用 HugePages 可显著提升性能。

在 Linux 中启用 HugePages

在 Linux 中,通过将 Linux 初始化参数 vm.nr_hugepages 设置为您希望为 Oracle 数据库 SGA 提供的 2 MB 页面数来配置 HugePages 功能。设置此参数可通过将其值调大来减少页面数。

注:Oracle Database 11g 中引入的 Oracle 数据库自动内存管理特性与 Linux HugePages 不兼容。HugePages 提供的性能改进优于自动内存管理所提供的易用性。

有关如何实现 HugePages 配置的详细信息,可在表 1 所示的 My Oracle Support 文档中找到。

表 1. My Oracle Support 文档

My Oracle Support 文档 ID

文档名称

1557478.11557478.1 “通知:SLES11、RHEL6、OEL6 和 UEK2 内核上禁用透明 HugePages”

361323.1 “Linux 上的 HugePages:它是什么……它不是什么”

361468.1 “Oracle Linux 64 位上的 HugePages”

749851.1 “Linux 上的 HugePages 和 Oracle Database 11g 自动内存管理 (AMM)”

1134002.1 “ASMM 和 LINUX x86-64 HugePages 支持”

401749.1 “用于计算推荐的 Linux HugePages/HugeTLB 配置的值的 Shell 脚本”

除了配置 vm.nr_hugepages,还可以将可选的 vm.hugetlb_shm_group 参数设置为有权使用 HugePages 的操作系统组。默认情况下,此参数设置为 0,从而允许所有组使用 HugePages。可以将此参数设置为 Oracle 数据库进程所属的操作系统组,如 oinstall。

验证是否已对 Oracle 数据库实例启用大页面

可以通过检查警报日志来验证是否对数据库实例启用了大页面。启动实例时,您应在警报日志中参数列表前面看到如下内容:

****************** Large Pages Information *****************

Total Shared Global Region in Large Pages = 28 GB (100%)

Large Pages used by this instance: 14497 (28 GB)

Large Pages unused system wide = 1015 (2030 MB) (alloc incr 64 MB)

Large Pages configured system wide = 19680 (38 GB)

Large Page size = 2048 KB

透明 HugePages 和 Oracle 数据库

最近,RHEL 6、Oracle Linux 6 和 SUSE Linux Enterprise Server 11 中引入了一个新特性 — 透明 HugePages。透明 HugePages 旨在自动、动态地利用 HugePages。遗憾的是,目前透明 HugePages 与传统 HugePages 联用会出现一些问题,导致性能问题和系统重启。在 My Oracle Support 说明 1557478.11557478.1 中,Oracle 建议不要同时使用透明 HugePages 和 Oracle 数据库。

注:在 Oracle Linux 6.5 版中,已删除透明 HugePages。

总结

通过使用更大的页面,可以减少页表条目数,从而最大程度减少开销。使用 HugePages 可显著提升性能,增加系统中的内存数量和 SGA 大小。

Hugepagesize相关配置(Linux | DPDK)

使用 cat /proc/meminfo | grep Huge 查看当前配置的Hugepagesize大小与数目

以下为临时配置2M*1024大页内存的方式:

配置完成之后可以使用 cat /proc/meminfo 查看是否成功。

然后将hugepages中的内存给DPDK使用:

修改/etc/default/grub 中的 GRUB_CMDLINE_LINUX,然后运行 grub 更新并重启系统:

在GRUB_CMDLINE_LINUX配置中添加以下内容

更新grub

重启系统

查看

注意:重启之后需要再重新加载UIO驱动以及绑定网卡

如何在linux下安装mysql数据库并配置

1)首先检查系统中是否已经安装了MySQL

在终端里面输入 sudo netstat -tap | grep mysql

若没有反映,没有显示已安装结果,则没有安装。若如下显示,则表示已经安装

Linux下MySQL的安装与配置 三联

2)如果没有安装,则安装MySQL.

在终端输入 sudo apt-get install mysql-server mysql-client

在此安装过程中会让你输入root用户(管理MySQL数据库用户,非Linux系统用户)密码,按照要求输入即可。如下所示:

3)测试安装是否成功:

在终端输入 sudo netstat -tap | grep mysql

4)也可通过登录MySQL测试

在终端输入 mysql -uroot -p 接下来会提示你输入密码,输入正确密码,即可进入。

5)MySQL的一些简单管理:

启动MySQL服务: sudo start mysql

停止MySQL服务: sudo stop mysql

修改 MySQL 的管理员密码: sudo mysqladmin -u root password newpassword

设置远程访问(正常情况下,mysql占用的3306端口只是在IP 127.0.0.1上监听,拒绝了其他IP的访问(通过netstat可以查看到)。取消本地监听需要修改 my.cnf 文件:):

sudo vi /etc/mysql/my.cnf

bind-address = 127.0.0.1 //找到此内容并且注释

6)MySQL安装后的目录结构分析(此结构只针对于使用apt-get install 在线安装情况):

数据库存放目录: /var/lib/mysql/

相关配置文件存放目录: /usr/share/mysql

相关命令存放目录: /usr/bin(mysqladmin mysqlmp等命令)

启动脚步存放目录: /etc/rc.d/init.d/

7)MySQL图形化管理软件

一般使用的有两个比较好,一个开源,一个商业收费:

开源:MySQL Workbench (具体使用介绍随着我的使用,我会慢慢总结)

商业:Navicat (收费的,有30天体验,之后我相信大家会有办法的)

显示全文