linux信号量对mysql_MySQL 信号量semaphore 和 innodb_adaptive_hash_index

本文探讨了MySQL 5.7版本中遇到的信号量等待问题,特别是在InnoDB存储引擎中。文章详细解析了MySQL中的信号量信息,包括OS WAIT ARRAY INFO、线程等待状态以及不同类型的锁计数器。为了解决高并发下信号量等待导致的问题,建议调整内核参数并关闭innodb_adaptive_hash_index功能。关闭自适应哈希索引可以避免额外的维护开销,适用于某些特定负载。文章还介绍了自适应哈希索引的工作原理及其潜在的性能影响,并提到了MySQL 8.0的新特性。
摘要由CSDN通过智能技术生成

最近碰见案例,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)衡量的是线程通过数组得到信号的频度,

操作系统

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 中,可以使用 `semctl` 系统调用中的 `GETVAL` 命令来获取指定信号量的值。如果该值为0,则表示信号量已经被占用,没有可用的资源。 具体的代码实现可以参考如下示例: ```c #include <stdio.h> #include <stdlib.h> #include <sys/sem.h> int main() { int semid; struct sembuf sb; // 创建信号量集 semid = semget(IPC_PRIVATE, 1, 0666 | IPC_CREAT); if (semid == -1) { perror("semget"); exit(EXIT_FAILURE); } // 初始化信号量 if (semctl(semid, 0, SETVAL, 1) == -1) { perror("semctl"); exit(EXIT_FAILURE); } // 获取信号量的值 printf("Sem value: %d\n", semctl(semid, 0, GETVAL)); // 尝试获取信号量 sb.sem_num = 0; sb.sem_op = -1; // P 操作 sb.sem_flg = SEM_UNDO; if (semop(semid, &sb, 1) == -1) { perror("semop"); exit(EXIT_FAILURE); } printf("Semaphore acquired\n"); // 释放信号量 sb.sem_op = 1; // V 操作 if (semop(semid, &sb, 1) == -1) { perror("semop"); exit(EXIT_FAILURE); } printf("Semaphore released\n"); // 删除信号量集 if (semctl(semid, 0, IPC_RMID, 0) == -1) { perror("semctl"); exit(EXIT_FAILURE); } return 0; } ``` 在这个示例中,我们首先使用 `semget` 系统调用创建了一个信号量集,并使用 `semctl` 系统调用对该信号量进行了初始化。然后使用 `semctl` 系统调用获取了该信号量的值,并输出到控制台。 接下来,我们使用 `semop` 系统调用进行了一次 P 操作,即尝试获取该信号量。如果该信号量的值为0,则该操作将会被阻塞,直到信号量的值变为非0。在本例中,由于我们已经将信号量初始化为1,因此该 P 操作可以顺利完成。 最后,我们使用 `semop` 系统调用进行了一次 V 操作,即释放该信号量。然后使用 `semctl` 系统调用删除了该信号量集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值