[英]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。
題
我們沒有使用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.