2010-04-24 20 views
1

J'ai besoin d'envoyer (échanger) un volume élevé de données périodiquement avec la latence la plus faible possible entre 2 machines. Le réseau est plutôt rapide (par exemple 1 Gbit ou même 2G +). Os est linux. Est-il plus rapide d'utiliser 1 socket tcp (pour send et recv) ou d'utiliser 2 socket tcp uni-dirigé? Le test pour cette tâche est très similaire au benchmark réseau NetPIPE - mesurer la latence et la bande passante pour des tailles de 2^1 à 2^13 octets, chaque taille étant envoyée et reçue 3 fois au moins (en tâche sémantique le nombre d'envois est plus grand, les deux processus enverront et recevront, comme le ping-pong peut-être).une prise tcp à deux directions OU deux une direction? (linux, high volume, low latency)

L'avantage de 2 connexions unidirectionnelles dirigé proviennent de Linux:

http://lxr.linux.no/linux+v2.6.18/net/ipv4/tcp_input.c#L3847

3847/* 
3848 *  TCP receive function for the ESTABLISHED state. 
3849 * 
3850 *  It is split into a fast path and a slow path. The fast path is 
3851 *  disabled when: 
... 
3859 *  - Data is sent in both directions. Fast path only supports pure senders 
3860 *  or pure receivers (this means either the sequence number or the ack 
3861 *  value must stay constant) 
... 
3863 * 
3864 *  When these conditions are not satisfied it drops into a standard 
3865 *  receive procedure patterned after RFC793 to handle all cases. 
3866 *  The first three cases are guaranteed by proper pred_flags setting, 
3867 *  the rest is checked inline. Fast processing is turned on in 
3868 *  tcp_data_queue when everything is OK. 

Toutes les autres conditions pour la désactivation de chemin rapide est faux. Et seulement socket non-non-redirigé arrête le noyau de fastpath en recevoir

+0

Salut, vous pouvez vérifier le nombre d'utilisation du chemin rapide avec l'en-tête de paquets 'netstat -s' param' prédit et directement mis en file d'attente à l'utilisateur '' NET_INC_STATS_BH (LINUX_MIB_TCPHPHITSTOUSER); ' – osgx

Répondre

1

Il y a trop de variables pour qu'une seule réponse soit toujours valable ici. Sauf si vous avez un très très lien réseau rapide - probablement> 1 GBit/sec sur le matériel moderne - le truc fastpath/slowpath que vous avez lié à probablement n'a pas d'importance. Juste au cas où, vous pouvez choisir d'écrire votre programme pour travailler dans les deux sens. Stockez juste un readsocket et un writesocket, et au moment de connect(), vous pouvez soit les assigner pour être le même socket, ou deux prises différentes. Ensuite, vous pouvez simplement essayer dans les deux sens et voir ce qui est le plus rapide.

Il est fort probable que vous ne remarquerez aucune différence entre les deux.

+0

Je m'intéressais à l'activation de fastpath. Le matériel testé est un matériel embarqué, mais le réseau est rapide pour ce matériel. La différence est ici, comme pour la latence de ping-pong (round robin), toute lenteur rendra le résultat moins. – osgx

+0

Testez-le quand même. Vous pourriez très bien ne voir aucune différence. – apenwarr

0

Je sais que cela ne répond pas directement à votre question, mais je suggère de jeter un oeil à quelque chose comme ZeroMQ. Il y a un article d'introduction à ce sujet sur lwn: 0MQ: A new approach to messaging.

Je n'ai pas encore essayé, mais j'ai lu un peu sur le sujet et il semble que ce soit ce que vous cherchez. Pourquoi réinventer la roue?

+0

Il utilise 1 tcp à deux faces. J'ai besoin de mettre en œuvre une chose moi-même, sans aucune couche supplémentaire de n'importe quel projet. – osgx

+0

Il utilise également des threads supplémentaires. mais l'utilisation d'un thread forcera le noyau à programmer leur entrée et leur sortie. Le commutateur de contexte Inter thread mange du temps qui peut être dépensé pour des tâches utiles. – osgx