Async or multithread вот в чем вопрос, что выбрать?
Добрый день, занимаемся разработкой серверной платформы для игрушки, на данный момент держим 3300+ активных соедененией и получаем сильный просад по производительности.
Есть желание переехать на другую машину, на данный момент выигрываем мы от герц, а не от кол-ва процессоров, но пока это, не очень весело, так как мы уперлик в i7 с частой в 4700, а найти что то выше на открытом рынке выделенных серверов просто не реально. Есть желание перепилить полностью систему обновлений, и пока стоит открытым вопрос какой же метод выбрать, асинхронность или ручное управление потоками.
Чем вообще занимается сервер:
* AI существ в мире
* Обработка коллизий, поиск и обработка путей для игровых существ
* Обработка, соответственно передвижений, взаимодействий меж игроками, обработка их персонажей и многое другое
* Работа с базой, сохранение, загрузка
Т.е есть как и сильный IO, так и расчеты.
В даный момент у нас есть тестовый сервер с 48 тредами с частой 2000, на котором мы провалили тестирование с ручными управлением потоками, большая часть серверов которые можно найти на рынке делаю упор на кол-во ядер, а не на производительность каждого из них.
Собственно по моим теор. знаниям асинхронность требует доп. ресурсов на хранение промежуточной информации и для ее восстановления.
Что же делать в нашем случае?
PS: Проблем, в частности с объемами используемой оперативной памяти не возникает, тоесть ее много и ресурсы нам не жалко.
Сергей Горностаев
@sergey-gornostaev Куратор тега Асинхронное программирование
Седой и строгий
Асинхронные программы как раз потребляют меньше памяти и имеют меньший оверхед на переключении контекста. Но асинхронная программа в принципе не может использовать больше одного ядра. Для параллелизма только потоки. Ну, либо гибридный вариант - запускать по потоку на ядро, в каждом из которых будет крутиться свой асинхронный цикл событий, как в Go. Но в таком варианте логика синхронизации сопрограмм будет непростой.
Асинхронность хороша в задачах стиля - немного посчитали, долго ждем (неважно чего), еще немного посчитали, снова долго ждем и т.д. Так как позволяет равномерно размазать время активного использования процессора по разным задачам.
Из вашего описания заасинхронить можно только
* Работа с базой, сохранение, загрузка
остальное, как я понял - числодробилки.
В любом случае описание слишком общее. Однозначно не ответить.
mrAvenger, Тогда просто забейте, вы такую кучу с++ кода все равно на асинхронность не переведете. Проще с нуля наверное все переписать на каком-нибудь языке с поддержкой асинхронности из коробки. Go - неплохой вариант.