【 TiDB 使用环境】生产环境
【 TiDB 版本】7.5.1
【复现路径】tidb跑批
【遇到的问题:问题现象及影响】
tidb的配置文件
global:
user: “tidb”
ssh_port: 22
deploy_dir: “/data/tidb-deploy”
data_dir: “/data/tidb-data”
resource_control:
memory_limit: “20G”
tikv:
storage.block-cache.capacity: 10GB
部署方式:三个节点混部tidb:
node1: pd tidb tikv grafana prometheus
node2:pd tidb tikv
node3: pd tidb tikv
现象:跑批的过程中时常会发生oom导致tidb组件重启的情况
问题:
1 tidb的内存使用限制,和用哪个用户部署有关系吗?比如 用tidb用户部署集群,内存受限制,用root 用户部署集群 ,集群使用过程中,内存就限制不住?
2 按照配置文件里启动tidb,那在跑批过程中 tidb整个集群 在节点上的内存占用是什么样的,是不管多少数据多少并发进行跑批 日常会占满40G,还是 <=40G ,在并发高的情况下会高于40G吗?
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】
tikv block-cache 10GB ≠ tikv 内存 10GB,tikv 进程一般 1~2GB,还有其他内存占用
单节点内存占用 = TiDB + TiKV + PD + 系统开销, 这样够吗?
1、跟用哪个用户部署没有关系
2、肯定是用的多使用的才高
可以看看SQL方面有没有什么异常的
一个是看看tidb的日志,搜一下expensive关键字,看看有没有跑批的SQL,另一个是看看慢查询,找找对应的SQL。
还有现在的跑批任务是什么类型的任务,做哪些操作?比如update/delete?
异乡的大人
(Ti D Ber 2 Qs S2z Ws)
6
部署用户不直接决定 TiDB 内存限制是否生效,跟是谁部署的无关
异乡的大人
(Ti D Ber 2 Qs S2z Ws)
7
单节点同时运行 PD+TiDB+TiKV + 监控组件,跑批时 TiDB 的查询内存(排序 / 聚合)、TiKV 的 RocksDB 内存(Compaction / 写缓冲区)、PD 的元数据缓存内存同时飙升,资源互相抢占,单节点总内存快速耗尽
异乡的大人
(Ti D Ber 2 Qs S2z Ws)
8
20G 是单组件实例的 cgroup 上限,而非节点 / 集群总内存
TiDB 内存使用限制 和部署用户无直接关联 ,其内存管控由自身配置参数与系统层面的 cgroup 等限制决定,和部署时的操作系统用户(tidb/root)无关:
- 若仅通过 TiDB 自身配置(如memory_limit)限制内存,无论用 tidb 还是 root 用户部署,该限制逻辑均生效;
- 若依赖操作系统层面的用户级资源限制(如 ulimit、cgroup 规则),则会受用户权限影响,但这是系统层面的管控,非 TiDB 集群部署用户直接导致的 “限制不住”。root 用户部署也无法突破 TiDB 自身参数和合理的系统资源限制,仅能获得更高的系统操作权限,不改变内存管控逻辑。
lmdb
(“One day my life will end, and you will wear the crown.")
12
参数 tidb_mem_quota_query 设置的多少,另外根据连接的介绍排查下
1 个赞
1、跟用哪个用户部署没有关系
2、肯定是用的多使用的才高
内存大小和跑批的数据量关系很大,所有运算中间结果全在内存里,如果有必要上台TiFlash试试
独善其身
(Ti D Ber Bi Rqfz5 K)
16
实际的约束情况是取系统、数据库、用户参数相关配置的交集,也就是最小值,木桶原理