---
title: 如何进行MySQL数据库基础性能调优-官方技术文章-鲲鹏社区
description: 指导开发者了解MySQL数据库基础性能调优思路，熟悉数据库在鲲鹏平台的基本调优方法
keywords: MySQL,如何进行,数据库基础性,能调优,官方技术文章,鲲鹏社区,鲲鹏平台硬件调优,操作系统调优
url: https://www.hikunpeng.com/developer/techArticles/20231018-3?envFlag=1
section: (其他)
---

# 如何进行MySQL数据库基础性能调优-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20231018-3?envFlag=1
描述: 指导开发者了解MySQL数据库基础性能调优思路，熟悉数据库在鲲鹏平台的基本调优方法
关键词: MySQL,如何进行,数据库基础性,能调优,官方技术文章,鲲鹏社区,鲲鹏平台硬件调优,操作系统调优

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

如何进行MySQL数据库基础性能调优

如何进行MySQL数据库基础性能调优

实战经验

发表于 2023/10/18

0

本文我们一起了解一下MySQL的数据库基础性能调优思路，熟悉数据库在鲲鹏平台的基本调优方法。MySQL数据库的基础性能调优通常可以从硬件、操作系统和MySQL应用程序本身3个方面入手，如图3-1所示。

（1）通过调整鲲鹏平台的硬件参数来调优，包括硬盘、网络、内存、CPU几个维度的优化。由于数据库是IO敏感型应用，IO时延对其影响很大。数据库存储通常选择IO时延比较低的硬盘介质，如NVMe、SSD等。网卡时延对带宽、对数据库的影响也比较大，尤其是集群和分布式架构的数据库，对网络时延要求比较高。

（2）通过调整操作系统的参数来调优，例如通过中断绑核的方式把一些后台线程由网络中断绑定在固定的CPU核上，减少上下文的切换，提升应用的性能。

（3）通过调整MySQL数据库应用本身的参数，以及借助鲲鹏BoostKit提供的加速特性来调优，使得数据库在鲲鹏平台上运行的性能更优。

图3-1 MySQL数据库基础性能调优思路

## 鲲鹏平台硬件调优

您可以根据具体的业务应用场景和需求来对鲲鹏硬件进行调优，同时可以结合性能测试工具进行测试和优化。表3-1中给出了针对鲲鹏服务器BIOS的一些优化手段，可以有效提升服务器性能。

