2012-02-09 11 views
6

Mam aplikacji klient/serwer napisany w delphiXe2 użyciu Indy TIdTCPServer i TIdTCPClient, który komunikuje się ze sobą na tym samym komputerze przy użyciu protokołu TCP adres 127.0.0.1Jaka jest maksymalna data/prędkość transferu między 2 aplikacji na tym samym komputerze

Kiedy używam około 1 megapsu na sekundę (8 megabitów) danych wszystko działa poprawnie.

Jednak gdy ustawię moje dane z większą prędkością, jak 20megs/s (160 megabitów), zwalnia i zaczyna dziwnie zachowywać się.

Czy to normalne zachowanie dla tej prędkości? Również nie mogę znaleźć żadnego testu porównawczego ani informacji o maksymalnej prędkości transferu danych między 2 lokalnymi aplikacjami.

Pozdrowienia

+0

BTW, jak mierzysz przepustowość? Czy licząc bajty podczas ich wysyłania lub odbierania? – Misha

Odpowiedz

4

Przeprowadź test przepustowości. Właśnie tego używam (dołączyłem odpowiedni serwer i kod klienta). FWIW, uzyskuję około 500 Mb/s maksimum, chociaż nie ma możliwości szybkiego przetworzenia danych.

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. Potrafię potwierdzić 500 Mbps. –

+0

Dziękuję za to, przetestuję to ręcznie i znajdę limit w ten sposób. – Chadak

2

Jeśli jesteś (ab) za pomocą protokołu TCP/IP jako środek do zrobienia IPC pomiędzy procesami, które są przeznaczone do pracy na tej samej maszynie, można uruchomić w granicach takich jak te. Korzystając z protokołu TCP/IP, w szczególności połączenia lokalnego, wszystkie dane są pofragmentowane i przekazywane przez system przełączania pakietów, którym jest TCP. Jeśli jest to sprawa powinna zajrzeć do jednego z nich:

  • Nazwany lub rury nienazwane
  • mapowanie pamięci wirtualnej
  • Passing WM_DATA wiadomości wokół
  • COM
  • (krępuj się dodać więcej okaże się, że zasługują na wymienienie tutaj)
+2

Właściwie biorąc pod uwagę, że Indy może zarządzać 500 Mbps przez TCP, jest całkiem oczywiste, że TCP nie jest problemem. Chciałbym wiedzieć, jakiego rodzaju aplikacje potrzebują ponad 500 Mbps między nimi! Problem prawdopodobnie polega na tym, że danych nie można przetworzyć szybciej, nie że kanał komunikacyjny jest czynnikiem ograniczającym. – Misha

+0

@ Misza, ktoś powiedział: "640kb powinno wystarczyć każdemu."Wyobrażanie sobie aplikacji wymagającej 500 Mb/s nie jest szczególnie trudne (szczególnie biorąc pod uwagę, że mam dwa karty sieciowe Gb/sz na komputerze, z których jeden ma prosty kabel do serwera, bez przełącznika, tylko maksymalną prędkość i małe opóźnienie - i może być w stanie użyć więcej) –

+0

PS Okrągły czas podróży jest czynnikiem ograniczającym w większości komunikatorów TCP z powodu rozmiaru okna TCP (patrz http://pl.wikipedia.org/wiki/TCP_tuning). Aby uzyskać lepszą wydajność, należy użyć wielu połączeń TCP, ponieważ każdy z nich ma ograniczoną przepustowość. – Misha

0

Bez żadnego kodu do odtworzenia problemu, bardzo trudno jest znaleźć problem.

Komunikacja IP jest bardzo stabilna lokalnie (wszystkie dane pozostają w pamięci, w buforze OS) - a 20 MB/s jest niczym w kwestii przepustowości w dzisiejszych urządzeniach HW/SW.

Zgadnij, że problem jest w twoim kodzie, lub osiągnąłeś (wielowątkowe?) Ograniczenia Delphi i dostałeś kontuzje podczas przetwarzania danych.

Czy próbowałeś wyłączyć kontrolę pakietów antywirusowych? Niektóre z nich znacznie spowalniają ruch IP podczas kontroli pakietów IP (nawet jeśli nie jest to HTTP), a to powoduje taki losowy ruch IP.

Powiązane problemy