为什么mysql集群不使用多个CPU核心?

为什么mysql集群不使用多个CPU核心?

我对 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,但这有效

相关内容