Est-il optimal taille en octets pour l'envoi de données sur un réseau?
J'assume à 100 octets est trop petit et peut ralentir les grands transferts de fichiers avec toutes les écritures, mais quelque chose comme 1 MO semble comme il peut être trop. Quelqu'un aurait-il des suggestions pour optimiser le bloc d'octets par écrire pour l'envoi de données sur un réseau?
D'élaborer un peu plus, je suis la mise en œuvre de quelque chose qui envoie les données via une connexion réseau et de montrer les progrès de données envoyées. J'ai remarqué que si je envoyer de gros fichiers à environ 100 octets écriture, il est extrêmement lent, mais la barre de progression fonctionne très bien. Cependant, si j'envoie à dire 1M par l'écriture, c'est beaucoup plus rapide, mais la barre de progression ne fonctionne pas aussi bien en raison de la plus gros morceaux envoyés.
Une taille en octets de 0 à optimiser votre par paquet de vitesse, mais serait sous-optimal pour l'ensemble des temps de transfert.
Je suis d'accord avec Mitch Blé - si vous utilisez le protocole TCP, alors à moins que vous avez activé NODELAY ou de chasse, les paquets envoyés par la pile ne correspondent pas à vos appels d'envoyer de toute façon. Vérifier les ioctls relatives à la mémoire tampon de sortie - vous pouvez être en mesure d'améliorer la barre de progression ou d'écrire dans le buffer de la taille des morceaux.
OriginalL'auteur intargc | 2008-11-20
Vous devez vous connecter pour publier un commentaire.
Si vous le pouvez, laissez simplement la pile IP de la poignée; la plupart des Systèmes d'exploitation ont beaucoup d'optimisation déjà intégré. Vista, par exemple, de modifier dynamiquement les différents paramètres pour optimiser le débit; deuxième deviner l'algorithme est peu susceptible d'être bénéfique.
Cela est particulièrement vrai dans l'ordre supérieur des langues, loin de la fil réels, tels que C#; il y a assez de couches entre vous et réelle des paquets TCP/IP que je m'attends votre code pour relativement peu d'impact sur le débit.
Au pire, de tester différentes tailles de message dans diverses situations pour vous-même; peu de solutions sont one-size-fits-all.
OriginalL'auteur technophile
Non, il n'est pas optimale universelle taille en octets.
Les paquets TCP sont soumis à la fragmentation, et alors qu'il serait bien de considérer que tout ce à partir d'ici jusqu'à votre destination est vrai ethernet avec d'énormes tailles de paquets, la réalité est, même si vous pouvez obtenir la taille des paquets de tous les réseaux de l'un de vos paquets prend, chaque paquet que vous envoyez peut prendre un autre chemin par le biais de l'internet.
Ce n'est pas un problème, vous pouvez "résoudre" et il n'y a pas universel taille idéale.
Nourrir les données de l'OS et de la pile TCP/IP aussi rapidement que vous le pouvez, et il va s'adapter dynamiquement la taille des paquets pour les connexions réseau (vous devriez voir le code qu'ils utilisent à cette optimisation, il est vraiment, vraiment intéressant. Au moins, sur l'amélioration des piles.)
Si vous contrôlez l'ensemble des réseaux et des piles utilisées et inbetween vos clients/serveurs, cependant, alors vous pouvez faire un peu de réglage de la main. Mais en général, même alors, vous devez avoir une très bonne connaissance du réseau et les données de votre envoi avant que je vous suggère de vous en approcher.
-Adam
OriginalL'auteur Adam Davis
Si vous utilisez le protocole TCP/IP sur Ethernet, la taille de paquet maximale est d'environ 1500 octets. Si vous essayez d'envoyer plus que cela à la fois, les données seront divisés en plusieurs paquets avant d'être envoyée sur le réseau. Si les données dans votre application est déjà mise en paquet, alors vous pouvez choisir une taille de paquet d'un peu moins de 1500 de sorte que lorsque vous envoyez un paquet complet, le sous-jacentes de la pile n'a pas à le briser. Par exemple, si tous vous envoyer faire est de 1600 octets, la pile TCP devra envoyer deux paquets pour chaque envoi, avec le deuxième paquet étant la plupart du temps vide. C'est plutôt inefficace.
Cela dit, je ne connais pas beaucoup d'impact visible sur les performances de cette aura.
Merci pour la clarification.
De nombreux ports ethernet (en particulier de 1 go) avoir une MTU de plus de 1500.
OriginalL'auteur Graeme Perrow
Je crois que votre problème est que vous utilisez des sockets blocage et les non-bloquantes.
Lorsque vous utilisez le blocage des sockets et de vous envoyer 1M de données de la pile réseau peut attendre que toutes les données soient placées dans un tampon, si les tampons sont plein, vous serez bloqué et votre barre de progression va attendre pour l'ensemble de 1M pour être accepté dans les tampons, cela peut prendre un certain temps et votre barre de progression de jumpy.
Toutefois, si vous utilisez les sockets non bloquant, quelle que soit la taille de la mémoire tampon que vous utilisez ne seront pas en bloc, et vous devrez le faire à l'attente de vous-même avec select/poll/epoll/peu importe qui-travaille-sur-votre-plate-forme (select est le plus portable). De cette façon, votre barre de progression sera mise à jour rapide et reflètent les informations les plus précises.
Ne remarque qu'à l'expéditeur de la barre de progression est partiellement cassé de toute façon depuis le noyau de la mémoire tampon des données et vous permettra d'atteindre les 100% avant l'autre côté vraiment reçu les données. La seule façon de contourner cela est si votre protocole comprend une réponse sur la quantité de données reçues par le récepteur.
Comme les autres ont dit, la seconde deviner l'OS et le réseau est la plupart du temps futiles, si vous continuez à utiliser des sockets blocage choisir une taille qui est assez grand pour contenir plus de données que d'un seul paquet, de sorte que vous n'envoyez pas de trop peu de données dans un paquet que cela permettra de réduire le débit de votre inutilement. J'irais avec quelque chose comme la 4K pour inclure au moins deux paquets à la fois.
OriginalL'auteur Baruch Even
La seule chose que je peux ajouter, c'est que pour une connexion ethernet, il faut autant de temps pour envoyer un petit paquet comme un grand. Comme d'autres l'ont dit: si vous êtes juste de l'envoi d'un flux de données de laisser le système gérer. Mais si vous êtes inquiet au sujet de différents messages courts en arrière et en avant, un typique d'un paquet ethernet est d'environ 1500 octets - aussi longtemps que vous le garder sous que vous devriez être bon.
OriginalL'auteur Joel Coehoorn
Vous auriez besoin d'utiliser Path MTU Discovery, ou utiliser une valeur par défaut (c'est à dire moins de 1500 octets).
OriginalL'auteur Greg Rogers
Faire une fonction nommée CalcChunkSize
Ajouter quelques variables privées à votre classe:
Avant chaque téléchargement d'un morceau, de vérifier si son temps de calculer de nouvelles chunksize à l'aide de la ChunkSizeSampleInterval
numIterations est mis à 0 à l'extérieur de la télécharger en boucle et après chaque téléchargé chunk à numIterations += 1
Ont la CalcChunkSize faire:
Alors utilisez simplement la ChunkSize lors de la demande du segment suivant.
J'ai trouvé dans la rubrique "Envoi de fichiers en morceaux avec MTOM services web et .Net 2.0" par Tim_mackey et avons trouvé qu'il m'être très utile pour calculer dynamiquement les plus efficaces chunksize.
Le code source en entier est ici: http://www.codeproject.com/KB/XML/MTOMWebServices.aspx
Et de l'auteur ici: http://www.codeproject.com/script/Membership/Profiles.aspx?mid=321767
OriginalL'auteur Stefan
Un test empirique que vous pouvez faire, si vous ne l'avez pas déjà, est bien sûr d'utiliser un sniffer (tcpdump, Wireshark, etc.) et regardez ce que des tailles de paquets sont obtenus en utilisant d'autres logiciels pour le téléchargement. Que pourrait vous donner un indice.
OriginalL'auteur Niklas
Ici est la formule dont vous avez besoin:
À l'aide de cette, chaque morceau que vous envoyez s'incrémenter la barre de progression de 1 pixel. Un petit morceau de la taille que cela est inutile, en termes de feedback de l'utilisateur.
OriginalL'auteur MusiGenesis