问题标签 [low-latency]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
28743 浏览

node.js - Node.js、Socket.io、Redis pub/sub 大容量、低延迟困难

当结合 socket.io/node.js 和 redis pub/sub 试图创建一个由服务器事件驱动的可以处理多个传输的实时网络广播系统时,似乎有三种方法:

  1. 'createClient' 一个 redis 连接并订阅频道。在 socket.io 客户端连接上,将客户端加入到 socket.io 房间。在 redis.on("message", ...) 事件中,调用 io.sockets.in(room).emit("event", data) 分发给相关房间的所有客户端。比如如何在socket.io中重用redis连接?

  2. 'createClient' 一个 redis 连接。在 socket.io 客户端连接上,将客户端加入到 socket.io 房间并订阅相关的 redis 频道。在客户端连接关闭中包含 redis.on("message", ...) 并在收到消息调用 client.emit("event", data) 以在特定客户端上引发事件。就像在 socket.io 中使用 RedisStore 的示例中的答案一样

  3. 根据 socketio-spec 协议,使用 RedisStore 烘焙到 socket.io 中并从 Redis 中的单个“调度”通道“广播”。

数字 1 允许为所有客户端处理一次 Redis 子和关联事件。2 号提供了一个更直接的挂钩到 Redis 发布/订阅。数字 3 更简单,但对消息传递事件几乎没有控制。

但是,在我的测试中,所有连接的客户端都表现出出乎意料的低性能。有问题的服务器事件是尽快发布到 redis 通道的 1,000 条消息,以便尽快分发。性能是通过连接客户端的时间来衡量的(socket.io-client 基于将时间戳记录到 Redis 列表中进行分析)。

我推测在选项 1 中,服务器接收到消息,然后将其依次写入所有连接的客户端。在选项 2 中,服务器多次接收每条消息(每个客户端订阅一次)并将其写入相关客户端。在任何一种情况下,服务器都不会到达第二个消息事件,直到它与所有连接的客户端通信。随着并发性的增加,情况明显恶化。

这似乎与堆栈功能的感知智慧不一致。我想相信,但我很挣扎。

这种情况(大量消息的低延迟分布)是不是这些工具的选项(还没有?),还是我错过了一个技巧?

0 投票
2 回答
123 浏览

real-time - 可以将原始半结构化数据作为输入的实时计算解决方案有哪些?

是否有任何技术可以获取原始的半结构化、无模式大数据输入(例如来自 HDFS 或 S3),对其执行近实时计算,并生成可以查询或插入 BI 工具的输出?

如果没有,是否有人至少在努力在未来一两年发布?

0 投票
1 回答
1207 浏览

core-audio - sub-millisecond latency in Core Audio

Is it possible to play sounds with sub-millisecond latency using Core Audio?

I've tried using AudioQueues with different sizes and numbers of buffers, and I've tried using AudioUnits, but I have been unable to get below 30 ms of latency.

I am using an oscilloscope to measure the time between when a pushbutton on an Arduino is pressed and when sound leaves the audio jack. The Arduino communication never contributes more than 1 ms of delay.

0 投票
1 回答
3425 浏览

java - Java 故障转移框架/库

是否有任何框架/库来处理主动/被动故障转移?理想情况下,它应该是快速、轻量级和可嵌入的。我找到了一些,但它们不太符合标准...

0 投票
1 回答
2721 浏览

java - 在哪里可以找到 SolarFlare OpenOnLoad Kernel Bypass 的一些示例 Java 代码?

让任何人开始的简单问题:

  1. 我知道我需要一个特殊的网络接口卡 (nic) 来执行此操作。我假设它必须是SolarFlare制造的。我能得到的最便宜的可以让我实现和测试内核绕过的工具是什么?

  2. 看起来他们使用OpenOnLoad作为网络堆栈。在哪里可以找到有关如何使我的网络应用程序使用 OpenOnLoad 的示例代码和示例?我很想知道我的程序使用这项技术有多容易或多复杂。

从这里的另一个问题产生的问题:使用 Java 中的内核绕过网络

0 投票
2 回答
3003 浏览

arm - 补偿ARM中断的延迟?

我正在 STM32F4 CPU 上开发一个项目,生成信号。

我在 STM32 上的 CPU 时钟(无预分频器)上有一个通用定时器,在溢出时触发中断,之后使用 GPIO 生成周期性信号。

我需要在非常精确的时间触发 GPIO(基本上低至一个 CPU 周期精度)。我已经设法通过设置优先级和 al 将这种抖动减少到 +-5 个周期,但是这种抖动存在,具体取决于 CPU 正在做什么。

我需要补偿这几个周期的抖动。只要我在精确的时间切换 GPIO,增加几个周期的延迟就不是问题。

