问题标签 [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 投票
5 回答
1730 浏览

c++ - 标记int unsigned的编译器优化?

对于从不期望采用 -ve 值的整数,可以是 unsigned int 或 int。从编译器的角度或纯 cpu 周期的角度来看, x86_64 有什么区别吗?

0 投票
1 回答
724 浏览

android - Android:录制音频流并检索延迟信息

  1. 我想编写简单的测试程序来记录来自输入插孔(麦克风?)的音频流。
  2. 我必须计算音频延迟信息并显示它。

我必须使用 NDK 还是 SDK?是否存在为我执行此操作的简单源代码?

最后,我该如何开始写呢?

0 投票
4 回答
5940 浏览

java - Java TCP/IP 套接字性能问题

我们的应用程序通过 Java 中的 TCP/IP 套接字非常快速地读取数据。我们正在使用带有非阻塞套接字和选择器的 NIO 库来指示已准备好读取。平均而言,读取和处理读取数据的总处理时间为亚毫秒。然而,我们经常看到 10-20 毫秒的峰值。(在 Linux 上运行)。

使用tcpdump我们可以看到 tcpdump 读取 2 条离散消息之间的时间差,并将其与我们的应用程序时间进行比较。我们看到tcpdump似乎没有延迟,而应用程序可以显示 20 毫秒。

我们很确定这不是 GC,因为 GC 日志显示几乎没有 Full GC,并且在 JDK 6(据我了解)中,默认 GC 是并行的,所以它不应该暂停应用程序线程(除非执行 Full GC) .

看起来 Java 的Selector.select(0)方法返回读取就绪状态似乎有一些延迟,因为在 TCP 层,数据已经可供读取(并且tcpdump正在读取它)。

附加信息:在峰值负载时,我们平均每条消息处理约 6,000 x 150 字节,或每秒约 900 MB。

0 投票
1 回答
2802 浏览

c# - TCP/IP Windows 7 环回适配器上的数据包延迟问题(或软件中的错误?)

我们有一个客户端和服务器应用程序当前在同一台 Windows 7 64 位机器上进行测试。它们都是用 C# 编写的,并使用 P/Invoke 调用 Winsock2 库。

该应用程序总体上运行良好,没有任何错误。tcp/ip 上每个“跳跃”的延迟平均约为 350 微秒。

但是,有时在接收数据包之前会有超过 40 到 50 毫秒的非常长的延迟,然后突然它们都会到达。

迄今为止的诊断工作:

  1. 在接收数据的这些延迟期间,服务器继续记录它正在发送数据包。它设置为每 1 毫秒发送一次测试数据包,它会在 15 或 20 毫秒内发送一次测试数据包,有时会在客户端收到任何测试数据包之前长达 50 毫秒。

  2. tcpdump 用于嗅探环回适配器上的数据包,并显示在此延迟期间,像往常一样有从服务器端口 (6488) 到客户端端口 (61743) 的流量。

  3. 客户端在循环中调用 select() winsock2 调用,因此在 select() 调用之前通过计数器记录表明它具有正确的文件描述符。当然,这在延迟前后都可以正常工作。

  4. 在 select() 调用之后立即进一步记录显示 fd 不存在——这意味着对套接字的读取将阻塞。但是,在没有任何延迟的传输期间,日志显示它按预期工作,因此 select() 返回套接字的 fd 以进行非阻塞读取。

简而言之,环回适配器似乎将这些数据包保存在某个地方很长一段时间,然后才最终将它们传送到接收端。

任何进一步的想法或解决方案?

一些想法是它经常声称重叠 I/O 在 Windows 上工作得更好,但如果你需要监听超过 64 个套接字,这似乎只对可伸缩性很重要。

是不是切换到重叠可以解决问题?我们希望避免,因为这会增加项目期限和预算。这应该适用于 select() 就好了。

此外,Windows中处理环回的进程或线程是否可以进行上下文切换或其他什么,如果是这样,是否有办法对其进行配置以避免这些延迟?

Edit: The correct answer was to ensure that the Nagle algorithm was disabled. We thought it was disabled but that's where the bug was found--in our in-house implementation of SetSocketOption() we used GetSocketOption() to verify. So it turns out you must set NoDelay prior to connecting or binding a socket or else it silently fails to have any effect.

Many thanks to Fun Mun Pieng for the correct answer!!!

0 投票
1 回答
1920 浏览

iis - 如何减少 Live Smooth Streaming 会议解决方案中的延迟?

我正在使用 Expression Encoder SDK 对我的网络摄像头的实时记录进行编码,将其发布到支持 IIS 7.5 和媒体服务 4 的 Web 服务器,并使用 SmoothStreamingClient 查看它。

但是,由于我的目标是实时会议解决方案,因此我需要大幅减少本地预览和远程回放之间的 20 秒延迟。

我在某些地方读到可以配置实时平滑流式传输以获得 2 秒的延迟,但是,我还没有找到任何教程解释如何配置这样的解决方案,包括编码、提供和消费方。

这是我用来编码捕获的视频的代码:

有什么我可以添加到这段代码中来产生更低延迟的东西吗?如果没有,我可以在哪里配置 Smooth Streaming 应该提供的所谓的“低延迟支持”?

提前致谢!

0 投票
2 回答
728 浏览

.net - 使用 .NET Framework 模拟网络延迟

微软是否提供任何模拟.net 延迟的方法?他们确实为 XNA 提供了它,但我在 .net 框架中找不到它

http://msdn.microsoft.com/en-us/library/bb975762.aspx

0 投票
1 回答
606 浏览

linux - 比较不同机器之间的时间戳

我正在工作的环境涉及LAN 上的多台机器 (Linux) 处理链中的数据。我想以某种方式为事物加上时间戳,以便我可以看到每个节点何时接收/发送它,以便稍后比较整个链的时间戳。这是一个低延迟系统。

我想了解将不同机器上的时间戳与 resulution 微秒进行比较是否可行。人们通常使用什么样的服务来同步时钟以及可以期待什么样的分辨率?时钟漂移和其他事情呢?

例如,N 个节点都需要在秒/毫秒/微秒上同步时钟,这可能吗,需要什么以及开销是多少?

当然,我希望它尽可能不干扰网络和处理时间。;-)

