MySQL 信号量 InnoDB: Semaphore wait has lasted > seconds

MySQL是单进程,多线程的数据库,主要用于控制多个线程之间的并发访问。每个线程都可以访问共享资源,如数据库文件、内存缓存等。为了避免不同线程之间的竞争和冲突,除了自身的锁机制,MySQL使用信号量来控制线程的访问,并保证系统的稳定性和安全性。

有些环境下还会碰到hang住情况:

#mysql error日志:
[ERROR] [FATAL] InnoDB: Semaphore wait has lasted > 600 seconds. We intentionally crash the server 
because it appears to be hung.

那信号量应用于MySQL那些方面:

  • 并发控制:MySQL信号量可以用于控制多个线程之间的并发访问,以避免不同线程之间的竞争和冲突。
  • 内存管理:MySQL信号量可以用于管理内存资源,以确保系统的稳定性和可靠性。
  • 文件系统:MySQL信号量可以用于控制文件系统的访问,以避免不同线程之间的竞争和冲突。
  • 网络连接:MySQL信号量可以用于控制网络连接的访问,以确保系统的稳定性和可靠性。

MySQL中的信号量

MySQL中有两种类型的信号量,互斥信号量和内部同步:
1.互斥信号量:它用于保护共享资源,防止不同线程之间的竞争和冲突。互斥信号量通常用于保护共享缓存、文件系统、网络连接等资源。
2.内部同步:它用于控制线程的同步和通信,是一种高级的线程同步机制。通常用于控制线程的等待和唤醒,以实现线程之间的协作。

按照目前官方提供的InnoDB信号量活动指标:

信号量 说明
Mutex Rounds InnoDB内部同步数组的信号量/互斥锁旋转次数。
Mutex Spin Waits InnoDB信号量/互斥锁等待内部同步数组的数量。
Os Reservation Count InnoDB信号量/互斥锁等待被添加到内部同步数组的次数。
Os Signal Count 一个InnoDB线程使用内部同步数组发出信号的次数。
Rw exl Os Waits InnoDB等待给Os的独占(写)信号量的个数。
Rw excel Rounds InnoDB同步数组中独占(写)信号量旋转的次数。
Rw excel Spins InnoDB同步数组中独占(写)信号量spin等待的次数。
Rw Shared Os Waits InnoDB向Os提供的共享(读)信号量等待数。
Rw Shared Rounds InnoDB同步数组中共享(读)信号量的旋转次数。
Rw Shared Spins InnoDB同步数组中共享(读)信号量spin等待的数量。
Spins Per Wait Mutex InnoDB信号量/互斥锁旋转数与等待内部同步数组的互斥锁旋转数的比率。
spin Per Wait Rw Excl InnoDB独占(写)信号量/互斥锁自旋轮数与内部同步数组内自旋等待数的比率。
spin Per Wait Rw Shared InnoDB共享(读)信号量/互斥锁自旋轮数与内部同步数组内自旋等待数的比率。

那些可以调整信号量使用指标。

InnoDB Redo Log

redo指标 说明
innodb_log_wait_for_flush_spin_hwm :定义最大平均日志刷新时间,超过此时间,用户线程在等待刷新重做时不再自旋。缺省值是400微秒。
innodb_log_spin_cpu_abs_lwm 定义在等待刷新重做时用户线程不再旋转的最小CPU使用量。取值为CPU内核占用率之和。例如,默认值80为单个CPU核心的80%。在具有多核处理器的系统上,值150表示一个CPU核心的使用率为100%,另一个CPU核心的使用率为50%。
innodb_log_spin_cpu_pct_hwm 定义在等待刷新重做时用户线程不再旋转的最大CPU使用量。该值表示为所有CPU核心综合总处理能力的百分比。默认值为50%。例如,如果一台服务器有4个CPU核,那么2个CPU核100%的利用率就是CPU处理能力总和的50%。

自旋锁轮询

InnoDB的互斥锁和rw锁通常会保留很短的时间间隔。在多核系统中,线程在休眠前一段时间内连续检查它是否可以获得互斥锁或rw锁可能会更有效。如果互斥锁或rw锁在此期间可用,线程可以立即在同一时间片中继续执行。但是,多线程过于频繁地轮询共享对象(如互斥锁或rw锁)可能会导致“缓存乒乓”,导致处理器使彼此缓存的部分无效。InnoDB通过强制轮询之间的随机延迟来去同步轮询活动来最小化这个问题。随机延迟被实现为自旋等待循环。

