总览

以前,我写过一篇有关Java之类的C的文章。 这是我以前遇到的术语。 但是,经过思考,我认为像Java这样的C ++是一个更好的术语,因为您仍在使用OOP做法(不是C风格的),但是您需要自己进行更多的工作来管理和回收内存。

我现在支持的术语是“低级” Java编程。

低延迟和“自然” Java

许多低延迟系统仍使用我称为自然Java的程序进行编程。 在大多数情况下,这是最简单,最有效的方法。 当您具有大堆大小和低延迟要求时,这些问题才真正开始,因为它们不能很好地协同工作。

如果您有一个已建立的程序,并且重写是不合理的,则需要Zing之类的东西,它具有真正的并发收集器。 尽管您可能会看到1-4 ms的最严重的停顿,这与非实时系统一样好。 有传言说RedHat会生成并发收集器,但是正如Oracle在G1中发现的那样,编写有效的低延迟非常困难。 G1工作正常,只是不适合低延迟交易(例如,暂停时间为1毫秒),我不确定是否会如此。

如果可以重写关键组件,尤其是出于性能以外的原因而正在考虑这样做的话,则可以显着提高性能,但是可以使用更像C ++或C的低级编程。语言是指您正在使用与那些语言相同的技巧,并且已经使用了很长时间,但是使用Java。

为什么用Java进行低级编程?

主要原因是集成和易于支持。 低级Java与自然Java代码非常干净地集成在一起。 所有的Java工具都可以很好地使用它,并且它仍然是跨平台的(至少是跨OS的)。某些底层技术是JVM特定的,例如它们可以在OpenJDK / HotSpot上工作,但不能在IBM的JVM上工作,反之亦然。 他们可能会起作用,但许多都无济于事。 例如,在HotSpot上使用不安全可以更快,但在Android上则明显慢。

低级Java编程的另一个好处是,经验丰富的Java开发人员发现使用它相对容易。 他们可能会发现很难从头开始编写,但是如果使用隐藏更多细节的库,则可以有效地使用它。

低级Java有哪些注意事项?

延迟目标

除非您在99.9%的时间内运行时间少于1毫秒,否则您现在可以认为1毫秒的延迟不是那么快。 Java中最快的系统通常约为100微秒,甚至低于包装箱外部的20微秒。

如何处理高吞吐量

对于交易系统,我建议您将等待时间尽可能短,并且吞吐量通常足够。 例如,编年史可以以一个线程的持续速率以最大爆发次数持续完整的Opera提要。 这是可能的,因为编年史的潜伏期很短。 一条很小的4字节消息的平均延迟为7纳秒。 即使JVM在下一行崩溃时,它也将保留。 在这一点上吞吐量不是一个问题。

对于反向测试,低延迟是不够的。 这是因为您想要做的是在不到一秒钟的时间内(理想情况下)重播数月的数据。 在这种情况下,您需要高度的并行性以及能够在短时间内重播大量数据的能力。 为此,我使用了内存映射文件,这些文件具有对所需数据的预装查询。 如果这些文件为二进制格式并适合主内存,则可以非常快速地跨线程重复访问它们。

处理GC。

垃圾收集暂停会使您减速,因此最快的方法是构建引擎是不使用休息时间。 相反,您给自己一个预算,这是您可以合理拥有的最大伊甸园大小。 这可能是24 GB的Eden。 如果您花了一整天的时间来填满,一天之内就不会收集,即使是次要的收集也是如此。 假设您可以在晚上或周末停下来几秒钟,则可以在预定时间执行完全GC,而GC不再是问题。

即使这样,我还是建议尽量减少垃圾并本地化内存访问模式以最大化L1 / L2效率,这可以导致性能提高2-5倍。 L3缓存至少比L1慢10倍,并且如果您不给L1填充垃圾(正如许多Java程序一样),您的程序将更快,更一致地运行。

将共享内存用于IPC

这有两个优点。

  1. 您可以保留所有事件的记录,以及整天的时间安排和微不足道的开销。 因为您可以保留更多数据,所以可以在外部,下游或重现错误来重现系统的确切状态。 这为您提供了基于数据驱动的海量测试,您可以通过测试系统实时提供生产数据,以查看ti在实时运行之前的行为。
  2. 实际上,它可能比其他方法快得多。 一条微小的消息平均可以写入7纳秒的延迟,并且在不到100纳秒的时间内对另一个进程可见。

固定芯

许多人已经尝试过固定核心,但并没有太大的区别。 这可能是由于a)应用程序的抖动过大,几乎没有关系,或者b)然后没有固定到隔离的内核。 我发现如果绑定到隔离的内核,最坏情况的延迟会从2毫秒下降到10微秒,但固定到非隔离的内核似乎根本没有帮助。

忙碌中

您不希望关键线程进行上下文切换,而避免这种情况的一种方法是永不放弃内核或CPU。 这可以通过在固定的隔离内核上忙于等待来完成。 我要做的一件事是使用隔离的核心
a)对最关键的线程有选择地禁用超线程,而其余的则保留。
b)通过不对“垃圾”内核进行超频来更多地对隔离内核进行超频。 通过限制不需要最大速度的磁芯产生的热量,可以达到这一目的。 例如,假设您有一个十六进制内核,则不让内核0,2,4保持超频,而超频内核1,3,5则不使用HT,比整个插槽多使用10%。 我认为超频内核在芯片上并不相邻,因此它们不太可能过热。

更大的地址空间集合

