我有一个ndbmtd进程的问题。 当我使用以下configuration时,我预计Intel(R)Pentium(R)CPU G6950 @ 2.80GHz的服务器上的内核都将被充分利用。 不幸的是,这并没有发生。 只使用id = 0的核心。 第二个没有负载。
我的configuration:
[ndbd default] MaxNoOfExecutionThreads=2 [ndbd] HostName=192.168.1.4 NodeId=3 LockExecuteThreadToCPU=0,1 LockMaintThreadsToCPU=0
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
然而,“top”显示ndbmtd过程的90%使用率(为什么?)
我的拓扑结构 – 2个数据节点,VM中的ndb_mgmt,VM中的mysqld。
是我的CPU不能这样的事情,我有一些错误的configuration或MySQL集群不能完全加载多核处理器?
我检查了MySQL Cluster开发团队,Frazer Clement提供了这个详细的响应。 让我们知道你的testing如何进行。 提出特定于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,所有这些函数都在一个线程中,ndbmtd和MaxNoOfExecutionThreads = 2,它们被分离出来,如图所示。 请注意,这是一个“function”拆分 – 每个线程都有不同的angular色,因此需要不同数量的CPU来完成其工作。 对于给定的吞吐量,每种线程types消耗的CPU数量将会不同。
MaxNoOfExecutionThreads的较高值将增加LQH线程的数量,每个LQH线程应该占用'LQH'工作的平等份额,并相互平衡。 但是,其他线程将有不同数量的CPU消耗。
最后,LockExecuteThreadToCpu = 0,1行被ndbmtd以一种循环方式使用。 不幸的是,执行线程太多(4),为了提供平衡的CPU数量。 那么会发生什么情况是单个LQH线程被赋予一个CPU,而其他三个线程共享另一个CPU。 这可以解释看到的不平衡。
请注意,线程到cpus的映射在每个ndbmtd进程启动时的stdout(ndb_out log)中输出。 使用类似的configuration,我看到以下内容:
NDBMT:num_threads = 4
实例化DBSPJ instanceNo = 0
将threadId = 3936locking到CPU ID = 0
将threadId = 3935locking到CPU ID = 0
将threadId = 3937locking到CPU ID = 0
警告:使用LockExecuteThreadToCPU指定的CPU太less。 只需要指定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)被locking到CPU 0,其他locking到CPU 1. 3940是一个LQH工作线程(因为它有一个DBLQH块,其编号> 0(DBLQH(1))) 。
在本例中,CMVMI(networkingIO接收器),DBLQH(0)/ SUMA(0)和DBTC(0)线程全部locking到CPU 1。
因此,根据使用的stream量,CPU 0与CPU1的CPU消耗量将不平衡。 请注意,“维护”线程也locking到CPU 0,如果CPU 0饱和,可能会使事情变得更糟。
如果这种stream量types的瓶颈是LQH处理,那么将MaxNoOfExecutionThreads增加到4或更高将导致有2个LQH“工作者”,其将被分配一个核心。 但是,其他线程也将使用其中一个内核,这将限制该内核上的LQH工作人员的资源。
如果LQH工作者不是瓶颈,那么拥有额外的LQH工作者可以减less可用于其他线程的CPU,并降低吞吐量。
我build议试验stream量负载,检查ndbmtd输出以了解映射,测量可达到的吞吐量和延迟,以及观察CPU内核的平衡和利用率。
我认为你应该设置MaxNoOfExecutionThreads = 4,当你在cpu有2个核时,这个属性应该设置在ndbd部分
[ndbd] MaxNoOfExecutionThreads = 2
我不知道为什么你应该设置这个参数2xcores,但这个工程