powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничная будущая мультипоточность
25 сообщений из 149, страница 3 из 6
Тяпничная будущая мультипоточность
    #39719599
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Форкнул отдельно тему с coroutines 21708273
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39719971
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного вернемся к этому.
полудух4. stackfull корутины без ниток (fibers) дают ~30k rps на поток;
Откуда цифра?

Потому что у меня например на порядок выше на простой виртуалке - 350 Krps.
Тест кейс - одна корутина передает другой сообщение в 32 байта через io_service (Asio) и принимает обратно ответ. Следующее сообщение посылается после получения ответа. Все в одном потоке.

При этом я вижу что при передаче HTTP между двумя процессами (в одном потоке на процесс) действительно 30 Кrps, но из предудущего теста видно что это не лимит корутин, как следует из вашего сообщения. Просто на данной комбинации софта и харда получается такая скорость обработки HTTP (аллокации, IPC, TCP и другие оверхеды).
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39719989
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
цифра из тех видео, что в том же посте , и следующее за ним. Там в каждом вроде свои тесты есть
где взять кошерный, самый честный/чистый/профессиональный тест между C++ и Haskell/Erlang я не знаю (
прямо чтобы профи со знанием дела одно и то же потестили
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39719992
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anyway, coroutines + fibers + future это самое быстрое соотношение скорости и лёгкости кода
быстрее только опускаться ниже этих абстракций, но прирост будет всего %10
это очень быстрое решение для сотен тысяч и даже миллионов rps
у вас 350к на 1 поток?
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39720016
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудуху вас 350к на 1 поток?
Ну да, я же выше написал условия теста.
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39720038
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм, вы там случайно Nginx не обогнали?
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39720104
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудуххм, вы там случайно Nginx не обогнали?
А причем здесь nginx?
350krps - это просто передача небольших массивов байтов туда сюда без какой либо обработки.

А вот HTTP у нас намного медленнее приведенных результатов nginx. 30krps в одном потоке и до 700 Кrps на 40 ядрах (c HT) . У nginx чуть больше 2 Mrps для такого же кол. ядер, судя по вашей ссылке. Разница - 3х.
Да, корутины и всякие С++ вкусности имеют свою цену
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39720106
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а в том синтетическом тесте в 40 потоков конечно обошли nginx - 12 Mrps
Жалко что это не HTTP
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39720126
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух,

Кстати, я посмотрел видос от David Sackstein, и из него не следует что нити (fiber) быстрее чем корутины.
Потому что внутри это одно и то же - и там и там - переключение стека через Context.
В видосе сравниваются только потоки с нитями, а не нити с корутинами.

Откуда у вас взялась цифра 30Krps так и не понятно.
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39720142
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну 30к рпс это именно про HTTP, насколько я помню
а откуда именно уже не помню
и кто там и как тестил это тоже вопрос...
по мне так это мало.

нитки кооперируются с корутинами. Он же вот что говорил:
автор# FIBERS
Логический поток выполнения. И ему нужен Scheduler (планировщик потоков выполнения).
* A fiber is a userland thread - a thread of execution that is scheduled cooperatively (main difference between fiber and thread).
* The library is organized as coroutines + manager + scheduler.
* Each fiber has its own stack.
* Like Boost Coroutine the library uses Boost Context to allocate and switch between stacks.
* Tou can choose the stack allocation strategy. The default is fixed size. The size itself is configurable.
# fibers vs threads
* At most one fiber on a thread can be running;
* Therefore a fiber does not need to protect resources from other fibers running on the same thread;
* However, if a fiber on another thread access the resource - protection is required;
* Spawning fibers does not distribute your computation across more hardware cores;
* But fibers do help you manage the division between working and waiting on a thread.
# manager
* A fiber can be in the running, suspended or ready state;
* The running fiber can call the manager to yield or suspend itself:
- when a fiber yields it moves to the ready state; // yield = оставить тред и заниматься своими делами, пока он не даст сигнал. Тогда сделать resume.
- when a fiber suspend it moves to a suspended state;
* In both cases the manager uses a scheduling algorithm to select another ready fiber to run;
* The manager performs a context switch to the selected fiber;
* If there were no ready fibers, manager blocks the thread;
* Context switching is direct, the manager runs on the source fiber.
# Scheduler Algorithm (46:35):
* There is one scheduler algorithm for all fibers in a thread;
* The scheduler's responsibility is to pick one of the ready fibers that should to run;
* The default is a round-robin scheduler among the ready fibers on the thread;
* So, by default a fiber will always be resumed on the thread where it was created;
* A blocked fiber can hovewer be awoken by another thread.
* The scheduling algorithm is an extension point. You can also implement and install your own.
* You can also install others provided by the library for instance:
- shared_work: ready fibers from all threads are treated equally;
- work_stealing: local ready fibers are selected if any, otherwise a fiber is stolen from another scheduler.
* Note that these algorithms migrate fibers between threads which requires care in protecting shared resources.

# Fiber Suspension
* A fiber can yield itself or it can suspend itself (a.k.a. block) in a number of ways:
- it can request to sleep (until a time or for a specified duration);
- use fiber synchronization objects that are defined in the library (mutexes, conditional variables and so on).
* The semantic of the synchronization object are similar to those in the std::thread library, however:
- the fiber types suspend only the current fiber. They do not block the thread (unless there are no other fibers to run).

есть ещё такое видео:
YouTube Video
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39720149
Addx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух "Основная проблема многопоточности" в следующем:
Компьютер выполняет только ОДНУ программу за раз. Точка. (конечный автомат)

На таком низком уровне слова "компьютер" и "программа" теряют смысл.
Нужно оперировать понятиями набор инструкций, кэш, спекулятивное исполнение, межядерное взаимодействие, канальность памяти.

полудухПрограмма может быть ЗАГРУЖЕНА В ПАМЯТЬ параллельно с другой, но выполняться будет только одна.


Даже команды одного потока могут исполняться параллельно. Спекулятивное исполнение называется.
Что уж говорить о процессах, которые иногда не просто исполняются параллельно, а и аппаратные ресурсы (память, диск, видеокарта) используют также параллельно.

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

В наши дни программы имеют сотни и тысячи инструкций, что нагружает то самое "бутылочное горлышко" в процессоре - блок разбора инструкций, куда они попадают в первую очередь.
И чтобы компьютер не простаивал, а был занят делом постоянно, нужно держать в памяти более 1й программы (этим уже занимается ОС). Тут встаёт вопрос об эффективном распределении ресурсов.
Потом появилась идея "а почему бы нам не воткнуть более 1го процессора в систему?" - и вот отсюда пошли проблемы с параллельным программированием (параллелизмом)...
У всех процессоров одно и тоже адресное пространство, что означает: каждый процессор может получить доступ к любому биту памяти. Т.е. память ПОЛНОСТЬЮ доступна всем процессорам одинаково.
Отсюда растут ноги у всех видов overheads и bottlenecks - попытки решить эти проблемы с эффективным управлением этими процессорами.

А самый п....ц наступает при слове "threads". Несколько потоков внутри одного процесса с пересекающимися адресными пространствами (читай: могут править одну и ту же память)...
И что тогда делать с планированием? Потоки могут одновременно получить доступ к любому биту, к любой глобальной переменной и как они там будут себя вести - сотрудничать или нет - неизвестно.
А ещё потоки они тяжёлые и ими сложно рулить = много не наделаешь.
Потоки были представлены, в первую очередь, чтобы эффективно юзать мульти-процессорные системы. Но при этом забыли полностью переосмыслить всю проблему, и это её только усугубило.
Расшаривание адресного пространства между процессами это попытка расширить UNIX-модель для решения проблемы.

"If you have to write programms which take advantage of parallelism this is where most of the mistakes are made."
Очень много нюансов надо держать в голове и поэтому легко наделать ошибок.
И ещё больше гемора вылезает, если система real-time. Потому что надо лочить процессы и потоки, разбираться с приоритетами, итд.
А ещё очень сложно дебажить многопоточные программы, в особенности потому, что нельзя получить полной точной репликации пройденного программой пути от одного запуска до другого, потому что они всегда движутся, как timing differences... Короче нет тулзов, чтобы это отследить. Единственное, что можно сделать, это запускать программу в постоянном debug-mode, что есть оверхед.
И ничего не поделаешь с этим. Можно только признать недостатки этой модели и придумать другую...


У Вас сплошная путаница. Перемешаны вопросы архитектуры железа, ОС, алгоритмов.
В процессоре нет "бутылочных горлышек". Есть менее используемые блоки, есть более.
Например блок работы с AVX инструкциями обычно "менее загружен".
К любому биту получить доступ нельзя, есть защита памяти. Аппаратная, кстати, дополнительных ресурсов на проверки выделять не нужно. Каждому процессу доступна только своя память. Внутри же процесса проблема "thread safe" решается стандартными способами, не нужно изобретать велосипеды.
Активно взаимодействующие потоки даже на разных ядрах общаются через очень быстрый кэш, не залезая в память, абсолютно прозрачно для них.
А конкретная реализация потоков - это не проблема компьютера или процессора, это проблема ОС. И в целом она вполне справляется. Не во всех сценариях, но все же.

полудухВ общем армии локов это ПЛОХО. Локи это очень ПЛОХО. Гемор это ПЛОХО. И с т.з. ОС локи тоже ПЛОХО, потому что интерфейс, который мы юзаем, это просто набор примитивов, которые не несут сильно много информации для ОС о том, а для чего этот лок. Они никогда не были спроектированы под программы для конечного юзера, они есть низкоуровневые примитивы.


С т.з. ОС сами локи - не ее проблемы. ОС все равно, для чего этот лок, ее задача обеспечить, а не угадать.

полудухТак что в unix-based-системах бОльшую часть времени мы откатываем назад к pthread -интерфейсам (pthread_mutex) и там старые механизмы, и они конечно не лучше.
Единственная вещь, которая передаётся с помощью mutex это WORD, который из потока ожидает на указанном локе. Can be attached to one specific action on which the threat is waiting.
Но тут опять человечек не сможет разгрести, т.к. придётся оперировать тысячами локов. Это просто невозможно.

fibers + coroutines + promises + future = решение всех проблем за 10% от скорости (которая нужна только Nginx & Co).

Часто локов можно избежать на архитектурном уровне при построении приложения. Я хотел сказать именно об этом.
А "решение всех проблем" - это, скажем так, слишком смелое заявление.
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39720156
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AddxУ Вас сплошная путаница.
не у меня, а у человека, который пишет компиляторы и на ночь читает чертежи процессоров.
Ulrich Drepper зовут.
но у вас конечно аппаратура лучше

В процессоре нет "бутылочных горлышек".
есть.
помимо блока инструкций, ещё например кэш
сегодняшние процессоры по скорости ~ такие же, как были в 80е годы
всё решает кэш.
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39720158
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухне у меня, а у человека, который пишет компиляторы и на ночь читает чертежи процессоров.
Ulrich Drepper зовут.
Ну, он еще PulseAudio создал. А это большой минус в карму ))
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39720834
Addx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухне у меня, а у человека, который пишет компиляторы и на ночь читает чертежи процессоров.
Ulrich Drepper зовут.
но у вас конечно аппаратура лучше


