[redis]Redis client-output-buffer-limit pubsub

2023-12-08 728 views
9

我们正在研究使用 EdgeX 和 Redis 服务器的实时视频流用例。我们收到一个错误

Client id=11 addr=10.168.3.0:51414 fd=9 name= age=266 idle=35 flags=P db=0 sub=0 psub=1 multi=-1 qbuf=0 qbuf-free=0 obl=122 oll=1 omem=114868232 events=r cmd=psubscribe scheduled to be closed ASAP for overcoming of output buffer limits

经过一些研究,我们发现我们应该增加 redis.conf 文件中的 client-output-buffer-limit pubsub 。因此,我将限制提高到 1024mb 120mb 180sec。我们仍然遇到同样的错误。视频文件大小为 30mb(300 帧,640x480 像素)。

请告诉我们如何解决此问题。提前致谢。

回答

4

对 redis.conf 文件进行更改后,您是否重新启动服务器以使更改生效?

或者,您可以使用该CONFIG SET命令在运行时应用新配置,使用 验证值CONFIG GET,并使用 保留更改CONFIG REWRITE

4

是的,这些改变是有效的。我使用 CONFIG SET 命令更改了 redis 配置,并使用 CONFIG GET 命令进行了交叉验证。

2

该文件正在循环发布。但是,在发布文件 10-15 次后,Redis 抛出错误。

8

明白了。IMO,这里发生的情况是订阅者无法按照消息发布的速度使用消息。结果,输出缓冲区被填满,最终,当达到限制时连接被关闭。

以下是该现象的最小再现(不包括 golang 和 EdgeX):

import redis

def s_handler(msg):
    print(len(msg['data']))

s = redis.Redis()
sp = s.pubsub()
sp.subscribe(**{'channel': s_handler})
t = sp.run_in_thread(sleep_time=0.001)

p = redis.Redis()
while True:
    p.publish('channel', '0' * 30 * pow(10,6))

经过几次迭代后,显然以这个日志行结束:

44407:M 14 Dec 2022 17:52:11.785 # Client id=25 addr=[::1]:62956 laddr=[::1]:6379 fd=10 name= age=2 idle=0 flags=P db=0 sub=1 psub=0 ssub=0 multi=-1 qbuf=0 qbuf-free=16890 argv-mem=0 multi-mem=0 rbs=16384 rbp=16384 obl=0 oll=37 omem=1080006008 tot-mem=1080040112 events=rw cmd=subscribe user=default redir=-1 resp=2 scheduled to be closed ASAP for overcoming of output buffer limits.

我不相信您的用例(实时视频流)和所选的实现非常匹配。AFAIK,Redis 的 Pub/Sub 通常用于广播明显较小的有效负载,而这感觉像是滥用该功能:)

增加输出缓冲区没有帮助。您需要订阅者跟上发布者的步伐,因此如果可能,请尝试扩展/优化它。但请注意,即使单个订阅者可以足够快地消费,拥有多个订阅者最终也会使服务器的网络接口饱和(假设有足够的 RAM 用于许多较大的输出缓冲区)。

很抱歉我无法提供更多帮助。我正在将此问题转移到核心存储库,以防有人有我缺少的答案。

5

您好,我得到一些提示,表明该问题是由于消息总线使用 Redis pub/sub 而不是 MQTT 引起的。这会是 OOM 错误的可能原因之一吗?

3

是的,您收到 OOM 错误是因为您使用 pub/sub 发送 Redis 消息并且没有足够快地消耗它们。我不确定您如何切换到 MQTT。

6

你能告诉我 Redis pub/sub 内存限制是什么吗?我们是否可以将Redis数据保存到Ram中而不是保存在磁盘上?

6

更简单的问题是 Redis 只保存到 RAM 中,而不保存到磁盘中。

3

对于内存,它由“client-output-buffer-limit pubsub”控制,默认为 32mb 硬限制或 8mb 持续 60 秒。

5

我已将 client-output-buffer-limit pub/sub 配置为 1024mb、64mb、180 秒。仍然面临OOM错误。

7

现在日志消息的频率是否降低了?看来您的客户端从 Redis 中提取数据的速度没有生成数据的速度快,这导致客户端上出现备份,最终导致其被终止。