以前,NDB内核为集群中的每个节点使用固定大小为2MB的发送缓冲区,该缓冲区在节点启动时分配。因为这个缓冲区的大小不能在集群启动后更改,所以必须提前使其足够大,以容纳任何传输器套接字上可能的最大负载。然而,这是对内存的低效使用,因为很多内存经常没有使用,并且在扩展到多个API节点时可能导致大量资源的浪费。
这个问题最终解决了(在NDB Cluster 7.0中),方法是使用统一的发送缓冲区,该缓冲区的内存从所有传输器共享的池中动态分配。这意味着可以根据需要调整发送缓冲区的大小。通过设置以下参数可以完成统一发送缓冲区的配置:
TotalSendBufferMemory。该参数可针对所有类型的NDB集群节点进行设置,即可在
(ndbd)
,(mgm)
,(api)
(或(mysql)
)config.ini
文件。它表示每个节点要分配的内存总量(以字节为单位),它被设置为在所有配置的传输器之间使用。如果设置,其最小值为256KB;最大值为4294967039。为了与现有配置向后兼容,该参数将所有配置的传输器的最大发送缓冲区大小之和作为默认值,再加上每个传输器额外的32KB(一页)。最大值取决于传输器的类型,如下表所示:
这使得现有配置能够以与NDB Cluster 6.3及更早版本接近的方式运行,具有相同的内存量,并向每个传输器发送可用的缓冲空间。但是,一个传输程序未使用的内存对其他传输程序不可用。
OverloadLimit。该参数用于
config.ini
文件(tcp)
节,并表示在认为连接过载之前,发送缓冲区中必须存在的未发送数据量(以字节为单位)。当出现这样的过载情况时,影响重载连接的事务将失败,出现NDB API Error 1218 (在NDB内核中发送过载的缓冲区)直到过载状态通过。缺省值为0,此时有效过载限为SendBufferMemory * 0.8
对于给定的连接。该参数的最大值为4G。SendBufferMemory。参数指定的整个池中单个传输程序可以使用的内存量的硬限制
TotalSendBufferMemory
.然而,总和SendBufferMemory
对于所有配置的传输器可以大于TotalSendBufferMemory
这是为给定节点设置的。这是在使用许多节点时节省内存的一种方法,只要所有传输器不会同时需要最大的内存量。ReservedSendBufferMemory。如果设置了这个可选的数据节点参数,则给出为数据节点之间的连接保留的内存数量(以字节为单位);此内存不分配给发送用于与管理服务器或API节点通信的缓冲区。这提供了一种保护集群的方法,防止API节点使用过多的发送内存,从而导致NDB内核内部通信失败。如果设置,则该参数允许的最小值为256KB;最大值为4294967039。
您可以使用ndbinfo.transporters
表来监视发送缓冲区内存的使用情况,并检测可能对性能产生不利影响的减速和过载条件。