![为什么mysql集群不使用多个CPU核心?](https://linux22.com/image/558085/%E4%B8%BA%E4%BB%80%E4%B9%88mysql%E9%9B%86%E7%BE%A4%E4%B8%8D%E4%BD%BF%E7%94%A8%E5%A4%9A%E4%B8%AACPU%E6%A0%B8%E5%BF%83%EF%BC%9F.png)
我对 ndbmtd 进程有疑问。当我使用以下配置时,我预计我们服务器上的 Intel(R) Pentium(R) CPU G6950 @ 2.80GHz 的两个核心都将得到充分利用。不幸的是,这并没有发生。只有 id=0 的核心被使用。第二个没有负载。
我的配置:
[ndbd default]
MaxNoOfExecutionThreads=2
[ndbd]
HostName=192.168.1.4
NodeId=3
LockExecuteThreadToCPU=0,1
LockMaintThreadsToCPU=0
mpstat -P 全部
08:47:09 AM CPU %user %nice %system %iowait %steal %idle
08:47:11 AM all 44.64 0.00 1.75 1.25 0.00 52.37
08:47:11 AM 0 89.45 0.00 1.01 2.01 0.00 7.54
08:47:11 AM 1 0.99 0.00 1.98 0.00 0.00 97.03
但是,“top”显示 ndbmtd 进程的使用率为 90%(为什么?)
我的拓扑 - 2 个数据节点,VM 中的 ndb_mgmt,VM 中的 mysqld。
是我的 CPU 无法做到这样的事情,我的配置有错误,还是 mysql-cluster 无法完全加载多核处理器?
答案1
我联系了 MySQL Cluster 开发团队,Frazer Clement 给出了详细的回复。让我们知道你的测试进展如何。论坛是询问 MySQL Cluster 特定问题的好地方:forums.mysql.com/list.php?25
该 CPU 没有超线程
所以它有 2 个真正的核心。
根据这个 :http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-programs-ndbmtd.html,对于 2 核主机,应将 MaxNoOfExecutionThreads 设置为 2。
它还指出,当设置为 2 时,将会有:
1 local query handler (LQH) thread
1 transaction coordinator (TC) thread
1 transporter thread
1 subscription manager (SUMA) thread
使用普通的 ndbd,所有这些功能都在 1 个线程中,使用 ndbmtd 和 MaxNoOfExecutionThreads = 2,它们被拆分成如图所示。请注意,这是一个“功能性”拆分 - 每个线程都有不同的角色,因此需要不同数量的 CPU 来完成其部分工作。对于给定的吞吐量,每种线程类型消耗的 CPU 数量将不同。
MaxNoOfExecutionThreads 值越高,LQH 线程的数量就越大,这些线程应各自承担同等的“LQH”工作,并保持相互平衡。但是,其他线程的 CPU 消耗量会有所不同。
最后,ndbmtd 以某种循环方式使用 LockExecuteThreadToCpu=0,1 行。不幸的是,对于提供的 CPU 数量来说,执行线程太多(4),无法实现均衡。因此,单个 LQH 线程被分配一个 CPU,而其他三个线程共享另一个 CPU。这可以解释所见的不平衡。
请注意,每个 ndbmtd 进程启动时,线程到 CPU 的映射都会输出到其 stdout(ndb_out 日志)中。使用类似的配置,我看到以下内容:
NDBMT: 线程数=4
实例化 DBSPJ instanceNo=0
将线程 ID = 3936 锁定到 CPU ID = 0
将线程 ID = 3935 锁定到 CPU ID = 0
将线程 ID = 3937 锁定到 CPU ID = 0
警告:使用 LockExecuteThreadToCPU 指定的 CPU 太少。仅指定了 2 个,但实际需要 4 个,这可能会导致争用。
将 LQH 线程分配给专用 CPU,其他线程将共享剩余的 thr:2 tid:3940 cpu:0 OK PGMAN(1) DBACC(1) DBLQH(1) DBTUP(1) BACKUP(1) DBTUX(1) RESTORE(1)
thr:3 tid:3933 cpu:1 OK CMVMI(0)
thr:1 tid:3939 cpu:1 OK BACKUP(0) DBLQH(0) DBACC(0) DBTUP(0) SUMA(0) DBTUX(0) TSMAN(0) LGMAN(0) PGMAN(0) RESTORE(0) DBINFO(0) PGMAN(5)
thr:0 tid:3938 cpu:1 OK DBTC(0) DBDIH(0) DBDICT(0) NDBCNTR(0) QMGR(0) NDBFS(0) TRIX(0) DBUTIL(0) DBSPJ(0)
我们可以看到,一个执行线程(3940)被锁定到 CPU 0,其他线程被锁定到 CPU 1。3940 是一个 LQH 工作线程(因为它有一个编号 > 0 的 DBLQH 块(DBLQH(1)))。
在此示例中,CMVMI(网络 IO 接收器)、DBLQH(0)/SUMA(0) 和 DBTC(0) 线程全部锁定到 CPU 1。
因此,根据所使用的流量,CPU 0 与 CPU1 上消耗的 CPU 量将不平衡。请注意,“维护”线程也锁定在 CPU 0 上,如果 CPU 0 饱和,情况可能会变得更糟。
如果此流量类型的瓶颈是 LQH 处理,则将 MaxNoOfExecutionThreads 增加到 4 或更高将导致有 2 个 LQH“工作线程”,每个线程将被分配一个核心。但是,其他线程也将使用其中一个核心,这将限制该核心上 LQH 工作线程的资源。
如果 LQH 工作者不是瓶颈,那么额外的 LQH 工作者可能会减少可用于其他线程的 CPU,并降低吞吐量。
我建议尝试流量负载,检查 ndbmtd 输出以了解映射,并测量可实现的吞吐量和延迟以及观察 CPU 内核的平衡和利用率。
答案2
我认为当 CPU 有 2 个核心时,你应该设置 MaxNoOfExecutionThreads=4,此属性应在 ndbd 部分中设置
[ndbd] 最大执行线程数=2
我不知道为什么要将此参数设置为 2xcores,但这有效