Chronicle和OpenHFT的直接存储的主要功能是它们允许访问64位大小。 (由于OS / CPU的限制,技术上只能使用48位)这意味着您可以将TB大小的数据集作为一个集合进行管理,而该集合具有Java内存中本来就有数十亿条记录/节选。 这样甚至可以避免JNI障碍或系统调用来降低应用程序速度。

结论

如果您的应用程序将其90%的时间用在其代码的10%或80/20中,则可以使用“自然” Java编写90%的代码,或者使用第三方库。 但是,如果您用低级Java编写10%的代码,则可以显着提高性能。

参考: Vanilla Java博客上的JCG合作伙伴 Peter Lawrey提供了Java 等C ++的低延迟特性。

翻译自: https://www.javacodegeeks.com/2013/07/c-like-java-for-low-latency.html

像Java这样的C ++具有低延迟相关推荐

  1. java低延迟_像Java这样的C ++具有低延迟

    java低延迟 总览 以前,我写过一篇有关Java之类的C的文章. 这是我以前遇到的术语. 但是,经过思考,我认为像Java这样的C ++是一个更好的术语,因为您仍在使用OOP惯例(不是C惯例),但是 ...

  2. 理解Java虚拟机(七)低延迟垃圾收集器-Shenandoah

      本系列均是周志明老师<深入理解Java虚拟机>第三版的学习笔记.   垃圾收集器有三项最重要的指标:内存占用(Footprint).吞吐量(Throughput)和延迟(Latency ...

  3. 周志明:深入java虚拟机_虚拟面板:在低延迟环境中使用Java

    周志明:深入java虚拟机 Java越来越多地用于低延迟工作,而以前的C和C ++早已成为Java的实际选择. InfoQ聚集了该领域的四位专家,讨论了驱动趋势的因素以及在这种情况下使用Java的一些 ...

  4. 低延迟垃圾回收器ZGC

    1 低延迟高可用Java服务的痛点 对于低延迟和高可用的Java服务,GC停顿一直是它们的痛点. 例如一个服务,被要求在100ms内要返回结果,服务可用性要求为99.99%.假设服务收到的请求速率稳定 ...

  5. 高吞吐、低延迟 Java 应用的 GC 优化实践

    2019独角兽企业重金招聘Python工程师标准>>> 背景 高性能应用构成了现代网络的支柱.LinkedIn 内部有许多高吞吐量服务来满足每秒成千上万的用户请求.为了获得最佳的用户 ...

  6. java fix_Java中的低延迟FIX引擎

    java fix 总览 Chronicle FIX是我们的Low Latency FIX引擎和Java数据库. 是什么使它与众不同? 是为Java中的超低GC *设计的. 支持字符串和日期时间的方式可 ...

  7. Java中的低延迟FIX引擎

    总览 Chronicle FIX是我们的Low Latency FIX引擎和Java数据库. 是什么使它与众不同? 是为Java中的超低GC *设计的. 支持字符串和日期时间的方式可以最大程度地减少垃 ...

  8. Java Lambdas和低延迟

    总览 有关在Java和低延迟中使用Lambda的主要问题是: 它们会产生垃圾吗,您能做些什么吗? 背景 我正在开发一个支持不同有线协议的库. 这样的想法是,您可以描述要写入/读取的数据,并且有线协议确 ...

  9. 高吞吐低延迟Java应用的垃圾回收优化

    高吞吐低延迟Java应用的垃圾回收优化 高性能应用构成了现代网络的支柱.LinkedIn有许多内部高吞吐量服务来满足每秒数千次的用户请求.要优化用户体验,低延迟地响应这些请求非常重要. 比如说,用户经 ...

最新文章

  1. 2022-2028年中国马铃薯市场研究及前瞻分析报告
  2. 精心为你准备的最全的20道Mysql面试题。
  3. JSP页面中四种“返回按钮”的使用
  4. [HDU] 2612 Find a way - 用单源最短论经模拟的简单广搜
  5. css中 media的用法,如何在css中正确使用@media
  6. php数据库表怎么删除,php删除数据库表的方法
  7. 彻底理解Python中的yield
  8. python字典计数_Python下封装个好用计数字典包
  9. java.util.zip.zipexception_android-如何解决java.util.zip.ZipException?
  10. 2019年10月数据库流行度排行:国产数据库鲲鹏正举 PostgreSQL同比增幅第一
  11. xml注册使用menu
  12. UNI-APP前后端实战课《悦读》
  13. C语言画直线~Bresenham方法
  14. Excel 筛选 多表查找
  15. 一个初中生到程序员的辛酸经历
  16. Arduino驱动LED128X64 - U8g2 自定义中文字库
  17. 计算机科学发的论文不能检索,中南大学研究生发表论文的规定
  18. 多个excel表格合并一键操作
  19. OLED上播放动图的一种笨方法
  20. 怎么在windows传文件到阿里云服务器

热门文章

  1. (转)漫画:什么是分布式事务?
  2. netsuite 数据集成_Java中带有NetSuite数据实体的对象关系映射(ORM)
  3. 第三方工具监控java进程_前9个免费的Java进程监视工具以及如何选择一种
  4. 队列和消息队列_消息队列概述[幻灯片]
  5. java ee的小程序_用微服务和容器替换旧版Java EE应用程序服务器
  6. java中精确地小数_在Java等于方法中进行精确比较
  7. 通过Spring集成进行消息处理
  8. 数据的gzip压缩解压缩_使用GZIP和压缩数据
  9. Log4j Bug –减慢您的应用程序
  10. Spring Boot集成测试中@ContextConfiguration和@SpringApplicationConfiguration之间的区别