MySQL为什么要关闭透明大页

在MySQL的配置文件中,我们经常会看到一个配置项transparent_hugepage,它被用来控制操作系统是否启用透明大页。然而,在MySQL中,建议将透明大页关闭。那么,为什么MySQL要关闭透明大页呢?本文将从原理、问题和解决方案三个方面进行解析。

透明大页的原理

透明大页是操作系统(如Linux)提供的一种内存管理技术,它将连续的小页(通常为4KB)合并成一个大页(通常为2MB),减少了内存页表的开销和TLB(Translation Lookaside Buffer)的miss次数,从而提高内存访问性能。

透明大页的问题

然而,透明大页在某些场景下会导致MySQL性能下降,主要有以下两个问题:

1. 随机IO性能下降

在数据库中,随机访问是非常常见的操作,例如索引的查找操作。透明大页会将连续的小页合并成大页,但这样会导致数据库在进行随机IO时,需要加载更多的数据,增加了IO操作的开销,降低了随机IO性能。

2. 内存分配延迟增加

MySQL采用了自己的内存管理机制,在需要内存时会从操作系统申请一块连续的内存空间,然后再按需进行切分。透明大页会导致操作系统将一部分内存分配给大页,而MySQL却只需要小页大小的内存,这样会导致内存的浪费。而且在频繁的内存分配和释放过程中,透明大页会增加内存分配的延迟,降低了MySQL的性能。

关闭透明大页的解决方案

为了解决透明大页带来的性能问题,可以通过以下两种方式关闭透明大页。

1. 通过修改操作系统参数关闭透明大页

在Linux系统中,可以通过修改/sys/kernel/mm/transparent_hugepage/enabled文件来关闭透明大页。具体的操作步骤如下:

# 查看当前透明大页的状态
cat /sys/kernel/mm/transparent_hugepage/enabled

# 将透明大页关闭
echo never > /sys/kernel/mm/transparent_hugepage/enabled

# 再次查看透明大页的状态,确认是否关闭成功
cat /sys/kernel/mm/transparent_hugepage/enabled

2. 在MySQL配置文件中关闭透明大页

在MySQL的配置文件my.cnf中,可以添加以下配置项来关闭透明大页:

[mysqld]
# 关闭透明大页
innodb_use_native_aio=0

在MySQL重启后,透明大页将会被关闭。

总结

透明大页是一种提高内存访问性能的技术,但在某些场景下会导致MySQL性能下降。为了解决这个问题,我们可以通过修改操作系统参数或者在MySQL配置文件中关闭透明大页。关闭透明大页后,可以提高随机IO性能和内存分配的效率,从而提升MySQL的整体性能。

stateDiagram
    [*] --> 开始
    开始 --> 透明大页关闭
    透明大页关闭 --> 完成
    完成 --> [*]
gantt
    title 透明大页关闭甘特图

    section 关闭透明大页
    完成                   :done,    des1, 2022-09-01, 2022-09-02
    [*] --> 完成             : 2022-09-02

参考文献:

  1. [MySQL performance impact with Transparent Huge Pages (THP)](
  2. [How to disable transparent hugepages in Linux