我是在完全看不可能的事情还是可以做到这一点?

期待阅读您的答案!谢谢!

0 投票
1 回答
241 浏览

architecture - 向 10,000 个用户推送接收到的实时提要数据?

我正在对我正在从事的一个需要低延迟和高并发性的新项目进行一些指导。该项目涉及从第三方提要接收实时数据,并在进行一些基本处理和存储后,将这些值发送给当前在网站上活跃的所有用户。

数据通过 HTTP Push 到达,我目前的计划是使用 Node.js 接收这些数据,然后通过算法运行数据,然后更新某种数据库中的相关数据。最后,更新通过 websocket 发送给网站的所有连接用户。

现在,我正在尝试让这种可扩展的方式一次处理超过 10,000 个连接的用户,所有用户都通过 websocket 连接,并且大约每 3 秒发送一次更新。鉴于在此期间每个用户都可以与 Web 应用程序交互,这将导致许多来回请求。

现在,除了我拥有的高级基本想法之外,决定让 Ruby on Rails 作为网站框架和节点 js 来处理这一切的“活跃性”——我有点卡住了。我不知道要使用哪种数据库(我想它将是一个用于快速存储的非关系数据库),我不知道如何构建这样一个设置的细节,以及如何实现逻辑.

所以我的问题是:考虑到我的目标,我该如何构建这样的应用程序?我需要知道什么才能使其可扩展和实时达到我想要的水平?

非常感谢您的帮助。

0 投票
5 回答
5617 浏览

java - Java TCP/IP 套接字延迟 - 停留在 50 微秒(微秒)?(用于Java IPC)

我们一直在分析和分析我们的应用程序以尽可能减少延迟。我们的应用程序由 3 个独立的 Java 进程组成,它们都运行在同一台服务器上,它们通过 TCP/IP 套接字相互传递消息。

我们已将第一个组件的处理时间减少到 25 μs,但我们看到 TCP/IP 套接字写入(在 localhost 上)到下一个组件总是需要大约 50 μs。我们看到另一种异常行为,即接受连接的组件可以更快地写入(即 < 50 μs)。目前,所有组件的运行时间均小于 100 μs,套接字通信除外。

不是 TCP/IP 专家,我不知道可以做些什么来加快速度。Unix 域套接字会更快吗?内存映射文件?还有哪些其他机制可能是将数据从一个 Java 进程传递到另一个进程的更快方法?

2011 年 6 月 21 日更新 我们创建了 2 个基准测试应用程序,一个使用 Java,一个使用 C++ 来更严格地对 TCP/IP 进行基准测试并进行比较。Java 应用程序使用 NIO(阻塞模式),而 C++ 使用 Boost ASIO tcp 库。结果或多或少相当,C++ 应用程序比 Java 快约 4 μs(但在其中一项测试中,Java 击败了 C++)。此外,两个版本在每条消息的时间上都显示出很大的变化。

我认为我们同意共享内存实现将是最快的基本结论。(尽管我们也想评估 Informatica 产品,但前提是它符合预算。)

0 投票
3 回答
2387 浏览

java - 低延迟网络技术和灵丹妙药

在对低延迟网络进行了一些基本的谷歌搜索之后,我提出了以下程序员和系统设计人员在着手进行低延迟网络时应该考虑的事项列表:

  1. 硬件、系统和协议的设计必须一起考虑

  2. 使用UDP代替TCP开发协议并实现简单的ack-nak,在应用层重发逻辑

  3. 减少消耗和打包数据的进程或线程的上下文切换次数(最好为零)

  4. 使用操作系统的最佳选择器(select、kqueue、epoll 等)

  5. 使用具有大量板载缓冲区 (fifo) 的优质 NIC 和交换机

  6. 使用多个 NIC,专门用于下游和上游数据流

  7. 减少其他设备或软件生成的 IRQ 数量(简而言之,如果不需要它们,请删除它们)

  8. 减少互斥量和条件的使用。而是尽可能使用无锁编程技术。利用架构的 CAS 功能。(无锁容器

  9. 考虑单线程而不是多线程设计 - 上下文切换非常昂贵。

  10. 了解并正确利用架构的缓存系统(L1/L2、RAM 等)

  11. 更喜欢完全控制内存管理,而不是委托给垃圾收集器

  12. 使用质量好的电缆,电缆尽可能的短,减少扭曲和卷曲的次数

我的问题:我想知道其他 SOers 认为在开始低延迟网络时还有哪些重要的事情。

随意批评以上任何一点