1.innodb_spin_wait_delay:
自旋锁的轮询之间的最大延迟。这种机制的底层实现取决于硬件和操作系统的组合,因此延迟并不对应于固定的时间间隔。
自旋等待循环的持续时间由循环中出现的PAUSE指令的数量决定。这个数字是通过随机选择一个从0到但不包括innodb_spin_wait_delay值的整数,并将该值乘以50来生成的。(乘数值50在MySQL 8.0.16之前是硬编码的,之后是可配置的。)

例如,当innodb_spin_wait_delay设置为6时,从以下范围中随机选择一个整数:

{0, 1, 2, 3, 4, 5}

#选择的整数乘以50,得到六个可能的PAUSE指令值之一:
{0, 50,100,150,200,250}

对于这组值,250是在自旋等待循环中可以出现的PAUSE指令的最大数目。将innodb_spin_wait_delay设置为5会得到一个包含五个可能值{0,50,100,150,200}的集合,其中200是PAUSE指令的最大数目,以此类推。通过这种方式,innodb_spin_wait_delay设置控制自旋锁轮询之间的最大延迟。

在所有处理器内核共享快速缓存的系统中,可以通过设置innodb_spin_wait_delay=0来减少最大延迟或完全禁用繁忙循环。

2.innodb_spin_wait_pause_multiplier
MySQL 8.0.16中引入的,它提供了一种解释PAUSE指令持续时间差异的方法。定义一个乘数值,用于确定线程等待获取互斥锁或rw锁时发生的自旋等待循环中PAUSE指令的数量。

例如,假设innodb_spin_wait_delay设置为6,将innodb_spin_wait_pause_multiplier的值从50(默认值和之前的硬编码值)减少到5,会生成一组较小的PAUSE指令值:

#innodb_spin_wait_delay
{0, 1, 2, 3, 4, 5}

#PAUSE指令值
{0、5、10、15、20、25}

增加或减少PAUSE指令值的能力允许针对不同的处理器架构微调InnoDB。例如,较小的PAUSE指令值适用于具有相对较长的PAUSE指令的处理器体系结构。

3.innodb_sync_spin_loops
线程在被挂起之前等待InnoDB互斥锁释放的次数。

自适应hash

通过SHOW ENGINE INNODB STATUS输出的SEMAPHORES部分监控自适应哈希索引的使用和争用。如果有许多线程等待在btr0sea.c中创建的rw锁存器,考虑增加自适应哈希索引分区的数量或禁用自适应哈希索引。

OS内核参数

在Linux系统中,Semaphore(信号量)是进程间同步互斥的一种方式,它用于协调不同进程或线程之间对共享资源的访问。每个进程通讯需要的信号灯或者IPC标志,每个连接的process都要分配一个semaphore。

1.kernel.sem是Linux系统用来控制信号量Semaphore的参数。

# cat /proc/sys/kernel/sem
250     32000   32      128

说明:
第一列,表示每个信号集中的最大信号量数目。
第二列,表示系统范围内的最大信号量总数目。
第三列,表示每个信号发生时的最大系统操作数目。
第四列,表示系统范围内的最大信号集总数目。

2. 可以通过/proc/sys/kernel/sem文件或sysctl命令调整参数。

# sysctl -w kernel.sem="1000 64000 100 256"

3.kernelSemi是信号量结构体,内核中提供了一组系统函数用于访问它,可以使用IPCS命令查看当前系统的信号量列表。

# ipcs -a
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x7401833d 2654208    root      600        4          0                       
0x00000000 3145729    root      600        4194304    9          dest         
0x7401833c 2621442    root      600        4          0                       
0xd201012b 3080195    root      600        1720       2

可以看到当前系统所有的信号量以及进程的key,owner和创建时间。
备注:信号量 设置太大会导致sys飙高的。

总结

从上诉Semaphore 介绍中,可以了解MySQL保证系统稳定性和可靠性的重要技术之一,已经涉及到内核协调问题。MySQL信号量的实现代码也较为复杂,个人建议:

  • 可以适当的调整操作系统指标。
  • MySQL相关参数可以采取默认。
  • 碰到信号量问题可以先把自适应hash关闭掉。

免责声明:

1、本站资源由自动抓取工具收集整理于网络。

2、本站不承担由于内容的合法性及真实性所引起的一切争议和法律责任。

3、电子书、小说等仅供网友预览使用,书籍版权归作者或出版社所有。

4、如作者、出版社认为资源涉及侵权,请联系本站,本站将在收到通知书后尽快删除您认为侵权的作品。

5、如果您喜欢本资源,请您支持作者,购买正版内容。

6、资源失效,请下方留言,欢迎分享资源链接

文章评论

0条评论