32 votes

Le Tonnerre Troupeau Problème existe pas sur Linux plus?

De nombreux linux/unix programmation des livres et des tutoriels parler du "Tonnerre Troupeau Problème" qui se produit lorsque plusieurs threads ou les fourches sont bloqués sur un select() de l'appel en attente pour des raisons de lisibilité d'un socket d'écoute. Lorsque la connexion arrive, tous les threads et les fourches sont réveillés, mais seulement un "gagne" avec un appel réussi à "accept()". Dans l'intervalle, beaucoup de temps cpu est gaspillée se réveiller tous les threads/fourche pour aucune raison.

J'ai remarqué un projet qui fournit une "solution" à ce problème dans le noyau linux, mais c'est un très vieux patch.

Je pense qu'il y a deux variantes; l'Une où chaque fourche (select) et puis accept(), et celle qui vient de n'accepter().

Faire moderne unix/linux kernels ont encore le Tonnerre Troupeau Problème dans ces deux cas, ou seulement le "select() puis accept()" version?

12voto

kazuho Points 56

Pendant des années, la plupart des systèmes unix/linux kernels sérialiser réponse à accepter(2)s, en d'autres termes, un seul thread est réveillé si plus d'un est bloque sur accept(2) contre un seul d'ouvrir le fichier de description.

Otoh, que, beaucoup (si pas tous) les noyaux ont encore le tonnerre troupeau problème dans le select accepter modèle que vous décrivez.

J'ai écrit un script simple ( https://gist.github.com/kazuho/10436253 ) pour vérifier l'existence du problème, et trouvé que le problème existe sur linux 2.6.32 et Darwin 12.5.0 (OS X 10.8.5).

11voto

0xfe Points 2844

C'est un très vieux problème, et pour la plupart, n'existe plus. Le noyau Linux (depuis quelques années) a eu un certain nombre de changements à la façon dont il traite et achemine les paquets du réseau de la pile, et comporte de nombreuses optimisations pour assurer un faible temps de latence, et de l'équité (c'est à dire, réduire la faim).

Cela dit, l' sélectionnez système a un certain nombre de problèmes d'évolutivité simplement par le biais de son API. Lorsque vous avez un grand nombre de descripteurs de fichiers, le coût d'un appel est très élevé. Cela est principalement dû à la construction de, vérifier et maintenir la FD des ensembles qui sont transmises vers et à partir de l'appel système.

De nos jours, la meilleure façon de le faire asynchrone IO est avec epoll. L'API est bien plus simple et échelles très joliment à travers les divers types de charge (nombre de connexions, beaucoup de débit, etc.)

2voto

codeshot Points 159

J'ai vu récemment testé un scénario où plusieurs threads interrogé sur une écoute unix socket de domaine et puis accepté la connexion. Tous les fils s'est réveillé à l'aide de la poll() de l'appel système.

C'était une version personnalisée du noyau linux plutôt qu'une distribution de construire peut-être, il est une option de configuration du noyau que les changements, mais je ne sais pas ce que c'est.

Nous n'avons pas essayé epoll.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X