问题标签 [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.
java - 对于所有 JVM GC 实现来说,压缩真的是不可避免的吗?
在此链接上,据说:
这些暂停是压缩堆以释放空间的必然要求的结果。收集器使用不同的策略来延迟这些事件,但是对于所有商业可用的收集器来说,压缩是不可避免的。
我的印象是,如果你保持应用程序的内存占用不变,那么就不需要发生 GC 压缩,换句话说,只有在你不断添加和收集对象时才会发生。如果您有足够大的堆和足够的可用空间,为什么在不创建任何孔(即不产生任何垃圾)时需要压缩?
我知道为 Java 应用程序保持恒定的内存占用并不容易,但使用正确的分析工具、引导程序和纪律是可能的。
那么假设 Java 应用程序可以在没有任何 GC 引入的延迟(换句话说,没有 GC 暂停)的情况下运行恒定的内存占用不是合理的吗?
编辑:通过不断的内存占用,我的意思是steady state
Ajay George 提到的,当没有更多的对象被创建或取消引用时。如果你继续创建对象,你最终会耗尽内存,如果你继续取消引用对象,你最终会触发 GC。所以最终目标是启动、预热、强制进行完整的 GC,然后进入稳定状态以进行生产时间。
java - 在 Java 中实例化对象时产生奇怪的垃圾
我正在分析垃圾行为,java.lang.String
看起来每次你在任何类中第一次实例化一个字符串时,它总是会产生垃圾。有人会知道为什么吗?
输出:
已收集:704336 已
收集:0
没关系。第一次它创建垃圾,然后后续实例化不产生垃圾。
奇怪的是,当您在超类中强制创建字符串时,它仍然会在您第一次在子类中实例化 String 时在子类中创建垃圾:
输出:
收藏:348648
知道为什么吗?
(顺便说一下,我在 MAC 和 JDK 1.6.0_37 上运行它)
EDIT1:我稍微更改了代码以明确字符串内部化不是这里的罪魁祸首,至少看起来不像。
EDIT2:如果在整个代码中将 String 更改为 Object,则会得到相同的垃圾,所以我想这与Java 中如何通过new进行对象分配有关。第一次在类中分配对象时,您会得到垃圾。第二次你没有。奇怪的是每个班级。
EDIT3:我写了一篇博客文章,其中讨论了如何强制 GC 分析您的应用程序以进行垃圾创建,就像我在上面的代码中所做的那样。
c++ - 单线程设计还是多线程设计?
所以这是我的场景:我从套接字读取并根据数据包上的内容将数据包放入适当的队列中。因此,如果我有 10 个队列,则将有 10 个 if-else-ifs 或 10 个 switch 语句案例来选择正确的队列。因此,最多可以进行 10 次比较。
另一种方法可能是要求广播器/服务器在 10 个不同的端口上广播,其中来自每个端口的馈送将包含用于单个特定队列的数据包,在我这端,我可以通过单独的线程监听每个套接字(或者我可以使用线程如果某些端口上的流量较少/不均匀,则池)。所以现在我不必选择数据包属于哪个队列,但是现在引入了conext switch的现象。
从这里开始,我的智慧和技术知识阻止了我走得更远。关于哪种方法会表现更好的任何知识?
audio - 哪些音频 API 可以支持推测性评估和校正?
推测性评估(又名推测性执行)是一种以偶尔返工(低效率)为代价实现低延迟代码的有效方法。推测评估是现代计算机体系结构的一种常见的低级技术,但它可以在更高级别的编程模型(参见时间扭曲协议、时间逻辑、反应式编程模型)中得到支持。
一个似乎推测性评估特别有用的地方是音频的实时计算,例如用于实时编码或游戏。这个想法很简单:我们可以推测性地填充音频缓冲区以防止缓冲区欠载,但如果我们必须对任何最后即时更改做出反应,则偶尔会纠正这些缓冲区。这种技术仍然可能出现故障。零散的更新可能会从前面砍掉一点。但是由于大多数推测的声音应该仍然大部分是正确的,因此与典型的欠载相比,这是一种不同的 - 并且可能更优雅的故障模式。
现在,我想知道哪些音频 API 或库最有效地支持这些对现有缓冲区的最后即时更新。我不是声音编程方面的专家,但我见过的大多数示例代码似乎都假定了对缓冲区的承诺。如果我在加载缓冲区后承诺使用缓冲区,那么别无选择,只能在延迟和欠载风险之间进行权衡。哪些音频 API 不需要承诺?
c# - 我应该尽量避免在超低延迟软件中使用“new”关键字吗?
我正在编写高频交易软件。我确实关心每一微秒。现在它是用 C# 编写的,但我很快就会迁移到 C++。
让我们考虑这样的代码
我想超低延迟的软件不应该过多地使用“new”关键字,所以我搬到actions
了一个领域:
也许我应该尽量避免使用“new”关键字?我可以使用一些预分配对象的“池”:
- 我应该走多远?
- 避免有多重要
new
? - 使用我只需要配置的预分配对象时,我会赢得什么吗?(在上面的示例中设置类型和价格)
请注意,这是超低延迟,所以让我们假设性能优于可读性、可维护性等。
php - 尽可能低的预期 HTTPS 延迟?
在我的网站上,对于特定的 AJAX 文件(UI 的症结),我的平均延迟(不备份时等)约为 150 毫秒。我通过做一些服务器端/数据库技巧将它从 ~250ms 减少了,我认为最后一个技巧可能会将它从当前的 ~30ms 的实际 PHP/MySQL 部分的总数中再降低 10ms 左右页。
我正在使用 keep-alive,所以我认为 ssl 握手或多或少已经完全退出(但我希望尽快迁移到 SPDY,所以我真的不知道在最初的握手之后这有什么帮助)。
当我 ping 时,它平均约为 55 毫秒。
我在文件的开头连接到 MySQL,并在最后关闭它。我很确定这大约需要 10 毫秒。
那么剩下的~55ms 是从哪里来的呢?
这可能看起来完全令人着迷,但这是为了快速动态分页,并且每毫秒延迟都会严重降低效果。
提前谢谢了!
google-chrome - ExtJS 4.1 MVC 应用程序中加载存储的高延迟
我目前正在努力将使用自制界面库制作的 Web 应用程序转变为标准的 ExtJS MVC 应用程序。一切正常,除了 Ajax 请求在页面启动时延迟较高。事实上,虽然我调用的文件与以前没有什么不同,但有时我必须比以前多等待 3 到 6 秒才能得到响应。
为了缩小我的调查范围,我更改了代码以返回静态数据(一个简单的 json 字符串),从而消除了数据库问题的选项。此外,我注意到在 Google Chrome(“网络”面板)中使用“Replay XHR”几乎可以立即得到响应。
我想在这个话题上很难提供帮助,但希望有人已经遇到过这种问题,并且可以分享一些关于在哪里调查的建议。
观察
按延迟排序的请求(间隔约为 500 毫秒):
按开始时间排序的请求:
c# - 将具有大量“锁”的代码重构为更多无锁代码
Upd感谢 Matthew Watson 注意到并注意到我计划将我的代码移植到 c++-linux,所以我更喜欢“平台无关”的代码
我的交易应用程序几乎是无锁的。下面的代码是我唯一使用锁的地方。让我从代码开始,它很长,但不要担心有很多重复的部分,所以它很简单。我更喜欢添加所有“重复”部分,以更好地展示我的工作方式:
在我的代码中,我有两个阶段。Stage1
是更新阶段,Stage2
是工作阶段。我需要尽快在这两个阶段之间切换,如下所示:
- 任何更新?不
- 任何更新?不
- 有更新吗?是的,订单已更新!应用更新,做
Stage2
- 任何更新?不
- 任何更新?是的,订单需要注册!应用更新,做
Stage2
- 任何更新?是的,交易发生了,应用更新,做
Stage2
我Stage2
不应该更新,但应该继续“收集”更新,以便以后应用它们。
重要的是 - 这是对延迟非常关键的代码,所以我同意“花费”一个核心来获得最小的延迟!因此,当发生任何更新时,我需要尽快处理并执行Stage2
。
所以我希望现在很清楚我需要实现什么,并且很清楚我是如何实现的。现在是时候讨论我的代码有多好了。我确实看到了几个潜在的问题:
- 很多锁!可以用一些“无锁”代码代替吗?自旋锁与 CAS 什么的?
- 占用100%的CPU核心,可以在不影响延迟的情况下节省一些CPU资源吗?
- 我可以/应该告诉 .NET 使用“专用”核心(设置任务关联?)以避免额外的“切换”吗?
- 我从一个线程添加到队列,然后从另一个线程读取队列。会不会是个问题?如果添加和读取队列是易变的?我的阅读线程是否有可能因为缓存更新问题而看不到队列中的更新?
欢迎任何关于如何改进我所写内容的建议,谢谢!
upd部分解决了 - 据我了解,我最好将查询替换为无锁(可能基于环形缓冲区?)查询。我想我稍后会使用 c++ 版本的中断器。我也使用了这篇文章http://www.umbraworks.net/bl0g/rebuildall/2010/03/08/Running_NET_threads_on_selected_processor_cores并用在“固定”核心上运行的线程替换了任务,但是我仍在使用“忙-spin”,也许我应该使用更聪明的东西?
java - Tomcat 零星延迟
我一直在对 Tomcat 上的页面响应时间进行微优化,并且在几乎所有情况下,如果我一遍又一遍地刷新,我会看到50 毫秒的响应时间,但如果页面在一两秒内没有被点击,响应时间就会回升到500 毫秒。
无论本地,不是本地,APR,NIO,JIO,静态或动态响应(即提供静态文件或动态处理响应),我都看到了相同的行为。到目前为止,我还没有看到这种行为在 Tomcat 上没有发生(无论频率如何,它都是一致的低于 400 毫秒)。
我也使用 Visual VM 来查看是否有任何线索。
我认为这是某种保持活力,但是当我运行 Apache Bench 时,我得到了更快的响应时间(低于 50 毫秒)(显然是因为它经常点击它)。
那么如何在 Tomcat 中保持低延迟不经常点击的 URL?也许这个问题更适合ServerFault?
更新:我几乎肯定它是 Tomcat 6 的问题。我以为我已经在 Tomcat 7 上进行了测试,但我只是再次对其进行了测试并且没有问题(请参见下面的结果)。即使是最新的 Tomcat 6 仍然存在这个问题。
这是ab
Tomcat 6 的输出(注意最大值):
这是ab
Tomcat 7 的输出,请注意最大值:
Tomcat 版本是唯一的区别(相同的机器、相同的 JDK 等)。我确信最新的 Tomcat 6 会很好,但它在第一次请求时有类似的延迟。
c# - 我应该对“延迟关键”线程使用线程亲和性吗?
在我的 HFT 交易应用程序中,我有几个地方可以从网络接收数据。在大多数情况下,这只是一个只接收和处理数据的线程。以下是此类处理的一部分:
该线程一旦创建就永远有效。我只是想知道我是否应该将此线程配置为在某些核心上运行?由于我需要最低延迟,我想避免上下文切换。由于我想避免上下文切换,我最好在同一个处理器内核上运行同一个线程,对吧?
考虑到我需要最低延迟是正确的:
- 为大部分“长时间运行”线程设置“线程亲和力”会更好吗?
- 从上面的示例中为线程设置“线程亲和力”会更好吗?
如果这很重要,我现在将上面的代码重写为 c++,以便稍后移植到 Linux,但是我认为我的问题更多是关于硬件而不是语言或操作系统。