簡體   English   中英

Java TCP / IP套接字寫入性能優化

[英]Java TCP/IP Socket write performance optimization

服務器環境

Linux/RedHat
6 cores
Java 7/8

關於申請:

我們正在使用Java開發低延遲(7-8 ms)的高速交易平台。 滿足算法條件后發送多腿訂單

問題

使用TCP / IP java.net.Socket API(使用java.io.OutputStream.write(bytes[] arg0) )進行交換的命令。 Profiler的測量記錄為5-7微秒,根據我們的低延遲要求非常高。 堆棧跟蹤中發布的問題之一未建議我們使用setPerformancePreferences()API。

  1. 是否可以使用java.net.Socket的替代方法來減少套接字傳輸時間?
  2. 任何提高性能的優化技術
  3. setPerformancePreferences()有什么用嗎?

我們沒有使用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開始,因為Java 8改進了轉義分析,可以減少短期對象的垃圾,從而幫助減少GC之間的等待時間和GC的抖動。

我想到了幾件事:

JNI :JNI允許您編寫從Java代碼運行的C代碼。 可以將運行緩慢的Java代碼的關鍵部分遷移到C / C ++,以提高性能。 首先需要確定這些關鍵點是什么,以及是否有必要努力將其轉移到C / C ++。

Java不安全 :想變得危險嗎? 使用Java Unsafe繞過該討厭的GC。 是更多信息。 在Github上,您可能會發現一些很酷的包裝器代碼,可以更安全地使用Java Unsafe。 這是一個。 更多信息。

LMAX Disruptor在此處了解更多信息。 該公司還在用Java構建快速交易系統。 Disruptor允許更快的線程間通信。

字節碼檢查:通過查看字節碼來檢查代碼。 我已經為制作的視頻游戲完成了此任務,並且能夠簡化代碼。 您需要一個很好的工具將您的類文件轉換為可讀的字節碼。 這可能是我使用的工具。

改進的垃圾收集:您是否嘗試過使用G1垃圾收集器 還是搞混了舊版GC

高度可擴展性 :該站點上有很多有關使代碼快速運行的良好信息。 這是一個可能有幫助的示例。

新API我不確切知道如何使用新API,但是我已閱讀的文章中已經提到了它。 這是另一篇文章。 您可能需要通過JNI使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM