InnoDB的机制来调节计算线程InnoDB内部工作。
innodb_thread_concurrency是设置这个变量数,还有两个友好变量
innodb_thread_sleep_delay和innodb_concurrency_tickets。我将试图解释它是如何工作的。
MySQL pluginable架构,将MySQL通用代码之间的工作
(解析器,优化器)和存储引擎。从存储引擎的角度来看它如何工作
(非常简单的):
mysql存储引擎的方法:
|
1
|
read_row
|
(有几个方法像读通过索引或顺序读取或随机读取);
|
1
2
3
|
write_row
;
update_row
;
delete_row
;
|
在开始这些方法InnoDB检查已经进入线程数,
如果这算结束了innodb_thread_concurrency然后线程等待
为innodb_thread_sleep_delay微秒之前下一个试试。
如果secound尝试还是失败——线程睡在线程队列(FIFO)。
为什么InnoDB使用两个尝试?它也减少了等待线程,使计数的计数的上下文切换低。
一旦线程进入——它接收innodb_concurrency_tickets票,
所以接下来innodb_concurrency_tickets乘以线程不会检查,并将进入自由。
简化代码看起来像:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
|
如果
(
线程
- - - - - -
&
gt
;
n_tickets_to_enter_innodb
&
gt
;
0
)
{
线程
- - - - - -
&
gt
;
n_tickets_to_enter_innodb
- - -
;
输入
;
}
重试
:
如果
(
entered_thread
&
lt
;
innodb_thread_concurrency
)
{
entered_threads
+ +
;
线程
- - - - - -
&
gt
;
n_tickets_to_enter_innodb
=
innodb_concurrency_tickets
;
输入
;
}
如果
(
innodb_thread_sleep_delay
&
gt
;
0
)
{
thread_sleep
(
innodb_thread_sleep_delay
)
;
}
转到
重试
;
/ /(只有一次)
WAIT_IN_FIFO_QUEUE
;
线程
- - - - - -
&
gt
;
n_tickets_to_enter_innodb
=
innodb_concurrency_tickets
;
输入
;
|
(完整源代码:srv_conc_enter_innodb函数innobase /电脑/ srv0srv.c)
那么什么是最好的价值innodb_thread_concurrency吗?
价值取决于很多因素,包括你的工作量,你跑什么类型的硬件和软件。如果你有1 - 2 cpu你经常能做的很好(innodb_thread_concurrency = 0禁用它
5.0.19以来,更多关于默认值)。为多个CPU盒(4 + CPU)情况是不同的。
理论上你可以使用2 * (NumCPUs + NumDisks)值,所以可能有2为每个CPU和磁盘活动线程资源。磁盘IO绑定工作负载可以只有帐号的磁盘和CPU绑定的CPU数量。然而在实践这个值可能是次优的,尤其是大量的活动线程。
某些工作负载的所以,你可能最终值1、2或4最佳即使你有8个cpu。注意如果这个值小于的cpu数量和使用主要Innodb表你可能无法有效地使用你所有的cpu运行的线程的数量是不够的。此外作为某些线程睡眠时间进入队列,真正的内部Innodb的线程数量可能不到innodb_thread_concurrency特别是活动线程数是几倍,他们中的许多人可能会睡觉等待进入队列。
多个cpu的可伸缩性问题是众所周知的错误15815所以不要认为它被认为是正常的行为。
关于innodb_commit_concurrency。
innodb_thread_concurrency保护只访问一行可以看到,但是有
也提交阶段obviuosly使用内部结构和锁,它由该变量仍未受保护的
在某些工作负载(例如很多插入线程)线程仍然抖动可以观察到即使innodb_thread_concurrency有限。
这就是为什么innodb_commit_concurrency变量添加在MySQL 5.0
innodb_commit_concurrency限制数量的线程,可以活跃在Innodb内核在提交阶段。这个变量的最优值也取决于很多因素。它设计作为独立变量经常因为日志冲洗IO绑定操作,即使相同工作负载是CPU绑定的值为变量在所有情况下都不会工作得很好。
对许多工作负载默认值就足够了。它需要经常干预低于innodb_thread_concurrency设置。
如果你有innodb_flush_logs_at_trx_commit = 1,没有电池备份缓存您的日志卷上你可能想玩大的值如20。如果innodb_log_flush_at_trx_commit = 2 0或更小的值可能是有意义的。如果你启用了二进制日志通常并不真正重要Innodb将序列化提交操作。





谢谢你的明确的发布包括方程数量的线程:
2 * (NumCPUs + NumDisks)
我有4个物理cpu, 2 x决斗核心共享缓存。
但是Linux很好地把这些变成8逻辑CPU,每一对股票80%的CPU资源。
4 xphysical和8 xlogical值应该使用的CPU计算什么?
问候,
本
一个线程的“输入”(线程- > n_tickets_to_enter_innodb > 0)原因是包括在“entered_thread”?
这意味着我们可以有更多的线程比innodb_thread_concurrency innodb_kernel里面?
假设innodb_thread_concurrency = 8, 9线程有免费的票,他们进入。
嗨,瓦迪姆,
我可以问你质疑吗?
我发出该命令显示引擎innodb状态,是显示有10个io线程(4读4写)和一个日志线程和线程插入缓冲。如:
推荐- - - - - -
文件I / O
推荐- - - - - -
I / O的线程0(线程id: 18578)状态:等待完成aio请求(插入缓冲线程)
I / O的线程1(线程id: 18579)状态:等待完成aio请求(日志线程)
I / O的线程2(线程id: 18580)状态:等待完成aio请求(读线程)
I / O的线程3(线程id: 18581)状态:等待完成aio请求(读线程)
I / O线4(线程id: 18582)状态:等待完成aio请求(读线程)
I / O线5(线程id: 18583)状态:等待完成aio请求(读线程)
I / O线6(线程id: 18584)状态:等待完成aio请求(写线程)
I / O的线程7(线程id: 18585)状态:等待完成aio请求(写线程)
I / O的线程8(线程id: 18586)状态:等待完成aio请求(写线程)
I / O线9(线程id: 18587)状态:等待完成aio请求(写线程)
但是我发现innodb_thread_concurrency的值是8。
那么,什么是这毛病sitution吗?
innodb_thread_concurrency的真正意义吗?
瓦迪姆你永远不会回答一个问题。你是一个多么自私的人。站不住脚的。
有办法计算线程的数量目前innodb里面?