进入鲲鹏服务器BIOS设置界面的具体操作请参见《TaiShan 服务器 BIOS 参数参考(鲲鹏920处理器) [了解详情](https://support.huawei.com/enterprise/zh/doc/EDOC1100088653)》中“进入BIOS界面”的相关内容。

表3-1 鲲鹏平台硬件调优

| 优化手段 | 优化建议 | 配置方法 |
| --- | --- | ---|
| SMMU | SMMU（System Memory Management Unit）是IO设备与总线桥之间的一个地址转换桥，可以实现虚拟地址到物理地址的转换，同时还可以对内存访问进行权限控制和缓存管理，确保系统内存的安全和高效使用。因为数据库通常会使用大量的内存和IO资源，而SMMU会增加额外的开销和延迟，从而降低系统的性能。因此在数据库场景，开启SMMU并不能获得更好的性能。此外，SMMU还可以减少系统的复杂性和维护成本。因此在鲲鹏平台，建议在BIOS中将SMMU。 | 进入BIOS，选择“Advanced > MISC Config >
  Support Smmu”，设置为“Disable”。 |
| 硬件预取 | 硬件预取是通过跟踪指令和数据地址的变化，将指令和地址提前读到Cache里，硬件预取对数据库场景的性能有影响，建议在BIOS中将预取功能。 | 进入BIOS，选择“Advanced > MISC Config >
  CPU Prefetching Configurtion”，设置为“Disabled”。 |
| 设置CPU工作模式为“性能模式” | 在数据库场景下，建议在BIOS中将CPU工作模式设置为“性能模式”，提高CPU的运行速度和响应速度，从而提高数据库的处理能力和响应速度。“性能模式”会将CPU的频率提高到最大值，以便更快地处理数据。此外，性能模式还会一些省电功能，如动态频率调节和睡眠状态，以确保CPU在高负载情况下保持高性能。 | 进入BIOS，选择“Advanced > Perfomrance Config
  > Power Policy”，设置为“Performance”。 |
| 内存刷新频率 | 内存刷新频率是指将内存中的数据写入磁盘的时间间隔。为了平衡数据的一致性和性能，同时兼顾实际运行的系统负载、数据量等因素，建议在BIOS中将内存刷新频率设置为64ms。（1）如果内存刷新频率太低，可能会导致数据丢失或不一致。（2）如果内存刷新频率太高，可能会导致过多的磁盘IO操作，降低系统性能。在实际应用中，设置为64ms是一个比较合理的值，一方面可以保证数据的一致性，另一方面也不会对系统性能造成太大的影响。 | 进入BIOS，选择“Advanced > Memory Config > Custom Refresh Rate”，设置为“64ms”。 |

## 操作系统调优

在数据库场景下，针对操作系统进行调优，可以提高数据库的性能和稳定性，本文提供两种常见的操作系统调优方法。

### 1. irqbalance

CPU与磁盘、网卡、键盘等外部设备交互时，CPU下发IO请求到这些设备后，相对于CPU的处理能力而言，磁盘、网卡等设备需要较长时间完成请求处理。在请求发出到处理完成这段时间，CPU下发请求后执行其他进程，磁盘等外部设备完成处理后主动告知CPU，这种机制叫做中断。irqbalance会将中断尽可能均匀地分发到多个CPU核，充分利用CPU的多核优势。但在实际的应用场景中，将中断分发到多个核上，并不能发挥多核的优势，反而对性能有一定的影响。因此建议在数据库场景irqbalance，然后通过人工手动绑核进行性能调优。具体配置步骤如下：

步骤 1：请在服务器上执行以下命令irqbalance。

```
systemctl stop irqbalance.service
systemctl disable irqbalance.service
```

步骤 2：查看irqbalance服务状态是否已。

```
systemctl status irqbalance.service
```

回显信息中状态为“inactive”即为。

----结束

### 2. 网卡中断绑核

人工适当对网卡进行中断绑核能够提高网络IO性能以及应用程序的整体性能。如果监控到中断核对应CPU利用率过高，可以参考以下原则调整绑核策略。

（1）中断核/业务核分离。

将中断处理与应用程序分开绑核，可以减少线程切换开销。

（2）中断均匀分布在目标CPU上，尽量使各中断核负载均衡。

（3）中断核负载过大时，增加中断核数量、网卡队列数量。

1）中断核满载，增加核数，减少每核绑定的中断号。

2） 当中断队列不足时，可以通过ethtool -L $DEV combined $number命令增大中断队列。例如以下命令将网卡enp61s0f1的中断队列数调整为32：

```
ethtool -L enp61s0f1 combined 32
```

您可以执行如下命令查看最大可设置中断队列数。

```
ethtool -l $DEV
```

预期结果示例：

```
ethtool -l ens2f1
Channel parameters for ens2f1:
Pre-set maximums:
RX: 0
TX: 0
Other: 1
Combined: 64 //最大中断队列数
Current hardware settings:
RX: 0
TX: 0
Other: 1
Combined: 8 //当前中断队列数
```

通过查看“proc/interrupts”文件来查看网卡的中断号，然后手动将中断绑到不同的CPU核上。绑核具体操作步骤如下：

步骤 1：查找网卡中断号。

中断信息保存在“/proc/interrupts”中，可通过下面任一方式查询：

（1）通过网卡名查询

```
grep $nic /proc/interrupts | awk '{print $1, $NF}'
```

（2）通过驱动信息、总线地址查询

部分网卡无法通过网卡名在中断表中查询到，可以使用驱动信息及总线地址。

获取网卡驱动及总线地址信息。

```
ethtool -i $nic
```

通过驱动信息查询网卡中断号。如果同一驱动对应多张网卡，可通过总线地址进一步筛选。

```
grep $nic_driver /proc/interrupts | awk '{print $1, $NF}'
```

步骤 2：目标CPU。

建议将中断绑定到网卡所在NUMA的CPU上。

（1）查看网卡所在NUMA。

```
cat /sys/class/net/enp61s0f3/device/numa_node
```

（2）查询NUMA对应CPU。

```
lscpu
```

步骤 3：执行绑核命令。

将步骤2和步骤3中的CPU序号绑定对应中断号。

```
echo ${cpu1} > /proc/irq/${irq1}/smp_affinity_list echo ${cpu2} > /proc/irq/${irq2}/smp_affinity_list
```

步骤 4：检查绑核情况。您可以通过以下两种方式检查：

（1）查看网络，预期效果是通过预期的网口进行收发包。

```
sar -n DEV 1
```

（2）执行相关压测命令，通过top等工具观测中断核，预期效果是存在较高的内核占用。

----结束

## MySQL数据库参数调优

MySQL数据库参数调优是提高数据库性能的重要手段之一。由于MySQL数据库是动态管理系统，在实际应用中，有时会因参数调整不当而降低MySQL的性能，因此需要通过调节MySQL参数来优化它的性能。MySQL配置文件的默认路径为“/etc/my.cnf”。本文我们主要介绍MySQL InnoDB存储引擎的内存、并发控制、IO相关参数如何进行调整，以达到性能最优，如表3-2所示。表3-2 MySQL数据库参数调优

| 参数类型 | 参数名称 | 参数含义 | 优化建议 |
| --- | --- | --- | ---|
| 内存参数 | innodb_buffer_pool_size | 该参数指定了InnoDB缓冲池的大小。InnoDB缓冲池是一个内存区域，用于存储InnoDB表的数据和索引。 | 增加该参数，可使更多数据Cache在内存，减少IO操作。建议设置为物理内存的70%左右。 |
| innodb_buffer_pool_instances | 该参数用于控制InnoDB缓冲池的实例数量。 | 增加缓冲池实例数可以减少内存热点页面的争用，从而提高内存读取的并发性。建议设置为8～32。 |  |
| innodb_log_buffer_size | 该参数用于控制InnoDB事务日志缓冲池的大小。 | （1）如果该参数设置得太小，InnoDB事务日志缓冲池可能会频繁地刷新到磁盘，导致性能下降。（2）如果该参数设置得太大，会占用过多的内存资源，导致系统的稳定性受到影响。合理增加日志缓冲池大小，可提升事务提交效率，尤其在大事务和高并发场景，减少日志刷盘的次数。通过查看innodb_log_wait值，来调整innodb_log_buffer_size值。以下两种情况可以考虑innodb_log_buffer_size参数的值：（1）如果innodb_log_wait值不等于0并且持续增长时，表明InnoDB存储引擎的日志缓冲池（innodb_log_buffer）空间不足，导致innodb_log_buffer需要等待。（2）如果innodb_log_wait值较高，说明InnoDB存储引擎需要更多的日志缓冲池空间。默认值是64MB。 |  |
| 并发控制参数 | innodb_thread_concurrency | 该参数用于控制InnoDB存储引擎在执行查询时使用的并发线程数。 | 高并发场景，可调整该参数，减少InnoDB层的资源争用。建议取默认值为0，它表示默认情况下不限制线程并发执行的数量。 |
| innodb_spin_wait_delay | 该参数用于控制spin_lock轮询的时间间隔。 | 可通过热点函数来对该参数进行优化，尤其在整机单实例场景下，建议将对参数优化，小规格单实例场景默认值即可。建议设置为180。 |  |
| innodb_sync_spin_loops | 该参数用于控制spin_lock轮询的循环次数。 | 可通过热点函数来对该参数进行优化，尤其在整机单实例场景下，建议将对参数优化，小规格单实例场景默认值即可。建议设置为25。 |  |
| innodb_spin_wait_pause_multiplier | 该参数用于控制spin_lock轮询间隔随机数。 | 可通过热点函数来对该参数进行优化，尤其在整机单实例场景下，建议将对参数优化，小规格单实例场景默认值即可。默认值50，建议设置为25～50。 |  |
| IO参数 | innodb_io_capacity | 该参数定义了InnoDB后台线程每秒可用的IO操作数，即IOPS。 | 建议设置为磁盘IOPS总能力的75%（磁盘IOPS是指innodb_page_size大小的数据块时的IOPS）。 |
| innodb_io_capacity_max | 该参数定义了InnoDB后台线程每秒可用的最大IO操作数。 | 建议设置为磁盘IOPS总能力的75%（磁盘IOPS是指innodb_page_size大小的数据块时的IOPS），以避免IO操作对系统资源的过度占用。 |  |
| innodb_flush_method | 该参数用于指定InnoDB存储引擎刷新数据到磁盘的方式。 | 不同的刷新方式会影响到InnoDB存储引擎的性能和数据的安全性。建议设置为O_DIRECT模式，直接写磁盘，需要经过OS缓冲池。 |  |

本页内容
