我最近遇到了 Linux 互斥锁的一些核心问题,特别是 MySQL、memcache 和 APCu。
例子:
- SQLSTATE[HY000]:一般错误:1205 超出锁定等待超时;尝试重新启动事务:INSERT INTO
- 铜铜:https://github.com/krakjoe/apcu/issues/416
- Memcache OOM:内存不足相关的东西
我对 Linux 的了解非常非常基础且有限。我知道互斥体是一种确保两个或多个并发进程不会发生冲突或导致竞争条件的机制,这对我来说很好。
- 对于 MySQL 的情况,我知道 MySQL 在某些 InnoDB 表上有锁,因此重新启动确实解决了问题。但我不明白的是,在持有该锁时哪个进程被杀死了。谁杀死了它,出于什么原因,触发该场景的代码是什么?我正在使用 MySQL 8,我想我可以检查 Performance_schema.data_lock_waits 吗?但之后要采取什么步骤呢?
- 对于 APCu:我确实在正在运行的 PHP 进程上运行了 strace,得到了 FUTEX_WAIT,运行了 GDB,并且 apcu_inc 卡在了 pthread_rwlock_wrlock 上。禁用 APCu 确实解决了问题,升级也解决了问题。这是进一步调查此问题的机会,但无法,因为我必须在产品服务器上快速解决此问题。我可以重现它。有很多软件包使用 APCu,如果没有,很多软件包都使用 pthread_mutex_lock,所以我无法卸载任何与之相关的东西。
- 对于memcached:它一次又一次地崩溃;我们使用的是非常旧的版本(2012 年的版本)。查看发行说明,我确实了解到 memcache 在这方面遇到了一些困难。我计划研究与获取和概述相关的不同问题,以及是否有任何内容可以帮助我进一步调查这一点。我不能回避诸如“嘿,我有 OOM”之类的开放问题。我需要做好我的工作,至少分享一些东西或者能够重现。
我从中得到两种情况:
- 运行过程:我想我可以处理这个问题,挖掘代码并环顾四周,希望其他人也遇到过这个问题。
- 被杀死的进程:我不知道如何处理这个问题。就 MySQL 和 Memcache 而言,谁杀死了它们,出于什么原因?我可以跟踪代码吗?我需要一些工具来监控这些吗?如何弄清楚发生了什么?我需要查看某些设备锁或 I/O 吗?
你如何处理这个问题?