Redis является однопоточным, тогда как он выполняет параллельный ввод-вывод?


пытаясь понять некоторые основы Redis я наткнулся на интересный блоге .

автор:

Redis является однопоточным с epoll/kqueue и масштабируется неограниченно с точки зрения параллелизма ввода-вывода.

Я, конечно, неправильно понимаю всю эту резьбу, потому что я нахожу это утверждение озадачивающим. Если программа однопоточная, как она делает что-либо одновременно? Почему это так здорово, что операции Redis атомный, если сервер однопоточный в любом случае?

может кто-нибудь пролить свет на этот вопрос?

2 124

2 ответа:

Ну это зависит от того, как вы определите параллелизма.

в серверном программном обеспечении параллелизм и параллелизм часто рассматриваются как разные понятия. В сервере поддержка параллельного ввода-вывода означает, что сервер может обслуживать несколько клиентов, выполняя несколько потоков, соответствующих этим клиентам, только с одним вычислительным блоком. В этом контексте параллелизм означает, что сервер может выполнять несколько вещей одновременно (с несколькими вычислительными единицами), что является отличающийся.

например, бармен может ухаживать за несколькими клиентами, в то время как он может приготовить только один напиток за один раз. Таким образом, он может обеспечить параллелизм без параллелизма.

этот вопрос обсуждался здесь: параллелизм против параллелизма-в чем разница?

см. также презентации от Роба Пайка.

однопоточная программа может определенно обеспечить параллелизм на уровне ввода / вывода с помощью механизм мультиплексирования ввода / вывода (de) и цикл событий (что и делает Redis).

параллелизм имеет стоимость: с несколькими сокетами/несколькими ядрами, которые вы можете найти на современном оборудовании, синхронизация между потоками чрезвычайно дорога. С другой стороны, узким местом эффективного механизма хранения данных, такого как Redis, очень часто является сеть, задолго до процессора. Изолированные циклы событий (которые не требуют синхронизации) поэтому рассматриваются как хороший дизайн для создания эффективных, масштабируемых, сервера.

тот факт, что операции Redis являются атомарными, является просто следствием однопоточного цикла событий. Интересным моментом является то, что атомарность обеспечивается без каких-либо дополнительных затрат (она не требует синхронизации). Он может быть использован Пользователем для реализации оптимистической блокировки и других шаблонов, не оплачивая накладные расходы на синхронизацию.

OK, Redis является однопоточным на пользовательском уровне, OTOH, все асинхронные операции ввода-вывода поддерживаются пулами потоков ядра и / или драйверами двухуровневого управления.

'одновременно', для некоторых, включает в себя распределение сетевых событий для сокетов состояния машин. Он однопоточный, работает на одном ядре (на уровне пользователя), поэтому я бы не назвал это параллельным. Другие отличаются..

'масштабирование бесконечно с точки зрения параллелизма ввода / вывода ' просто быть экономичным с истина. Они могут получить больше веры, если они сказали: "может масштабироваться лучше, чем один поток на клиента, при условии, что клиенты не просят многого", хотя они могут чувствовать себя обязанными добавить "сдувается при тяжелой загрузке другими асинхронными решениями, которые используют все ядра на уровне пользователя".