版本: 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)
}
自 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!
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可能都不一样,为了最大化利用机器性能,可以根据机器的配置单独设置各个节点的配置即可,具体参数如下
-
TiDB节点的内存限制:通过调整每个TiDB节点的tidb_server_memory_limit参数,可以控制TiDB节点的内存使用量。
-
TiKV节点的内存限制:通过调整每个TiKV节点的tikv_memory_limit参数,可以控制TiKV节点的内存使用量。
-
PD节点的内存限制:通过调整每个PD节点的pd-server配置文件中的内存限制参数,可以控制PD节点的内存使用量。
-
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#三节点混合部署的最佳实践
设置tidb节点的总使用内存