【 TiDB 使用环境】生产环境
【 TiDB 版本】6.5.0
【遇到的问题:问题现象及影响】 load data 一个500w行的文件会造成内存使用率会飙的太高
【资源配置】
【附件:截图/日志/监控】
请教一下社区大佬:为什么内存使用率会飙的这么高?
一台96g机器两个tikv如何配置能够限制内存使用率不超过80%
【 TiDB 使用环境】生产环境
【 TiDB 版本】6.5.0
【遇到的问题:问题现象及影响】 load data 一个500w行的文件会造成内存使用率会飙的太高
【资源配置】
【附件:截图/日志/监控】
请教一下社区大佬:为什么内存使用率会飙的这么高?
目前 TiDB 已经能够做到追踪单条 SQL 查询过程中的内存使用情况,当内存使用超过一定阈值后也能采取一些操作来预防 OOM 或者排查 OOM 原因。你可以使用系统变量 tidb_mem_oom_action
来控制查询超过内存限制后所采取的操作:
LOG
,那么当一条 SQL 的内存使用超过一定阈值(由 session 变量 tidb_mem_quota_query
控制)后,这条 SQL 会继续执行,但 TiDB 会在 log 文件中打印一条 LOG。CANCEL
,那么当一条 SQL 的内存使用超过一定阈值后,TiDB 会立即中断这条 SQL 的执行,并给客户端返回一个错误,错误信息中会详细写明在这条 SQL 执行过程中占用内存的各个物理执行算子的内存使用情况。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 升降机。对于 SSD 设备,宜设置为 noop
。
echo noop > /sys/block/${SSD_DEV_NAME}/queue/scheduler
块 (block) 是文件系统的工作单元。块大小决定了单个块中可以存储多少数据,因此决定了一次写入或读取的最小数据量。
默认块大小适用于大多数使用情况。但是,如果块大小(或多个块的大小)与通常一次读取或写入的数据量相同或稍大,则文件系统将性能更好,数据存储效率更高。小文件仍将使用整个块。文件可以分布在多个块中,但这会增加运行时开销。
使用 mkfs
命令格式化设备时,将块大小指定为文件系统选项的一部分。指定块大小的参数随文件系统的不同而不同。有关详细信息,请查询对应文件系统的 mkfs
手册页,比如 man mkfs.ext4
。
理解一下这个是缓存 用100%也正常
这是正常地
除了以上列出的 block-cache
以及 write-buffer
会占用系统内存外:
select * from ...
)会读取数据然后在内存中生成对应的数据结构返回给 TiDB,这个过程中 TiKV 会占用一部分内存memory-usage-limit
只控制了 block-cache
的使用内存不超过75%,其他的并没有限制到。
write_buffer使用的内存不大,系统预留的内存也没法干预,所以你需要通过调整 storage.block-cache 来控制 block-cache
的最大内存使用。
内存使用率高正常,导好会下降
load data 一个500w行的文件 具体看怎么load的,适当行数拼接成一个insert 然后提交一次,内存占用就不会很大。