在TiDB官方的安装部署文档中,只提到了需要为各节点安装numactl软件包。但是,未提到如何进行NUMA绑核来提高性能。这个NUMA绑核的过程,是由TiDB各角色的实例根据主机硬件自动配置的么?如果不是自动配置,如何根据硬件配置,来优化配置?
需要在配置文件中手工指定NUMA的节点
肯定是手动配code.NUMA 绑定策略来进一步避免同一 CPU 内跨 die 的内存访问;同时,更精细的 NUMA node 绑定策略也带来了更好的计算资源隔离,减少多个实例部署在同一台服务器上的相互干扰。
参考这篇博客
我们现在都是每个组件独占1台物理服务器。那这样,是不是算一种资源浪费?
个人认为,资源浪费的定义在合理的预算上。tiflash作为暴力机器需要单独较高配置物理服务器,一些监控组件可以考虑集成部署物理服务器。
目前,监控组件部在PD节点;TiDB Server、TiKV都是每个实例独占1台物理服务器。如果TiDB Server主机上2个Node,64G内存。那么为TiDB实例做numa绑核,岂不是只用到一半内存,闲置32G内存?还是我对numa绑核的理解有误?
numa是只能用一半内存的
言外之意,就是在一台2 Numa Node的服务器上部署TiDB Server(以TiDB Server为例),若要充分利用内存和CPU资源,且要达到尽可能高的性能。最佳实践是部署2个TiDB Server实例,并对其做numa绑核。内存容量为原计划需求的两倍。
这样理解,正确不?
目前,TiDB(64G内存)/PD(64G内存)/TiKV(128G内存)都是独占一台物理机,整体为3TiDB/3PD/3TiKV,共9台服务器。监控和HA独立部署。业务场景以OLAP业务为主,针对此场景,通过numa绑核,是否可提高性能?当前,TiDB每个月都会发生1-2次OOM,经查询均因为大事务及SQL查询的问题。
生产环境NUMA绑核后出现过CPU利用率打满的情况,还未查清楚具体原因
官方建议有几个numa,就可以部署几个tidb server,每个tidb server 绑定1个numa
你们用的x86还是arm架构
1、 tidb的numa绑核是给各组件设置numa_node参数指定node, 配置后会在组件run_xxx脚本中添加numactl --cpunodebind=X,X --membind=X,X 来启动组件
2、单个node内存资源不足的情况下,只能用多个node,要不有个大查询tidb就oom了。numa比较适合资源充足的机器,, numa本身有很多分配策略,默认default方式 是先用进程所在node 的内存,内存不足了去其他Node获取,由于其他node的distance较远索引相比本地内存获取延迟就大些。
tidb提供的绑定numa策略中,内存分配策略应该是只从本地numa的内存获取
绑定numa后单个实例使用的内存资源会更少,但是会更快,所以绑定后更容易出现oom,像oracle都是为了避免出现oom都建议不绑核,绑核问题在arm架构下影响更大,所以挺矛盾的
那如果物理机配置足够高,内存足够大。那还有必要做numa绑核么?默认不就是优先访问本Node内的内存么?还是说,一个请求会在不同的cpu之间轮换?
资源再高如果多颗的话,数据还是有可能存在远端的内存里,那访问的话就会跨numa;