【问题标题】:Java TCP/IP Socket write performance optimizationJava TCP/IP Socket 写入性能优化
【发布时间】:2015-07-19 09:20:14
【问题描述】:

服务器环境

Linux/RedHat
6 cores
Java 7/8

关于申请:

我们正在使用 Java 开发一个低延迟(7-8 毫秒)的高速交易平台。满足算法条件后发送多腿订单

问题

使用 TCP/IP java.net.Socket API (使用 java.io.OutputStream.write(bytes[] arg0) )向交易所发送订单。 Profiler 测量记录为 5-7 微秒,根据我们的低延迟要求,这非常高。我们没有按照 stacktrace 中发布的问题之一的建议使用 setPerformancePreferences() api。

问题

  1. java.net.Socket 的任何替代方案以减少套接字 传输时间?
  2. 任何提高性能的优化技术
  3. setPerformancePreferences() 有用吗?

【问题讨论】:

    标签: java performance tcp socket.io low-latency


    【解决方案1】:

    我们没有使用 setPerformancePreferences() api

    它什么也没做,也从来没有。我不会担心的。

    java.net.Socket 的任何替代方案来减少套接字传输时间?

    问题肯定不是软件问题。您可以在不同的机器上从 Java 到 Java 的时间小于 8 微秒,但您需要像 Solarflare 或 Mellanox 这样的低延迟网卡。

    如果您想要快速处理,您应该考虑使用高 GHz haswell 处理器(可能超频至 4.2 或 4.5 GHz)或双插槽 Haswell Xeon。与交易成本相比,这些成本并不高。

    任何提高性能的优化技术

    使用非阻塞 NIO 即 ByteBuffers 并忙于等待套接字连接。 (我不会使用选择器,因为它们会增加很多开销)我会关闭 nagle。

    对于一些微调,在隔离的 cpu 上使用亲和绑定线程。

    setPerformancePreferences() 有用吗?

    看源码..我让你来评判。

    public void setPerformancePreferences(int connectionTime,
                                          int latency,
                                          int bandwidth)
    {
        /* Not implemented yet */
    }
    

    Java 7/8

    关于使用哪个版本,我会从 Java 8 开始,因为它有很大改进的逃逸分析,可以减少短期对象的垃圾,从而有助于减少 GC 之间的延迟和来自 GC 的抖动。

    【讨论】:

      【解决方案2】:

      我想到了几件事:

      JNI:JNI 允许您编写从 Java 代码运行的 C 代码。运行缓慢的 Java 代码的关键部分可以迁移到 C/C++ 以提高性能。需要首先确定这些关键点是什么,以及是否值得努力将其迁移到 C/C++。

      Java Unsafe: 想变得危险吗?使用 Java Unsafe 绕过讨厌的 GC。 Here 是关于它的更多信息。在 Github 上,您可能会发现一些很酷的包装器代码来更安全地使用 Java Unsafe。 Here is one.More info.

      LMAX Disruptor:阅读更多关于它的信息here。这家公司还在用 Java 构建一个快速交易系统。 Disruptor 允许更快的线程间通信。

      字节码审查:通过查看字节码来检查您的代码。我已经为自己制作的视频游戏做到了这一点,并且能够简化代码。您需要一个很好的工具来将您的类文件转换为可读的字节码。 THis might be the tool i used.

      改进的垃圾收集:您是否尝试过使用G1 garbage collector?还是在older GC's 上乱搞?

      Highscalability: 这个网站有很多关于快速编写代码的好信息。 Here is an example that might help.

      New API我不知道如何使用New API,但在我阅读的文章中出现过。 Here is another article on it. 你可能需要通过 JNI 来使用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-24
        • 1970-01-01
        • 1970-01-01
        • 2018-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多