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

Joh*_*ohn 4 mysql mysql-cluster

我的 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
Run Code Online (Sandbox Code Playgroud)

mpstat -P ALL

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
Run Code Online (Sandbox Code Playgroud)

但是,“top”显示 ndbmtd 进程的使用率为 90%(为什么?)

我的拓扑 - 2 个数据节点,VM 中的 ndb_mgmt,VM 中的 mysqld。

是我的 CPU 没有能力做这样的事情,我配置错误还是 mysql-cluster 无法完全加载多核处理器?

小智 6

我联系了 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,MaxNoOfExecutionThreads 应设置为 2 为 2 核主机。

它还指出,当设置为 2 时,将有:

1 local query handler (LQH) thread

1 transaction coordinator (TC) thread

1 transporter thread

1 subscription manager (SUMA) thread
Run Code Online (Sandbox Code Playgroud)

对于普通的 ndbd,所有这些函数都在 1 个线程中,当 ndbmtd 和 MaxNoOfExecutionThreads = 2 时,它们被拆分为如图所示。请注意,这是一个“功能性”拆分 - 每个线程都有不同的角色,因此需要不同数量的 CPU 来完成其部分工作。对于给定的吞吐量,每种线程类型消耗的 CPU 量会有所不同。

较高的 MaxNoOfExecutionThreads 值将增加 LQH 线程的数量,每个线程应均分“LQH”工作,并相互平衡。但是,其他线程将具有不同的 CPU 消耗量。

最后, ndbmtd 以一种循环方式使用 LockExecuteThreadToCpu=0,1 行。不幸的是,对于提供的 CPU 数量而言,有太多的执行线程 (4) 无法实现平衡。那么发生的情况是单个 LQH 线程被分配一个 CPU,其他三个线程共享另一个 CPU。这可以解释所看到的不平衡。

注意线程到cpus的映射是在每个ndbmtd进程启动时的stdout(ndb_out日志)中输出的。使用类似的配置,我看到以下内容:

NDBMT:num_threads=4

实例化 DBSPJ instanceNo=0

将 threadId = 3936 锁定到 CPU id = 0

将 threadId = 3935 锁定到 CPU id = 0

将 threadId = 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 'workers',每个都将被分配一个核心。但是,其他线程也将使用其中一个内核,这将限制该内核上 LQH 工作线程的资源。

如果 LQH 工人不是瓶颈,那么拥有额外的 LQH 工人可以减少其他线程可用的 CPU,并降低吞吐量。

我建议试验流量负载,检查 ndbmtd 输出以了解映射,测量可实现的吞吐量和延迟,以及观察 CPU 内核的平衡和利用率。