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 内核的平衡和利用率。