Quel est le transfert de données / vitesse maximum entre 2 applications sur le même ordinateur?

J’ai une application client / serveur écrite en delphiXe2 avec Indy TIdTCPServer et TIdTCPClient qui communiquent entre eux sur le même ordinateur en utilisant l’adresse TCP 127.0.0.1

Lorsque j’utilise environ 1 Mo par seconde (8 Mégabits) de données, tout fonctionne bien.

Cependant, lorsque vous réglez vos données à une vitesse supérieure à 20 Mo / s (160 Mégabits), cela ralentit et commence à se comporter bizarrement.

Est-ce un comportement habituel pour cette vitesse? En outre, je ne peux pas sembler trouver un repère ou une information de ce qu’est la vitesse maximale de transfert de données entre 2 applications locales.

Cordialement

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

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); var lData: TByteDynArray; lCaption: ssortingng; 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; 

Si vous utilisez (ab) TCP / IP comme moyen de faire IPC entre des processus conçus pour fonctionner sur le même ordinateur, vous rencontrerez des limites comme celles-ci. En utilisant TCP / IP, en particulier une connexion locale, toutes les données sont fragmentées et transmises via le système de commutation de paquets TCP. Si tel est le cas, vous devriez examiner l’un de ces:

  • Tubes nommés ou non nommés
  • Mappage de mémoire virtuelle
  • Passer des messages WM_DATA autour
  • COM
  • (n’hésitez pas à append plus de vous trouvez qu’ils méritent d’être listés ici)

Sans 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 restnt en mémoire, dans les tampons du système d’exploitation) – et 20 Mo / s ne sont rien pour une vitesse de bande passante de nos jours.

Je suppose que le problème est dans votre code, ou vous avez atteint (multi-thread?) Les limitations de Delphi, et que vous avez eu des contusions lors du traitement 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 du protocole HTTP) et entraînent un tel embouteillage IP aléatoire.