Что за странная многопоточность в tarantool, что он не держит нагрузку?
=========================================================================

 В целом tarantool считаю чем-то средним между дном и нормальной технологией, видно какой там бардак в репозиториях, с коннекторами, что-то заброшено и не обновляется, что-то обновляется без changelog.   

  

В данный момент меня интересует многопоточность.  

  

В процессе экспериментов мы заметили, что если в хранимых процедурах на Lua делать много всего, и вызывать эти процедуры одновременно несколькими клиентами, то оно начинает очень сильно тормозить. Ну то есть нагрузку вообще не держит.  

  

Можно было бы подумать, что Tarantool вообще однопоточный. Но там все же есть какие-то fiber, и исследование показывает, что каждая хранимка крутится в своем fiber.  

И к тому же существуют либы для тарантула, где вообще есть некие "сигналы" (или "локи"), и есть функция, которая ждет в цикле while (со sleep, разумеется!), когда сработает этот сигнал, и эту функцию надо вызывать именно из Lua, то есть хранимок. Но, как я уже сказал, если у вас есть хотя бы 10-20 клиентов, то можете считать эту систему однопоточной, с соответствующими перспективами для этих while.  

  

Если же вынесем эту логику из хранимок тарантула в тот сервис, который их вызывает, а хранимки сделаем мелкими и как можно более атомарными, то система сразу будет держать сотни, а то и тысячи клиентов одновременно. И чем атомарнее хранимки, тем быстрее все работает, и даже при 2-3 (!) клиентах можно заметить разницу. (ЦП у нас имеет 32 ядра, если что.)  

  

Что же это за "однопоточная многопоточность" такая, для кого это сделано, зачем? 

[https://www.tarantool.io/en/doc/latest/book/box/at...](https://www.tarantool.io/en/doc/latest/book/box/atomic/#cooperative-multitasking)  

  

> Cooperative multitasking means: unless a running fiber deliberately yields control, it is not preempted by some other fiber. But a running fiber will deliberately yield when it encounters a “yield point”: a transaction commit, an operating system call, or an explicit “yield” request.

  

> Transactions in Tarantool occur in fibers on a single thread. That is why Tarantool has a guarantee of execution atomicity.

  

Слышали когда-нибудь про [кооперативную многозадачность](https://en.wikipedia.org/wiki/Computer_multitasking)? Это как раз про "Но там все же есть какие-то fiber". Предлагаю изучить, наверняка ответ кроется там.  

  

> И чем атомарнее хранимки, тем быстрее все работает

  

Более чем логичный результат, это всё равно что делать yield в нужных местах в одной большой хранимке.