Redis est monofiltre, alors comment fait-il les entrées/sorties simultanées?

en essayant de saisir quelques bases de Redis je suis tombé sur un intéressant post de blog .

l'auteur déclare:

Redis est mono-thread avec epoll/kqueue et l'échelle indéfiniment en termes d'I/O de la simultanéité.

j'ai sûrement mal compris toute cette histoire de filetage, parce que je trouve cette déclaration déroutante. Si un programme est monothread, comment faut-il faire quelque chose simultanément? Pourquoi est-ce si important que les opérations Redis soient atomiques, si le serveur est de toute façon mono-threadé?

Quelqu'un pourrait-il nous éclairer sur cette question?

124
demandé sur Przemysław Pietrzkiewicz 2012-05-08 01:19:16

2 réponses

Cela dépend de la façon dont vous définissez la concurrence.

dans les logiciels côté serveur, la concurrence et le parallélisme sont souvent considérés comme des concepts différents. Dans un serveur, la prise en charge des E/S concurrents signifie que le serveur est capable de servir plusieurs clients en exécutant plusieurs flux correspondant à ces clients avec une seule unité de calcul. Dans ce contexte, le parallélisme signifierait que le serveur est capable d'effectuer plusieurs choses en même temps (avec des calculs multiples unités), ce qui est différent.

par exemple, un barman peut s'occuper de plusieurs clients alors qu'il ne peut préparer qu'une boisson à la fois. Donc il peut fournir la concurrence sans parallélisme.

Cette question a été débattue ici: concurrence vs parallélisme-Quelle est la différence?

Voir aussi cette présentation de Rob Pike.

A le programme mono-threadé peut certainement fournir la concurrence au niveau D'e / s en utilisant un mécanisme de multiplexage d'e/s (de)et une boucle d'événement (ce que fait Redis).

le parallélisme a un coût: avec les multiples sockets / multiple core que vous pouvez trouver sur le matériel moderne, la synchronisation entre les fils est extrêmement chère. D'autre part, le goulot d'étranglement d'un moteur de stockage efficace comme Redis est très souvent le réseau, bien avant le CPU. Événement isolé boucles (qui ne nécessitent pas de synchronisation) sont donc considérés comme une bonne conception pour construire des serveurs efficaces et évolutifs.

le fait que les opérations Redis soient atomiques est simplement une conséquence de la boucle d'événement monofiltre. Le point intéressant est l'atomicité est fourni sans coût supplémentaire (il ne nécessite pas de synchronisation). Il peut être exploité par l'utilisateur pour mettre en œuvre le verrouillage optimiste et d'autres modèles sans payer pour la synchronisation aérienne.

244
répondu Didier Spezia 2017-05-23 12:34:44

OK, Redis est threadé au niveau de l'utilisateur, OTOH, toutes les entrées/sorties asynchrones sont supportées par les pools de threads du noyau et/ou les pilotes de split-level.

" Concurrent ", pour certains, inclut la distribution d'événements réseau aux machines d'état de socket. C'est simple-fileté, fonctionne sur un noyau, (au niveau de l'utilisateur), donc je ne dirais pas cela comme concurrent. D'autres diffèrent..

' échelle indéfiniment en termes de concurrence E/S ' est juste être économe avec la vérité. Ils peuvent obtenir plus de confiance s'ils disent "peut mieux dimensionner qu'un fil-par-client, à condition que les clients ne demandent pas beaucoup", bien qu'ils puissent alors se sentir obligés d'ajouter "soufflé sur le chargement lourd par d'autres solutions asynchrones qui utilisent tous les noyaux au niveau de l'utilisateur".

15
répondu Martin James 2016-07-21 10:01:11