load data内存使用很容易超过90%,太高了,怎么处理

【 TiDB 使用环境】生产环境
【 TiDB 版本】6.5.0
【遇到的问题:问题现象及影响】 load data 一个500w行的文件会造成内存使用率会飙的太高

【资源配置】

【附件:截图/日志/监控】
请教一下社区大佬:为什么内存使用率会飙的这么高?


一台96g机器两个tikv如何配置能够限制内存使用率不超过80%

目前 TiDB 已经能够做到追踪单条 SQL 查询过程中的内存使用情况,当内存使用超过一定阈值后也能采取一些操作来预防 OOM 或者排查 OOM 原因。你可以使用系统变量 tidb_mem_oom_action 来控制查询超过内存限制后所采取的操作:

  • 如果变量值为 LOG,那么当一条 SQL 的内存使用超过一定阈值(由 session 变量 tidb_mem_quota_query 控制)后,这条 SQL 会继续执行,但 TiDB 会在 log 文件中打印一条 LOG。
  • 如果变量值为 CANCEL,那么当一条 SQL 的内存使用超过一定阈值后,TiDB 会立即中断这条 SQL 的执行,并给客户端返回一个错误,错误信息中会详细写明在这条 SQL 执行过程中占用内存的各个物理执行算子的内存使用情况。
1 个赞

内存——虚拟内存参数

  • dirty_ratio 百分比值。当脏的 page cache 总量达到系统内存总量的这一百分比后,系统将开始使用 pdflush 操作将脏的 page cache 写入磁盘。默认值为 20%,通常不需调整。对于高性能 SSD,比如 NVMe 设备来说,降低其值有利于提高内存回收时的效率。
  • dirty_background_ratio 百分比值。当脏的 page cache 总量达到系统内存总量的这一百分比后,系统开始在后台将脏的 page cache 写入磁盘。默认值为 10%,通常不需调整。对于高性能 SSD,比如 NVMe 设备来说,设置较低的值有利于提高内存回收时的效率。

存储及文件系统

内核 I/O 栈链路较长,包含了文件系统层、块设备层和驱动层。

I/O 调度器

I/O 调度程序确定 I/O 操作何时在存储设备上运行以及持续多长时间。也称为 I/O 升降机。对于 SSD 设备,宜设置为 noop

echo noop > /sys/block/${SSD_DEV_NAME}/queue/scheduler

格式化参数——块大小

块 (block) 是文件系统的工作单元。块大小决定了单个块中可以存储多少数据,因此决定了一次写入或读取的最小数据量。

默认块大小适用于大多数使用情况。但是,如果块大小(或多个块的大小)与通常一次读取或写入的数据量相同或稍大,则文件系统将性能更好,数据存储效率更高。小文件仍将使用整个块。文件可以分布在多个块中,但这会增加运行时开销。

使用 mkfs 命令格式化设备时,将块大小指定为文件系统选项的一部分。指定块大小的参数随文件系统的不同而不同。有关详细信息,请查询对应文件系统的 mkfs 手册页,比如 man mkfs.ext4

1 个赞

理解一下这个是缓存 用100%也正常

这是正常地

除了以上列出的 block-cache 以及 write-buffer 会占用系统内存外:

  1. 需预留一些内存作为系统的 page cache
  2. TiKV 在处理大的查询的时候(例如 select * from ...)会读取数据然后在内存中生成对应的数据结构返回给 TiDB,这个过程中 TiKV 会占用一部分内存

memory-usage-limit 只控制了 block-cache 的使用内存不超过75%,其他的并没有限制到。
write_buffer使用的内存不大,系统预留的内存也没法干预,所以你需要通过调整 storage.block-cache 来控制 block-cache 的最大内存使用。

1 个赞

内存使用率高正常,导好会下降

load data 一个500w行的文件 具体看怎么load的,适当行数拼接成一个insert 然后提交一次,内存占用就不会很大。