内存

参考内存管理教程: DolphinDB教程:内存管理

社区版许可证提供的默认内存上限为 8 GB,若场景需要更高的配置可以通过 官网申请许可证

系统内存

利用 DolphinDB 做大数据的查询和计算时,可能会由于内存不足造成 OOM。为了尽量避免查询时内存溢出的情况,DolphinDB 提供了一系列内存调优的参数。

maxMemSize 决定了 server 运行在服务器的内存上限。该参数受机器内存上限的影响。

配置参数

解释

maxMemSize=0

分配给 DolphinDB 的最大内存空间(以 GB 为单位)。如果该参数设为0,表明 DolphinDB 的内存使用没有限制。建议设置为比机器内存容量低的一个值。

当内存占用达到 warningMemSize 时,系统会自动清理数据库的缓存,释放一部分内存,以避免 OOM。

配置参数

解释

warningMemSize

当内存使用量超过 warningMemSize (以 GB 为单位)时,系统会自动清理部分数据库的缓存,以避免出现 OOM 异常。默认值为 maxMemSize 的75%。

内存不足时,DolphinDB 为了避免一次性申请过大内存造成内存溢出的情况,提供了以下两个配置项,限制该场景下可申请的内存块大小,以尽可能避免 OOM 的发生。

配置参数

解释

reservedMemSize=5% * maxMemSize

一个大于 0 的数字,单位为GB。当 DolphinDB 的可用内存小于 reservedMemSize 时,但仍有新的内存申请时,DolphinDB 将仅分配由 maxBlockSizeForReservedMemory 指定大小的内存块,这是为了尽可能保证报错、事务回滚等需要内存量少但较为关键的操作能有足够的内存,以降低此类操作失败的概率。

例如,当因内存不足导致写入失败时,尽量保证仍然能正常回滚,避免数据不一致。若不指定该参数,系统默认按照 maxMemSize 的5%预留内存(此时,预留内存最小为64MB,最大为1GB)。

maxBlockSizeForReservedMemory=8

表示 DolphinDB 可使用内存少于 reservedMemSize 时,每次申请内存的请求可以分配的最大内存块(单位为KB),默认值为 8。不建议设置过大值,否则系统可能因内存被占满,而导致关键操作申请不到内存,进而出现异常或崩溃。

2.00.3 新版功能: 参数 reservedMemSizemaxBlockSizeForReservedMemory

此外 DolohinDB 还提供了配置项,用来调整内存释放的速度。该参数等价于设置了 TCMalloc 的 tcmalloc_release_rate。

配置参数

解释

memoryReleaseRate=5

将未使用的内存释放给操作系统的速率,是0到10之间的浮点数。 memoryReleaseRate=0 表示不会主动释放未使用的内存,memoryReleaseRate=10 表示以最快的速度释放内存。默认值是5。

cache engine

设置 dataSync=1 后,每个节点的内存将分别维护 OLAP cache engine 和 TSDB cache engine。该参数配置需在 controller 的 config 文件配置(默认为 controller.cfg)。

配置参数

解释

dataSync=0

表示是否采用数据强制刷盘策略。默认值为0,表示是否由操作系统决定什么时候刷盘。如果 dataSync=1,表示将 redo log、数据和元数据强制刷盘。

cache engine 的大小可通过以下配置项设置:

配置参数

解释

OLAPCacheEngineSize=0

Alias: chunkCacheEngineMemSize

指定 OLAP存储引擎 cache engine 的容量(单位为 GB)。 cache engine 开启后,写入数据时,系统会先把数据写入缓存,当缓存中的数据量达到 OLAPCacheEngineSize 的30%时,才写入磁盘。

默认值是0,即不开启 cache engine。开启 cache engine 的同时,必须设置 dataSync=1。

TSDBCacheEngineSize=1

设置 TSDB 存储引擎 cache engine 的容量(单位为GB),必须为正数,默认值为1。如果写入压力太大,系统 cache engine 内存占用可能会达到该参数值的2倍大小。

因为若当前申请的大小为 TSDBCacheEngineSize 的内存写满后,该内存中的数据开始刷盘,此时若有数据继续写入,系统会再分配一块内存来接收新数据。需要注意的是,若数据刷盘不及时,可能导致新分配的内存也达到 TSDBCacheEngineSize 大小,此时写入线程会被阻塞。

TSDBCacheEngineSize 需合理设置,若设置过小,可能导致 cache engine 频繁刷盘,影响系统性能;若设置过大,由于 cache engine 内缓存的数据量很大,但由于未达到 cache engine 的大小(且未达到十分钟),因此数据尚未刷盘,此时若发生了机器断电或关机,重启后就需要回放大量事务,导致系统启动过慢。

根据 TSDB 引擎的数据模型,数据写入需要经过“排序-压缩-落盘”三个阶段。

  • 排序在 cache engine 内部进行,排序的线程数可通过配置项 TSDBAsyncSortingWorkerNum 设置。

  • 落盘前可通过 TSDBCacheEngineCompression 配置项决定数据是否进行压缩。压缩以 level File 中存储的数据块为单位进行,因此数据块的大小(由 TSDBMaxBlockSize 决定)会对压缩比造成一定影响。

  • 落盘时,为提升 TSDB cache engine 的刷盘速度,可以配置 TSDBCacheFlushWorkNum 设置工作线程数。

配置参数

解释

TSDBAsyncSortingWorkerNum=1

非负整数,默认值为1,用于指定 TSDB cache engine 异步排序的工作线程数。若该参数设置为0,表示写入和排序同步进行。TSDB 写入 cache engine 中的数据将会根据 sortColumns 排序。

数据写入 cache engine 和排序任务可以同步或异步进行,异步可以提升写入性能。注意:异步排序可以提高数据写入性能,但会降低查询性能,因为查询需要等待相关 chunk 的异步排序线程结束才能进行。

TSDBCacheTableBufferThreshold=16384

TSDB 引擎缓存数据进行批量排序的阈值。当缓存数据的记录数达到该值后,cache engine 将对该部分数据进行排序。

TSDBCacheEngineCompression=false

布尔值,表示是否对 TSDB 存储引擎 cache engine 里的数据进行压缩,默认值为 false,表示不进行压缩。

TSDBMaxBlockSize=16384

配置 TSDB 引擎数据存储单位 block 的大小(单位为 B),默认值是 16384。其取值大小会影响点查速度或压缩比。设置较小值可以加快点查速度;设置较大值可以提高压缩比。

TSDBCacheFlushWorkNum

配置 TSDB cache engine 刷盘的工作线程数。默认值是 volumes 指定的磁盘卷数。若配置值小于磁盘卷数,则仍取默认值。

2.00.2 新版功能: 参数 TSDBMaxBlockSize

2.00.5 新版功能: 参数 TSDBAsyncSortingWorkerNum

除了 cache engine, TSDB 引擎在内存还维护了到 level file 数据块的索引,索引大小可由配置项 TSDBLevelFileIndexCacheSize 指定。

配置参数

解释

TSDBLevelFileIndexCacheSize=5% * maxMemSize

设置 TSDB 存储引擎 level file 元数据内存占用空间上限。单位为 GB,类型为浮点型。默认值为 DolphinDB 系统可使用(由 maxMemSize 设置)的5%,最小值为0.1(GB)。

若读取的索引超过 TSDBLevelFileIndexCacheSize,DolphinDB 内部会根据访问时间,将最不常访问的索引进行置换。

配置参数

解释

TSDBLevelFileIndexCacheInvalidPercent=0.95

TSDB 引擎 level file 索引缓存淘汰算法的阈值,默认值是 0.95。