我注意到,当执行一个要求很高的请求时,我们的应用程序不会响应请求。运行top似乎可以确定问题的根源:
top - 13:54:25 up 1 day, 13:43, 2 users, load average: 1.02, 0.98, 0.83
Tasks: 110 total, 1 running, 109 sleeping, 0 stopped, 0 zombie
Cpu(s): 11.9%us, 1.1%sy, 0.0%ni, 86.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.2%st
Mem: 3145728k total, 2329220k used, 816508k free, 0k buffers
Swap: 131072k total, 128164k used, 2908k free, 1585060k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
26073 mysql 20 0 397m 209m 3452 S 99.1 6.8 3:02.49 mysqld
16419 mailnull 20 0 9848 3288 2664 S 2.3 0.1 1:17.63 exim
2085 nobody 20 0 44312 10m 3436 S 1.3 0.3 4:50.98 litespeed
24727 nobody 20 0 320m 50m 41m S 0.3 1.7 0:06.86 lsphp5
26314 root 20 0 2428 1104 832 S 0.3 0.0 0:00.36 top 在我看来,mysql占用了它运行的整个CPU (99.1%)。这意味着,我们的一个核心是100%,而其他7个(7个!)闲坐在0%。
我知道,如果我们的表是InnoDB,负载将分布在内核之间。这是正确的吗?
有没有任何方法在我们的表使用MyISAM的核心之间分配工作负载?
我看错地方了吗?当资源繁重的查询占用一个CPU时,MySQL难道不能利用另一个CPU进行单独的查询吗?或者,这是否受到我们对MyISAM的使用的限制?
发布于 2013-06-14 21:23:10
您对InnoDB和分布在更多内核中的负载的理解是不正确的,但非常接近。
MyISAM表执行“基于表的锁定”,这意味着任何锁定表的查询都必然会阻塞需要获取锁的所有其他查询。
InnoDB在大多数操作中使用“基于行的锁定”,这允许其他不需要锁定准确行的查询并行地继续。
一个大型查询无论是MyISAM还是InnoDB,仍然只能使用一个核心,但是多个访问同一表的查询应该能够在不同的核心上同时执行,前提是它们不会被行级锁阻塞。
https://serverfault.com/questions/515948
复制相似问题