Всегда удивляли люди, которые говорят от имени других людей.

полудух
В процессоре нет "бутылочных горлышек".
есть.
помимо блока инструкций, ещё например кэш
сегодняшние процессоры по скорости ~ такие же, как были в 80е годы
всё решает кэш.

Бред сивой кобылы.
Нынешние процы даже на равной частоте рвут "процы 80х" как Тузик грелку.
И да, если считать кэш узким местом, то тогда уж лучше память считать таковым.
Да ладно память, лучше диск. )
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39720907
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Addxполудухне у меня, а у человека, который пишет компиляторы и на ночь читает чертежи процессоров.
Ulrich Drepper зовут.
но у вас конечно аппаратура лучше


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

Нынешние процы даже на равной частоте рвут "процы 80х" как Тузик грелку.
благодаря кэшу.

И да, если считать кэш узким местом, то тогда уж лучше память считать таковым.
Да ладно память, лучше диск. )
уж лучше жевать, чем говорить. Вы даже не понимаете сути. Кэш узкое место, потому что его очень легко заполнить и тогда проц станет тормозить.
Диск тут рядом не стоял, как и память.
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39721017
clihlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухКэш узкое место, потому что его очень легко заполнить и тогда проц станет тормозить.


А кеш процессора бывает не заполненный?
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39721384
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
clihltи почему вдруг процессор начнет тормозить если кеш полон?
Ну если программа написана левой ногой, то почему бы и нет
Но конечно не кэш узкое место, а внешняя память.
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39721536
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
clihltДа я ж спросил всего то ). В каких случаях кеш вообще бывает не заполненным (ну кроме старта проца) и почему вдруг процессор начнет тормозить если кеш полон?
любая программа это поток инструкций, которые помещаются в кэш, который находится внутри процессора и ему ничего не стоит в него сходить
ежели он заполнится, то инструкции будут помещаться уже во внешнюю память, до которой ему идти в десятки, а то и сотни раз дольше
такая же ситуация, как между памятью и диском (там в тысячи раз разница)
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39721621
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте мысль подкину.

