为什么 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.

我的观察:

  1. 线程特定内存:

.Q.w[] 仅显示主线程的统计信息,而不显示所有线程的总和(总进程内存)。这可以通过使用 2 个线程启动 'q' 来测试。根据第 1 点,在这种情况下,总内存应至少为 128MB,但 .Q.w[] 它仍显示 64 MB。

这就是为什么在您的情况下,开始时内存统计数据接近 unix 统计数据,因为所有数据都在主线程中,而其他线程中没有任何数据。在执行一些操作后,某些线程可能占用了一些内存 (used/garbage),.Q.w[].

未显示这些内存
  1. 垃圾收集器调用

如 wiki 上所述,在主线程上调用垃圾收集器会在所有线程上调用 GC。因此,这可能已经从线程中收集了垃圾内存并减少了总内存使用量,这反映在减少的 unix 内存统计信息中。