2015-12-15 46 views
3

我遇到与我的kdb过程严重的内存问题。这里简要介绍一下架构。为什么kdb进程在系统上显示高内存使用率?

该进程以从模式运行(4个从站)。它最初将数据库中的大量数据加载到内存中(从-22!计算的内存中加载的所有变量的总大小约为11G)。最初这与.Q.w []匹配并接近unix进程内存使用情况。这个数据集在增量操作中增加很少。但是,长时间运行后,尽管kdb内存统计信息(.Qw [])显示预期的内存使用情况(包括已用和已用堆)〜13 G,但该进程在系统上消耗接近25G(unix/proc,top)最终会耗尽物理内存。

现在,当我手动运行垃圾回收(.Q.gc [])时,它释放内存并使unix进程的使用接近.Q.w []显示的堆号。

我使用-g 1选项在即时模式下运行垃圾收集,运行Q 2.7版本。

为什么unix进程的使用与kdb内部统计信息差别如此巨大 - 差异来自哪里?为什么“-g 1”选项不起作用?当我运行一个简单的例子,它工作正常。但在这种情况下,它似乎泄漏了很多内存。

我试着用2.6应该有自动垃圾收集的版本。令人惊讶的是,当使用2.6版本的单线程(每个)和多线程模式(桃子)运行时,.Q.w中的使用堆号和堆号之间仍然存在巨大差异。有任何想法吗?

回答

2

我不知道具体的答案,但是这是基于以下信息(以及一些实用的实验)我扣这是对维基提到: http://code.kx.com/q/ref/control/#peach 它说:

内存使用

每个从属线程都有自己的堆,最小为64MB。

由于主线程中的kdb 2.7 2011.09.21,.Q.gc []也在从线程中执行gc。

每个线程中的自动垃圾收集(由wsful触发,或者在命令行中使用-w指定的命中人为堆限制)仅针对该特定线程执行,而不是跨所有线程执行。

符号从所有线程共有的单个内存区域内部化。

我的意见:

  1. 线程特定内存:

.Q.w[]仅示出了主线程的统计信息,而不是所有的线程的总和(总进程内存)。这可以通过用2个线程开始'q'来测试。在这种情况下,内存总容量应该至少为128MB,但是.Q.w[]仍然显示64 MB。

这就是为什么在你的情况下,在开始内存统计数据接近unix统计数据,因为所有数据都在主线程中,而其他线程上没有数据。在做了一些操作之后,某些线程可能会占用一些内存(使用/垃圾),这是.Q.w[]未显示的。

  • 垃圾收集呼叫
  • 正如上提及的维基,要求主线程垃圾收集器上的所有线程调用GC。所以这可能已经从线程收集了垃圾内存并减少了总内存使用量,这反映了unix内存统计信息的减少。

    +0

    感谢您的洞察力。很有帮助。 – user5637363

    +0

    您是否知道在自动模式下为从站运行垃圾回收器的方法?有没有命令行选项。如果我理解正确,-g选项仅对主线程这样做。或者,-w限制也适用于奴隶? ' – user5637363

    +0

    '-w'适用于每个线程。所以每个线程都会有相同的内存限制。根据“内存使用情况”描述中的第3点,特定线程的自动垃圾收集只会在发生严重情况并且达到由-w设置的内存限制时发生。 – Rahul

    相关问题