2012-02-09 9 views
6

J'ai une application client/serveur écrite en DelphiX2 utilisant Indy TIdTCPServer et TIdTCPClient qui communiquent entre eux sur le même ordinateur en utilisant l'adresse TCP 127.0.0.1Quel est le transfert de données/vitesse maximum entre 2 applications sur le même ordinateur

Lorsque j'utilise environ 1 Mo par seconde (8 Megabit) de données, tout fonctionne correctement.

Toutefois, lorsque mes données sont définies à une vitesse plus élevée, comme 20megs/sec (160 mégabits), elles ralentissent et commencent à se comporter bizarrement.

Est-ce un comportement habituel pour cette vitesse? Aussi, je ne peux pas trouver de point de repère ou d'information sur la vitesse maximale de transfert de données entre deux applications locales.

Observe

+0

BTW, comment mesurez-vous la bande passante? Comptez-vous les octets lorsque vous les envoyez ou les recevez? – Misha

Répondre

4

Effectuer un test de bande passante. C'est ce que j'utilise (j'ai joint le code du serveur et du client). FWIW, j'obtiens environ 500Mbps maximum, bien que je ne puisse pas traiter les données aussi rapidement.

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. Je peux confirmer les 500 Mbps. –

+0

Merci pour cela, je vais le repérer manuellement et trouver la limite de cette façon. – Chadak

2

Si vous êtes (ab) en utilisant TCP/IP comme un moyen de faire IPC entre les processus qui sont conçus pour fonctionner sur la même machine, vous courrez dans des limites comme celles-ci. En utilisant TCP/IP, en particulier une connexion locale, toutes les données sont fragmentées et poussées à travers le système de commutation de paquets TCP. Si tel est le cas, vous devriez regarder dans un de ces:

  • nommé ou pipes sans nom
  • cartographie de la mémoire virtuelle
  • passer des messages WM_DATA autour
  • COM
  • (vous pouvez ajouter plus de vous trouvez qu'ils méritent d'être énumérés ici)
+2

En fait, étant donné qu'Indy peut gérer 500 Mbps sur TCP, il est assez évident que TCP n'est pas le problème. Je voudrais savoir quel type d'applications ont besoin de plus de 500Mbps de bande passante entre eux! Le problème est probablement que les données ne peuvent pas être traitées plus rapidement, pas que le canal de communication soit le facteur limitant. – Misha

+0

@Misha, quelqu'un a dit '' 640kb devrait suffire à n'importe qui. ''.Imaginer une application qui nécessite 500Mbps n'est pas particulièrement difficile (d'autant plus que j'ai deux cartes réseau Gbps sur mon PC, l'une d'entre elles ayant un câble droit vers un serveur, pas de switch, juste une vitesse maximum et une faible latence - et je pourrais être capable d'utiliser plus) –

+0

PS Le temps de parcours est le facteur limitant dans la plupart des communications TCP en raison de la taille de la fenêtre TCP (voir http://en.wikipedia.org/wiki/TCP_tuning). Le moyen d'obtenir de meilleures performances consiste à utiliser plusieurs connexions TCP, car chacune a un débit limité. – Misha

0

Sans aucun code pour reproduire le problème, il est très difficile de trouver le problème.

La communication IP est très stable localement (toutes les données restent en mémoire, dans les tampons OS) - et 20 Mo/s ne sont rien pour une vitesse de bande passante sur HW/SW de nos jours.

Je suppose que le problème est dans votre code, ou vous avez atteint les limites (multi-thread?) De Delphi, et a été contusionné lors de la manipulation des données.

Bien sûr, avez-vous essayé de désactiver votre inspection de paquets AntiVirus? Certains d'entre eux ralentissent beaucoup le trafic IP lors de l'inspection des paquets IP (même s'il ne s'agit pas de HTTP), et il en résulte un embouteillage IP aléatoire.

Questions connexes