Каковы накладные расходы на сидение потока (pthread) в mutex?
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39721670
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухclihltДа я ж спросил всего то ). В каких случаях кеш вообще бывает не заполненным (ну кроме старта проца) и почему вдруг процессор начнет тормозить если кеш полон?
любая программа это поток инструкций, которые помещаются в кэш, который находится внутри процессора и ему ничего не стоит в него сходить
ежели он заполнится, то инструкции будут помещаться уже во внешнюю память, до которой ему идти в десятки, а то и сотни раз дольше
такая же ситуация, как между памятью и диском (там в тысячи раз разница)
С кэшированием кода все гораздо проще чем с кэшированием данных. Тут проблемы что данные тупо не влезли (по размеру) в кэш, и что данные меняются несколькими потоками (ядрами) одновременно, т.е. кэш ядра постоянно становится невалидным.
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39721673
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухclihltДа я ж спросил всего то ). В каких случаях кеш вообще бывает не заполненным (ну кроме старта проца) и почему вдруг процессор начнет тормозить если кеш полон?
любая программа это поток инструкций, которые помещаются в кэш, который находится внутри процессора и ему ничего не стоит в него сходить
ежели он заполнится, то инструкции будут помещаться уже во внешнюю память, до которой ему идти в десятки, а то и сотни раз дольше
такая же ситуация, как между памятью и диском (там в тысячи раз разница)
значит надо по уму помещать в кеш, а не всю х..ню
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39721684
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДавайте мысль подкину.

Каковы накладные расходы на сидение потока (pthread) в mutex?
там где много корутин + fibers мьютексы не рекомендуются
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39721687
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosзначит надо по уму помещать в кеш, а не всю х..ню
в асинхронном программировании так можно и двинуться умом
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39721689
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухmaytonДавайте мысль подкину.

Каковы накладные расходы на сидение потока (pthread) в mutex?
там где много корутин + fibers мьютексы не рекомендуются
Чтобы обосновано продолжить судить классическую мультипоточность
нужно увидеть ее недостатки. Какие аргументы могут быть самыми убедительными?
- Сгорание в топке процессора мегафлопов которые расходуются не на полезную
работу.
...
Рейтинг: 0 / 0
Тяпничная будущая мультипоточность
    #39721697
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухViPRosзначит надо по уму помещать в кеш, а не всю х..ню
в асинхронном программировании так можно и двинуться умом
нет проблемы "асинхронного программирования", есть проблема "синхронизации" процессов (задач, операций,...).
сейчас воще под "асинхронным" программированием стали подразумевать вызов подпрограмм ввода/вывода и запутали народ вконец
...
Рейтинг: 0 / 0
25 сообщений из 149, страница 3 из 6
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничная будущая мультипоточность
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]