tidb集群的总内存设置tidb_server_memory_limit

版本: V6.5.0
tidb_server_memory_limit
请问这个参数是设置tidb集群的总使用内存? 还是单台机器的内存?
如何配置tidb集群的总内存使用量? 包括tidb, tikv, pd, tiflash等加在一起

tidb是什么版本?

tidb_server_memory_limit && tidb_server_memory_limit_gc_trigger

tidb_server_memory_limit 控制 tidb-server 运行时的内存限制,当进程的内存超过该 tidb_server_memory_limit * tidb_server_memory_limit_gc_trigger 时会触发 go GC 释放内存。

可以将 tidb_server_memory_limit 设置为百分比或者内存大小。设置为百分比时表示内存限制为总内存*百分比,直接设置内存大小时可以设置的单位有KB/MB/GB/TB or byte number.

tidb_server_memory_limit 可以设置成0,但不能设置成负数。该变量设置成 0 时表示关闭 go runtime 的MemoryLimit 功能,也即关闭 tidb-server 的 MemoryTuner 功能。

MySQL [(none)]> set global tidb_server_memory_limit = 1GB;
Query OK, 0 rows affected (0.01 sec)

MySQL [(none)]> set global tidb_server_memory_limit = “80%”;
Query OK, 0 rows affected (0.01 sec)

设置 tidb_server_memory_limit 的代码如下。parseMemoryLimit 函数会解析要设置的内存限制,最后保存在全局变量 memory.ServerMemoryLimit

// 保存内存限制的全局变量
var ServerMemoryLimit            = atomicutil.NewUint64(0)

// 设置 tidb_server_memory_limit 
SetGlobal: func(_ context.Context, s *SessionVars, val string) error {
	bt, str, err := parseMemoryLimit(s, val, val)
	if err != nil {
		return err
	}
	memory.ServerMemoryLimitOriginText.Store(str)
	memory.ServerMemoryLimit.Store(bt)
	gctuner.GlobalMemoryLimitTuner.UpdateMemoryLimit()
	return nil
}

tidb_server_memory_limit 变量是如何影响 tidb 的 MemoryTuner 功能的,继续看 (t *memoryLimitTuner) UpdateMemoryLimit 函数。t.GetPercentage() 返回的是 tidb_server_memory_limit_gc_trigger 的值.

// 当 `tidb_server_memory_limit` or `tidb_server_memory_limit_gc_trigger` 发生改变时需要调用 t.UpdateMemoryLimit
// 去重新设置 runtime 的 MemoryLimit. 
func (t *memoryLimitTuner) UpdateMemoryLimit() {
	var memoryLimit = t.calcMemoryLimit(t.GetPercentage())
	if memoryLimit == math.MaxInt64 {
		t.isTuning.Store(false)
		memoryLimit = initGOMemoryLimitValue  // -1
	} else {
		t.isTuning.Store(true)
	}
	debug.SetMemoryLimit(memoryLimit)
} 
1 个赞

自 v6.5.0 版本起,可以通过系统变量 tidb_server_memory_limit 设置 tidb-server 实例的内存使用阈值

例如:配置 tidb-server 实例的内存使用总量,将其设置成为 32 GB:
SET GLOBAL tidb_server_memory_limit = “32GB”;

设置该变量后,当 tidb-server 实例的内存用量达到 32 GB 时,TiDB 会依次终止正在执行的 SQL 操作中内存用量最大的 SQL 操作,直至 tidb-server 实例内存使用下降到 32 GB 以下。被强制终止的 SQL 操作会向客户端返回报错信息 Out Of Memory Quota!

1 个赞

tidb-server 内存使用量,你top命令然后shift+m看到那个tidb-server进程的

每个tidb server进程内存,集群分布式的,没有一个参数能配置总的,各组件有单独的参数,pd一般不用配置,kv有cache的

这个是单独设置tidb-server组件的内存,占用的是tidb-server所在服务器的内存总量的百分比
所有的内存设置都是按照单个组件的设置的,例如tikv单独设置,tidb-server单独设置。

这个是global级的参数吧
你意思是全局参数,但是只影响tidb模块?

每个tidb-server所在服务器占用的内存

明白了

对的,这个是限制tidb-server组件的,也有类似的限制tikv的内存参数,都是针对所有的tidb-server组件或者tikv组件的

tidb_server_memory_limit参数用于设置单个TiDB节点的内存限制,而不是整个TiDB集群的总使用内存。 其实没必要配置总内存使用量,因为那样意义不大,
每个节点的配置和内存、cpu可能都不一样,为了最大化利用机器性能,可以根据机器的配置单独设置各个节点的配置即可,具体参数如下

  1. TiDB节点的内存限制:通过调整每个TiDB节点的tidb_server_memory_limit参数,可以控制TiDB节点的内存使用量。

  2. TiKV节点的内存限制:通过调整每个TiKV节点的tikv_memory_limit参数,可以控制TiKV节点的内存使用量。

  3. PD节点的内存限制:通过调整每个PD节点的pd-server配置文件中的内存限制参数,可以控制PD节点的内存使用量。

  4. TiFlash节点的内存限制:通过调整每个TiFlash节点的tiflash-server配置文件中的内存限制参数,可以控制TiFlash节点的内存使用量。

在配置这些参数时,您需要根据实际情况和硬件资源来平衡内存的分配。确保为每个组件分配足够的内存,并避免过度分配导致整体性能下降。

注意,除了内存限制外,还应考虑其他资源限制,如磁盘空间、CPU等。综合考虑这些因素,可以更好地配置TiDB集群的总内存使用量。

请问有没有更快捷的方式调整单个tidb实例(包括tidb, tikv, pd, tiflash)的总内存?

SET GLOBAL tidb_server_memory_limit = “32GB”; 直接修改系统变量

1、这个参数应该是单台机器的


2、设置总的感觉没有意义,因为可能单台发生OOM。
混布的话,可以参考这里
https://docs.pingcap.com/zh/tidb/stable/three-nodes-hybrid-deployment#三节点混合部署的最佳实践

1 个赞

设置tidb节点的总使用内存