最近碰见案例,MySQL环境使用5.7.19~5.7.22版本 或 更低版本,经常会碰到以下信息:
InnoDB: Warning: a long semaphore wait:
813 --Thread 139957495039744 has waited at btr0cur.cc line 545 for 241.00 seconds the semaphore:
814 X-lock (wait_ex) on RW-latch at 0x7f4a60043da8 created in file dict0dict.cc line 2341
大致意思就是等待信号量。
通过以下的一些信息了解一下MySQL里信号量是指什么?
MySQL里哪里记录信号量信息
mysql> SHOW ENGINE INNODB STATUS\G;
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 68581015, signal count 218437328
--Thread 140653057947392 has waited at btr0pcur.c line 437 for 0.00 seconds the semaphore:
S-lock on RW-latch at 0x7ff536c7d3c0 created in file buf0buf.c line 916
a writer (thread id 140653057947392) has reserved it in mode exclusive
Mutex spin waits 1157217380, rounds 1783981614, OS waits 10610359
RW-shared spins 103830012, rounds 1982690277, OS waits 52051891
RW-excl spins 43730722, rounds 602114981, OS waits 3495769
如果有高并发的工作负载,SEMAPHORES记录了信号量信息,它包含了两种数据:事件计数器以及可选的当前等待线程的列表。
1)OS WAIT ARRAY INFO: reservation count 68581015, signal count 218437328
#这行给出了关于操作系统等待数组的信息,它是一个插槽数组,innodb在数组里为信号量保留了一些插槽,操作系统用这些信号量给线程发送信号,使线程可以继续运行,以完成它们等着做的事情,这一行还显示出innodb使用了多少次操作系统的等待:
保留统计(reservation count)显示了innodb分配插槽的频度,
信号计数(signal count)衡量的是线程通过数组得到信号的频度,
操作系统