可以减慢实时订阅者在 kdb 中杀死 tickerplant

Can slow real time subscriber kill tickerplant in kdb

缓慢的消费者可以杀死或减慢 tickerplant 吗?

我有一个自动收报机工厂,它有 3 个实时订阅者,其中一个订阅者速度很慢。

q).z.W
7 | `long$()
8 | 969393 198 198 197 197 198 196 199 197 196 143 198 196 196 197 197 198 19..
9 | 199 198 198 143 197 199 197 197 197 197 199 196 199 145 196 198 198 198 1..
10| 198 196 198 144 199 198 198 198 196 197 196 199 198 143 199 198 197 198 1..

q)count each .z.W
7 | 0
8 | 85547
9 | 77931
10| 0

q)count each .z.W
7 | 0
8 | 191552
9 | 0
10| 0

在接收数十亿条记录的生产 kdb+ 系统中,缓慢的消费者能否杀死 tickerplant 或减慢它的速度?

是的,一个缓慢的消费者可以杀死一个 tickerplant。慢速消费者在 tickerplant 中创建输出队列,这个输出队列消耗内存。最终,如果它持续足够长的时间,tickerplant(或它 运行 正在运行的机器)可能 运行 内存不足并中止。

理想情况下,生产 tickerplant 将有某种形式的监控,定期关注输出队列 - 如果队列超过某个阈值,它应该停止订阅(暂时从 .u.w 订阅字典,允许队列排空)并恢复 if/when 订阅者赶上。或者更积极地完全关闭订阅者连接 (hclose),这会清除输出队列。

如果您的系统遇到大量排队,那么 tickerplant 可能也需要每天进行一次垃圾收集(比如在 EOD 时),以确保输出队列没有导致它持有未使用的内存(或者您可能想要保留未使用的内存,这样下次有大队列时就不必从 OS 重新请求内存)

特里的回答是 100% 正确。我只是想扩展在具有慢速订阅者的 TP 中对垃圾收集的需求。

通过 .Q.gc[] 而不是立即收集 \g 1 实现此收集很重要。只有当对象的所有引用都被删除并且对象返回到堆时才会触发立即收集,如果它大于 64MB 则收集触发。

在 TP 正常执行期间,发布的数据从来不是引用对象,而是传入消息的参数,然后发布出去。因此,没有触发自动垃圾收集的对象解除引用。