在我们的一个从属数据库最近出现问题/减速期间,我注意到当我运行SHOW ENGINE INNODB STATUS
. 我得到以下信息:
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 822986039, signal count 17045541908
--Thread 140562108442368 has waited at row0sel.c line 2930 for 0.00 seconds the semaphore:
S-lock on RW-latch at 0x7fd752e55c40 created in file buf0buf.c line 938
a writer (thread id 140562088974080) has reserved it in mode exclusive
number of readers 0, waiters flag 1, lock_word: 0
Last time read locked in file row0sel.c line 2930
Last time write locked in file /tmp/buildd/mysql-5.5-5.5.44/storage/innobase/buf/buf0buf.c line 3168
事实上,这种情况大约有 15 个。
查看交易,列出了 apx 200 笔交易,其中有一半显示为waiting in InnoDB queue
,另一半显示为fetching data
。
所有的交易都是SELECT
查询,它们都没有显示任何locks
.
谁能告诉我SEMAPHORES
(以上)与什么有关?
信号量与等待操作系统中的内部线程锁有关
您可以在Peter Zaitsev 的 SHOW INNODB STATUS walk through中找到一个很好的讨论
在我看来,这与两件事有关
我的猜测是您将innodb_thread_concurrency设置为非零数。这会导致 InnoDB 存储引擎限制其对内部线程的使用。因此,这将导致事务进入队列。
早在 2011 年,我就写过关于这个的帖子
Sep 12, 2011
:可以让 MySQL 使用多个核心吗?Aug 16, 2011
:为什么禁用查询缓存时,MySQL 线程经常显示“freeing items”状态?May 26, 2011
:关于单线程与多线程数据库的性能我在 2011 年去了 Percona Live NYC。Ronald Bradford 在一次研讨会上告诉我将innodb_thread_concurrency保持为零(0)。为什么 ?
正如我在 2011 年 8 月 16 日的帖子中提到的:
如果您将innodb_thread_concurrency作为非零值,请将其设置为 0 或将其从
my.cnf
. 请注意,MySQL 5.6 允许 5000 个票证,而MySQL 5.5 仅允许 500 个票证。如果要更改这些值,可以使用
我建议根本不要设置innodb_concurrency_tickets。
我还建议阅读Pythian 的 ONCE AGAIN ABOUT INNODB-CONCURRENCY-TICKETS