2012-02-09 2 views
6

Ho un'applicazione client/server scritto in delphiXe2 utilizzando Indy TIdTCPServer e TIdTCPClient che comunica con l'altro sullo stesso computer utilizzando l'indirizzo 127.0.0.1 TCPQual è il massimo di dati/trasferimento velocità tra 2 applicazioni sullo stesso computer

Quando uso circa 1 mega al secondo (8 Megabit) di dati, tutto funziona correttamente.

Tuttavia, quando si impostano i miei dati a una velocità maggiore come 20megs/sec (160 Megabit), rallentano e iniziano a comportarsi in modo strano.

È un comportamento normale per quella velocità? Anche io non riesco a trovare alcun punto di riferimento o informazioni su quale sia la massima velocità di trasferimento dati tra 2 applicazioni locali.

saluti

+0

BTW, come stai misurando la larghezza di banda? Stai contando i byte mentre li invii o li ricevi? – Misha

risposta

4

eseguire un test di larghezza di banda. Questo è quello che uso (ho allegato il server e il codice client pertinenti). FWIW, ottengo il massimo di 500 Mbps, anche se non è possibile elaborare rapidamente i dati.

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); 
var 
    lData: TByteDynArray; 
    lCaption: string; 
    lMbps: Real; 
    lLen: Integer; 
begin 
    AContext.Connection.IoHandler.CheckForDataOnSource; 
    SetLength(lData, 0); 
    AContext.Connection.IoHandler.InputBuffer.ExtractToBytes(TIdBytes(lData), 
            AContext.Connection.IoHandler.InputBuffer.Size); 
    lLen := Length(lData); 
    if lLen > 0 then begin 
    if FStartTime = 0 then begin 
     Memo1.Lines.Add(FormatDateTime('dd/mm/yyyy hh:nn:ss.zzz', CsiNow) +': Started test'); 
     FStartTime := CsiNow; 
    end; 
    Inc(FBytesReceived, lLen); 
    lCaption := 'MBits Received: ' + CsiPadFloat(FBytesReceived * 1.0/125000, 3, 1); 
    if lCaption <> FLastCaption then begin 
     Label1.Caption := lCaption; 
     FLastCaption := lCaption; 
    end; 
    if FBytesReceived >= 12500000 then begin 
     FStopTime := CsiNow; 
     lMbps := 100000/MilliSecondsBetween(FStopTime, FStartTime); 
     Memo1.Lines.Add(FormatDateTime('dd/mm/yyyy hh:nn:ss.zzz', CsiNow) + 
         ': Finished test (' + CsiPadFloat(lMbps, 3, 1) + ' Mbps)'); 
     FBytesReceived := 0; 
     FStartTime := 0; 
    end 
    end; 

    CsiSleep(0); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    lData: TByteDynArray; 
    lIndex: Integer; 
begin 
    IdTCPClient1.Host := Edit1.Text; 
    IdTCPClient1.Connect; 
    try 
    SetLength(lData, 125000); 
    for lIndex := 1 to 125000 do 
     lData[lIndex - 1] := Ord('a'); 
    for lIndex := 1 to 100 do 
     IdTCPClient1.IoHandler.Write(TIdBytes(lData)); 
    finally 
    IdTCPClient1.Disconnect; 
    end; 
end; 
+0

+1. Posso confermare i 500 Mbps. –

+0

Grazie per questo, ho intenzione di confrontarlo manualmente e trovare il limite in questo modo. – Chadak

2

Se sei (ab) utilizzando il protocollo TCP/IP come un mezzo per fare IPC tra i processi che sono stati progettati per operare sulla stessa macchina, vi imbatterete in limiti come questi. Utilizzando TCP/IP, in particolare una connessione locale, tutti i dati vengono frammentati e trasferiti attraverso il sistema di commutazione dei pacchetti TCP. Se questo è il caso si dovrebbe guardare in uno di questi:

  • nome o pipe senza nome
  • mappatura della memoria virtuale
  • Passando messaggi WM_DATA intorno
  • COM
  • (sentitevi liberi di aggiungere più di si trova che meritano di essere elencati qui)
+2

Dato che Indy può gestire 500 Mbps su TCP, è abbastanza ovvio che TCP non è il problema. Vorrei sapere che tipo di applicazioni richiedono più di 500 Mbps di larghezza di banda tra loro! È probabile che il problema sia che i dati non possono essere elaborati più velocemente, non che il canale di comunicazione è il fattore limitante. – Misha

+0

@Misha, qualcuno ha detto "640kb dovrebbe essere sufficiente per chiunque."Immaginare un'applicazione che richiede 500 Mbps non è particolarmente difficile (soprattutto dato che ho due schede di rete Gbps nel mio PC, con uno di loro che ha un cavo dritto per un server, nessun interruttore, solo la massima velocità e bassa latenza - e potrei essere in grado di usarne di più) –

+0

PS Il tempo di andata e ritorno è il fattore limitante nella maggior parte delle comunicazioni TCP a causa delle dimensioni della finestra TCP (vedere http://en.wikipedia.org/wiki/TCP_tuning). Il modo migliore per ottenere prestazioni consiste nell'utilizzare più connessioni TCP poiché ognuna ha un throughput limitativo. – Misha

0

Senza alcun codice per riprodurre il problema, è molto difficile scoprire il problema.

La comunicazione IP è molto stabile localmente (tutti i dati rimangono in memoria, nei buffer del sistema operativo) - e 20 MB/s non è nulla per una larghezza di banda al giorno d'oggi HW/SW.

Immagino che il problema sia nel codice, o che abbiate raggiunto (multi-thread?) Limitazioni di Delphi, e abbia avuto contusione durante la gestione dei dati.

Ovviamente, hai provato a disabilitare l'ispezione dei pacchetti AntiVirus? Alcuni di essi rallentano molto il traffico IP quando ispezionano i pacchetti IP (anche se non sono HTTP) e provocano un tale ingorgo di traffico IP casuale.