鲲鹏社区首页
中文
注册
如何进行MySQL数据库基础性能调优

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

BoostKit

发表于 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处理器)》中“进入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缓冲池。

本页内容