2015-05-08 22 views
7

Server EnvironmentJava TCP/IP Socket ottimizzazione delle prestazioni in scrittura

Linux/RedHat 
6 cores 
Java 7/8 

A proposito di applicazione:

Stiamo lavorando sullo sviluppo di una bassa latenza (7-8 ms) piattaforma di trading ad alta velocità utilizzando Giava. gli ordini con tappe vengono inviate dopo algo condizioni sono soddisfatte

Problema

gli ordini per lo scambio utilizzando il protocollo TCP/IP java.net.Socket API (utilizzando java.io.OutputStream.write(bytes[] arg0)). La misurazione del profiler è record come 5-7 microsec, che è molto alto come da nostre richieste di bassa latenza. Non ci serviamo di api setPerformancePreferences() come suggerito in una delle domande pubblicate in stacktrace.

Domanda

  1. alternative alla java.net.Socket per ridurre il tempo di trasmissione presa ?
  2. Eventuali tecniche di ottimizzazione per migliorare le prestazioni
  3. is setPerformancePreferences() è di qualche utilità?

risposta

5

Non siamo fatti uso di setPerformancePreferences() API

Non fare nulla e non ha mai. Non me ne preoccuperei.

Qualche alternativa a java.net.Socket per ridurre il tempo di trasmissione del socket?

Il problema non è certamente un software. È possibile ottenere < 8 micro-secondi da Java a Java su macchine diverse, ma sono necessarie schede di rete a bassa latenza come Solarflare o Mellanox.

Se si desidera una rapida elaborazione si dovrebbe prendere in considerazione sia un processore Haswell alta GHz, possibilmente sopra con clock a 4.2 o 4.5 GHz o un dual socket Xeon Haswell. Il costo di questi rispetto al costo del trading non è elevato.

Eventuali tecniche di ottimizzazione per migliorare le prestazioni

Uso cioè ByteBuffers non bloccanti NIO e attesa occupato sulle connessioni socket. (Non userei i Selectors perché aggiungono un po 'di overhead) Spegnerei nagle.

Per alcuni micro-tuning, utilizzare un'affinità vincolato filo su una CPU isolato.

is setPerformancePreferences() è di qualche utilità?

Guardando alla fonte .. Ti lascerò essere il giudice.

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

Java 7/8

In termini di quale versione usare, vorrei iniziare con Java 8 come è molto migliorata analisi di fuga che può ridurre immondizia di brevi oggetti vissuti e quindi aiuta a ridurre la latenza tra GC e jitter dai GC.

0

Un paio di cose vengono in mente:

JNI: JNI permette di scrivere codice C che si è svolta dal codice Java. Parti critiche del codice Java in esecuzione possono essere migrate in C/C++ per migliorare le prestazioni. Sarebbe necessario un lavoro per identificare prima quali sono quei punti critici e se vale la pena di spostarlo in C/C++.

Java Unsafe: Vuoi diventare pericoloso? Usa Java Unsafe per bypassare quel fastidioso GC. Here è più informazioni su di esso. Su Github puoi trovare un codice di wrapper interessante per usare in modo più sicuro Java Unsafe. Here is one.More info.

LMAX Disruptor: Ulteriori informazioni su di esso here. Questa azienda sta anche costruendo un sistema di trading veloce in Java. Disruptor consente una comunicazione inter-thread più veloce.

Scrutinizzazione di codice: esaminare il codice guardando il codice byte. Ho fatto questo per un videogioco che ho realizzato ed è stato in grado di ottimizzare il codice. Avrai bisogno di un buon strumento per trasformare i tuoi file di classe in bytecode leggibile. THis might be the tool i used.

Garbage collection migliorata: Hai provato a utilizzare lo G1 garbage collector? O scherzare con lo older GC's?

Highscalability: questo sito è pieno di buone informazioni su come rendere veloce il codice. Here is an example that might help.

New API Non so esattamente come utilizzare la nuova API, ma è venuto fuori in articoli che ho letto. Here is another article on it. Potrebbe essere necessario usarlo tramite JNI.