2012-02-09 10 views
6

Tengo una aplicación cliente/servidor escrita en delphiXe2 usando Indy TIdTCPServer y TIdTCPClient que se comunican entre sí en la misma computadora usando la dirección TCP 127.0.0.1Cuál es la transferencia máxima de datos/velocidad entre 2 aplicaciones en la misma computadora

Cuando uso aproximadamente 1 megas por segundo (8 megabits) de datos todo funciona bien.

Sin embargo, cuando configuro mis datos a una velocidad más alta como 20 megas/seg (160 Megabits), se ralentiza y comienza a comportarse de forma extraña.

¿Es ese un comportamiento habitual para esa velocidad? También parece que no puedo encontrar ningún punto de referencia o información de cuál es la velocidad máxima de transferencia de datos entre 2 aplicaciones locales.

Saludos

+0

Por cierto, ¿cómo estás midiendo el ancho de banda? ¿Estás contando los bytes mientras los envías o los recibes? – Misha

Respuesta

4

realizar una prueba de ancho de banda. Esto es lo que uso (he adjuntado el código de cliente y servidor correspondiente). FWIW, obtengo alrededor de 500Mbps como máximo, aunque no hay manera de que pueda procesar datos tan rápido.

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. Puedo confirmar los 500Mbps. –

+0

Gracias por esto, voy a compararlo manualmente y encontrar el límite de esta manera. – Chadak

2

Si eres (ab) utilizando TCP/IP como un medio para hacer IPC entre los procesos que están diseñados para operar en la misma máquina, que se ejecutará en los límites de este tipo. Al usar TCP/IP, especialmente una conexión local, todos los datos se fragmentan y se envían a través del sistema de conmutación de paquetes que es TCP. Si este es el caso usted debe buscar en una de estas:

  • Nombre o tuberías sin nombre
  • mapeo de memoria virtual
  • pasar mensajes WM_DATA alrededor
  • COM
  • (no dude en añadir más de usted encuentra que merecen aparecer en la lista aquí)
+2

En realidad, dado que Indy puede administrar 500Mbps sobre TCP, es bastante obvio que TCP no es el problema. Me gustaría saber qué tipo de aplicaciones necesitan más de 500 Mbps de ancho de banda entre ellas. Es probable que el problema sea que los datos no se pueden procesar más rápido, no que el canal de comunicaciones sea el factor limitante. – Misha

+0

@Misha, alguien dijo que "640kb debería ser suficiente para cualquiera".Imaginar una aplicación que necesita 500Mbps no es particularmente difícil (especialmente teniendo en cuenta que tengo dos tarjetas de red Gbps en mi PC, una de ellas tiene un cable directo a un servidor, sin interruptor, solo velocidad máxima y baja latencia, y yo podría poder usar más) –

+0

PS El tiempo de ida y vuelta es el factor limitante en la mayoría de las comunicaciones TCP debido al tamaño de la ventana TCP (ver http://en.wikipedia.org/wiki/TCP_tuning). La forma de obtener un mejor rendimiento es usar conexiones TCP múltiples porque cada una tiene un rendimiento límite. – Misha

0

Sin ningún código para reproducir el problema, es muy difícil encontrar el problema.

La comunicación IP es muy estable localmente (todos los datos permanecen en la memoria, en los búferes del sistema operativo) - y 20 MB/s no es nada para una velocidad de ancho de banda hoy en día HW/SW.

Supongo que el problema está en su código, o llegó a (múltiples hilos?) Las limitaciones de Delphi, y consiguió contusión al manejar los datos.

Por supuesto, ¿intentó desactivar su inspección de paquetes AntiVirus? Algunos de ellos ralentizan mucho el tráfico de IP cuando se inspeccionan los paquetes de IP (incluso si no es HTTP), y da como resultado un atasco de tráfico aleatorio de IP.

Cuestiones relacionadas