为什么 kdb 进程在系统上显示高内存使用率?
why is kdb process showing high memory usage on system?
我 运行 我的 kdb 进程遇到了严重的内存问题。这是简要的体系结构。
进程运行秒处于从机模式(4个从机)。它最初将大量数据从数据库加载到内存中(加载到内存中的所有变量的总大小从 -22 计算!约为 11G)。最初这匹配 .Q.w[] 并接近 unix 进程内存使用。这个数据集在增量操作中增加的很少。然而,经过长时间的操作,尽管 kdb 内部内存统计信息 (.Q.w[]) 显示预期的内存使用量(已用内存和堆内存)~ 13 G,但该进程在系统上消耗的内存接近 25G (unix / proc, top) 最终 运行 耗尽物理内存。
现在,当我 运行 手动垃圾收集 (.Q.gc[]) 时,它会释放内存并使 unix 进程使用率接近 .Q.w[ 显示的堆数].
我 运行ning Q 2.7 版本带有 -g 1 选项以 运行 立即模式下的垃圾收集。
为什么 unix 进程使用情况与 kdb 内部统计数据有如此大的不同 -- 差异从何而来?为什么“-g 1”选项不起作用?当我 运行 一个简单的例子时,它工作正常。但是在这种情况下,它似乎泄漏了很多内存。
我试过 2.6 版本,它应该有自动垃圾收集功能。令人惊讶的是,在单线程 (each) 和多线程模式 (peach) 中,.Q.w when 运行 版本 2.6 中的已用数和堆数之间仍然存在巨大差异。有什么想法吗?
我不确定具体的答案,但这是我根据维基上提到的以下信息(和一些实际实验)推导出来的:
http://code.kx.com/q/ref/control/#peach
它说:
内存使用
Each slave thread has its own heap, a minimum of 64MB.
Since kdb 2.7 2011.09.21, .Q.gc[] in the main thread executes gc in the slave threads too.
Automatic garbage collection within each thread (triggered by a wsful, or hitting the artificial heap limit as specified with -w on the command line) is only executed for that particular thread, not across all threads.
Symbols are internalized from a single memory area common to all threads.
我的观察:
- 线程特定内存:
.Q.w[]
仅显示主线程的统计信息,而不显示所有线程的总和(总进程内存)。这可以通过使用 2 个线程启动 'q' 来测试。根据第 1 点,在这种情况下,总内存应至少为 128MB,但 .Q.w[]
它仍显示 64 MB。
这就是为什么在您的情况下,开始时内存统计数据接近 unix 统计数据,因为所有数据都在主线程中,而其他线程中没有任何数据。在执行一些操作后,某些线程可能占用了一些内存 (used/garbage),.Q.w[]
.
未显示这些内存
- 垃圾收集器调用
如 wiki 上所述,在主线程上调用垃圾收集器会在所有线程上调用 GC。因此,这可能已经从线程中收集了垃圾内存并减少了总内存使用量,这反映在减少的 unix 内存统计信息中。
我 运行 我的 kdb 进程遇到了严重的内存问题。这是简要的体系结构。
进程运行秒处于从机模式(4个从机)。它最初将大量数据从数据库加载到内存中(加载到内存中的所有变量的总大小从 -22 计算!约为 11G)。最初这匹配 .Q.w[] 并接近 unix 进程内存使用。这个数据集在增量操作中增加的很少。然而,经过长时间的操作,尽管 kdb 内部内存统计信息 (.Q.w[]) 显示预期的内存使用量(已用内存和堆内存)~ 13 G,但该进程在系统上消耗的内存接近 25G (unix / proc, top) 最终 运行 耗尽物理内存。
现在,当我 运行 手动垃圾收集 (.Q.gc[]) 时,它会释放内存并使 unix 进程使用率接近 .Q.w[ 显示的堆数].
我 运行ning Q 2.7 版本带有 -g 1 选项以 运行 立即模式下的垃圾收集。
为什么 unix 进程使用情况与 kdb 内部统计数据有如此大的不同 -- 差异从何而来?为什么“-g 1”选项不起作用?当我 运行 一个简单的例子时,它工作正常。但是在这种情况下,它似乎泄漏了很多内存。
我试过 2.6 版本,它应该有自动垃圾收集功能。令人惊讶的是,在单线程 (each) 和多线程模式 (peach) 中,.Q.w when 运行 版本 2.6 中的已用数和堆数之间仍然存在巨大差异。有什么想法吗?
我不确定具体的答案,但这是我根据维基上提到的以下信息(和一些实际实验)推导出来的: http://code.kx.com/q/ref/control/#peach 它说:
内存使用
Each slave thread has its own heap, a minimum of 64MB.
Since kdb 2.7 2011.09.21, .Q.gc[] in the main thread executes gc in the slave threads too.
Automatic garbage collection within each thread (triggered by a wsful, or hitting the artificial heap limit as specified with -w on the command line) is only executed for that particular thread, not across all threads.
Symbols are internalized from a single memory area common to all threads.
我的观察:
- 线程特定内存:
.Q.w[]
仅显示主线程的统计信息,而不显示所有线程的总和(总进程内存)。这可以通过使用 2 个线程启动 'q' 来测试。根据第 1 点,在这种情况下,总内存应至少为 128MB,但 .Q.w[]
它仍显示 64 MB。
这就是为什么在您的情况下,开始时内存统计数据接近 unix 统计数据,因为所有数据都在主线程中,而其他线程中没有任何数据。在执行一些操作后,某些线程可能占用了一些内存 (used/garbage),.Q.w[]
.
- 垃圾收集器调用
如 wiki 上所述,在主线程上调用垃圾收集器会在所有线程上调用 GC。因此,这可能已经从线程中收集了垃圾内存并减少了总内存使用量,这反映在减少的 unix 内存统计信息中。