我的想法是读取计数器的当前值,并有一个 FIXED_NUMBER-CURRENT_VALUE 时间的活动循环,确保我会在精确的时间退出循环。

然而,在 C 中做一个简单的循环——作为一个 FOR 循环,或者一个 while(counter->value < TARGET) 不起作用,因为它增加了抖动而不是减少它。

我做错了什么/天真吗?我应该在汇编中这样做吗?这与 C 有何不同(我用 GCC 检查了反汇编以检查循环没有被优化掉,也没有达到内存?)

(我确保使用空的、未优化但未命中内存循环体)

编辑:在 AVR 上查看这个示例(我知道更稳定) 参见示例http://lucidscience.com/pro-vga%20video%20generator-7.aspx (搜索“jitter”)

edit2:我在程序集中尝试了一个简单的循环,例如(r0 是我的计数器,要等待的周期数,在寄存器中)

而且,没有它,抖动会更好。

总而言之,我已经知道我应该延迟多少。我只需要一种方法让代码分支在一个案例中可靠地消耗 N 个周期,在另一个案例中消耗 M 个周期。不幸的是,单独的分支似乎不起作用,因为管道重新填充似乎不需要可靠数量的周期,而条件表达式也不是,因为它们总是需要相同数量的周期(有时什么都不做)。

从 RAM 而不是闪存运行会提高一致性吗?(NB stm32f4 有一个闪存预取..)

0 投票
2 回答
2041 浏览

c++ - 在 C++ 中将数据从一个线程发送到另一个线程的最快方法是什么?

我尝试了一个实验,我构建了一个简单的生产者/消费者程序。它们在不同的线程中运行。生产者生成一些数据,消费者在另一个线程中获取它。我实现的消息传递延迟约为 100 纳秒。谁能告诉我这是否合理或者那里有明显更快的实现?

我没有使用锁......只是简单的内存计数器。我的实验在这里描述:

http://tradexoft.wordpress.com/2012/10/22/how-to-move-data-between-threads-in-100-nanoseconds/

基本上,消费者等待计数器增加,然后调用处理函数。所以真的没有多少代码。我仍然很惊讶它花了 100ns。

消费者看起来像这样:

生产者在有可用数据时简单地增加 w_cnt。

有更快的方法吗?

0 投票
1 回答
2396 浏览

node.js - Node.js 直播:避免缓冲

我编写了一个小型 nodeJS 服务器,它将 Windows 上 ffmpeg 捕获的系统音频(使用 DirectShow)作为流式 MP3 文件输出到浏览器。音频需要尽可能实时,最小/无缓冲,并且音频中的“跳过”效果是完全可以接受的。

当我使用 HTML5 音频标签在 Chrome 中播放音频时,在低延迟 LAN 连接上会有大约 8-10 秒的延迟。我怀疑这是客户端缓冲区,并在客户端使用了 Flash MP3 播放器,这将延迟降低到 2-3 秒。

现在,缓冲似乎发生在服务器端。NodeJS 的 response.write 的文档提到数据是写入内核缓冲区。如何完全避免任何缓冲或至少绕过它,以便客户端始终获取最新的音频数据?处理“流失”事件以始终推送实时数据的策略?

在请求对象上,我使用了 setNoDelay(true)来避免使用 Nagle 算法。以下是生成的 ffmpeg 进程发出数据时如何写入数据的片段。

0 投票
7 回答
24831 浏览

c++ - Linux 上的低延迟串行通信

我正在 Linux 上通过串行端口实现协议。该协议基于请求应答方案,因此吞吐量受限于将数据包发送到设备并获得应答所需的时间。这些设备大多基于 arm 并运行 Linux >= 3.0。我在将往返时间减少到 10 毫秒以下时遇到了麻烦(115200 波特,8 个数据位,无奇偶校验,每条消息 7 个字节)。

哪些 IO 接口会给我最低的延迟:select、poll、epoll 或使用 ioctl 手动轮询?阻塞或非阻塞 IO 会影响延迟吗?

我尝试使用 setserial 设置 low_latency 标志。但是好像没什么效果。

我还有什么可以尝试减少延迟的方法吗?由于我控制所有设备,因此甚至可以修补内核,但最好不要。

- - 编辑 - -

串行控制器使用的是 16550A。

0 投票
0 回答
94 浏览

java - Flash 中的实时优先级和实时优先级队列具有非常低的延迟?

是否可以在 Flash 中以极低的延迟级别执行实时优先级处理和排队?我们有一些相当大的数据流(它们是原始音频,可能应该使用有效的压缩算法进行压缩,这将增加极少的开销)需要在客户端主机上接收实时优先级,然后以尽可能低的低延迟流传输尽可能到接收端。这是否可以通过 Flash 执行实时极低延迟连接?

考虑到这些要求,似乎我可能不得不转向 Java 甚至 C / C#……但我希望能发现一些我尚未见过的东西。