🥷 Кража во спасение: Work Stealing в Tokio
Если вы используете
Как честно распределить 100,000 задач между 8 потоками, чтобы никто не простаивал и не было узкого горлышка (bottleneck)?
Если сделать одну Глобальную очередь (Global Queue), куда смотрят все потоки, они передерутся за Мьютекс (Mutex contention). Производительность рухнет.
Поэтому Tokio использует Локальные очереди (Local Queues):
1. У каждого потока-воркера есть своя личная очередь задач (до 256 штук).
2. Воркер берет задачи только из своей очереди. Никаких блокировок! Это невероятно быстро.
3. Новые задачи, порожденные текущей (
А что если один поток закончил все задачи, а у другого их еще 200?
Включается Work Stealing (Кража работы):
1. Скучающий воркер смотрит в локальные очереди других потоков.
2. Он находит самую загруженную очередь и втихаря "крадет" ровно половину её задач.
3. Забирает их себе в локальную очередь и начинает молотить.
Это гениальный компромисс: 99% времени потоки работают без блокировок, и лишь изредка (при перекосе баланса) происходит синхронизация для кражи. Именно поэтому Tokio выдерживает миллионы RPS на мощных серверах.
#rust #tokio #architecture #multithreading #work_stealing
👉 @rust_lib
Если вы используете
tokio::main, вы запускаете многопоточный рантайм (Multi-Threaded Scheduler). Под капотом создается пул потоков (воркеров), обычно по числу ядер процессора.Как честно распределить 100,000 задач между 8 потоками, чтобы никто не простаивал и не было узкого горлышка (bottleneck)?
Если сделать одну Глобальную очередь (Global Queue), куда смотрят все потоки, они передерутся за Мьютекс (Mutex contention). Производительность рухнет.
Поэтому Tokio использует Локальные очереди (Local Queues):
1. У каждого потока-воркера есть своя личная очередь задач (до 256 штук).
2. Воркер берет задачи только из своей очереди. Никаких блокировок! Это невероятно быстро.
3. Новые задачи, порожденные текущей (
tokio::spawn), падают в локальную очередь этого же потока.А что если один поток закончил все задачи, а у другого их еще 200?
Включается Work Stealing (Кража работы):
1. Скучающий воркер смотрит в локальные очереди других потоков.
2. Он находит самую загруженную очередь и втихаря "крадет" ровно половину её задач.
3. Забирает их себе в локальную очередь и начинает молотить.
Это гениальный компромисс: 99% времени потоки работают без блокировок, и лишь изредка (при перекосе баланса) происходит синхронизация для кражи. Именно поэтому Tokio выдерживает миллионы RPS на мощных серверах.
#rust #tokio #architecture #multithreading #work_stealing
👉 @rust_lib
🔥20👍3❤1🥰1🤗1