一、innodb并行任务调度是什么:
这里要“考古”一下了,不然问题说不清楚。上大学的时候老师和我们说最初的计算机只有一个核心,并且一次也只能做一件事,
如果你有两件事要用到计算机,在第一件事没有做完之前,后面那件事只能等着。后来呀,计算机就进化了一把,计算机不再
是把一件是做完之后,再去做第二件事,而是一件事只做一段非常短的时间,并不关心这件事有没有做完,它就会去做第二件
事,同样第二件事也只做一段非常短的时间,就回过头去做第一件事;
虽然事实上两件事是交错着做的,由于第一件事都只做一段非常短的时间,所以整体上看起来,两件事是同时都有取得进展的
上面所用到的一个词“一段非常短的时间”,用专业点的话来说就是“时间片”,也就是说每一个任务(事)只会在计算机(cpu)上执
一个时间片这么久,就要被中断,把计算能力让给别的任务,上面的例子为了方便说明我们只是举了两个任务,事实上多个任务
也就这样的,一个任务执行一段时间,就执行下一个任务。
计算机的进化还没有终结,后来的cpu不只是才一个核心,而是有了多个核心,这样计算机就可以有更高的并行度了,任务的调
度算法还是根据时间片那一套来的,这个也从侧面这种算法也是当前比较好靠谱的了。
innodb 任务的调度和上面所说的cpu的任务调度在设计思想上是一样的,innodb会把任务放心一个任务队列中,每次会有m个
任务有时间片,也就是说每次会有m个任务同时在做;
二、innodb 这种调度方式会有什么问题:
由上面所说的innodb每次会有m个任务在执行,如果这个m太大,那么cpu上下文切换就会频繁,这样的话高并行度反而会影响
mysql 性能。
三、控制innodb并行度与任务调试的相关参数:
1、innodb_thread_concurrency 控制着innodb一次并行执行多少任务,也就是多每次最多,多少个任务可以拿到时间片
这个值也就是上文中所提到的m,如果这个值是0表示意思和m=无穷大是一样的。
2、innodb_concurrency_tickets 这个参数定义着每一个任务时间片的长度。
3、innodb_thread_sleep_delay 这个参数说的是当innodb已经同时有innodb_thread_concurrency个任务在执行了,新
的任务来临时,这个新的任务要等innodb_thread_sleep_delay 这么久才能进行innodb的调度队列。
4、innodb_adaptive_max_sleep_delay 确实上面的这些参数大多是用来吹水的,管理员通常不会知道对于一个给定的库
上面这三个参数各个多大才最合理,一方便源于业务的周期性波动,可能白天的时候任务重,晚上的时候没人用,没有那一个
值能适用这么宽的范围。而innodb_adaptive_max_sleep_delay它用于设定管理员容忍极限,例如把innodb_adaptive_max_sleep_delay
设定成150000就是说,任何一个任务在150000微秒后一定要被加入到innodb调度队列。
----
交通学习&打赏