LINUX.ORG.RU

Насколько работа в 30 потоках дороже работы в 4?


0

1

Если на машине всего 4 ядра, то при необходимости обработки 30 очередей заданий нет смысла запускать 30 потоков. В современных HTTP-серверах, как я знаю, никогда не запускается потоков больше, чем кол-во ядер, но в HTTP-серверах количество соединений очень велико, поэтому разницу между 4 потоками и сотнями тысяч потоков (если бы по 1 потоку на соединение) разработчик HTTP-сервера увидит невооружённым глазом. Это всё мои предположения.

Меня интересует разница между 4, 30 и 100000 НЕСПЯЩИМИ потоками в системе (спящие можно не учитывать, т.к. насколько я понимаю, шедулер им не передаёт управление вообще, пока они в особом состоянии спанья, например таймер ждут, который раз в секунду срабатывает или пакет в сетевуху).

Когда конфигуришь ядро, там есть число - частота переключений потоков (процессов, потоки в linux переключаются тем же «движком», что и процессы). Допустим там стоит 250 Гц.

То есть ядро ставит таймер на 1/250 и по прерыванию шедулер передаёт управление новому неспящему потоку.

Правильно я понимаю, что если у меня 250 неспящих потоков, выполняющих одни и те же суровые вычисления и одно ядро ЦП, то каждый будет получать управление раз в секунду на интервал, равный 1/250 секунды? А если у меня 2 потока, то каждый в течение 1с получит управление 125 раз на 1/250 сек?

Верно ли то, что сколько бы потоков в системе у меня ни было (1 или 1000000), операция переключения потоков (в коде шедулера) будет жрать одно и то же количество процессора? Ведь она тупо выполняется с частотой 250 Гц. С повышением количества потоков каждый поток просто будет иметь меньше времени, да?

А вот в каком направлении думать, когда мне интересно, какая разница между такими схемами:

Есть 100 очередей заданий и 2 ядра. Я могу запустить 2 потока, в которых по очереди брать задание из очереди или запустить 100 потоков, в каждом из которых сразу начать обрабатывать одно задание?

В современных HTTP-серверах, как я знаю, никогда не запускается потоков больше, чем кол-во ядер

Ой, да ладно: у меня и по 50 потоков httpd висело (а в простое висит 9)...

А насчет распараллеливания, учитывая то, что ваши потоки периодически будут прерываться другими, есть смысл немного увеличить количество потоков для увеличения производительности. Я, например, для кое-каких вычислений подобрал цифру в 6..8 потоков (чаще ставлю 8) для четырех ядер. Меньшее количество потоков может вызвать более частое их прерывание, большее - замедлит выполнение.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от anonymous

Кстати, насчет niceness: запускаю octave с nice == 20, но от глобальных зависонов и глюков меня это не спасает (что и понятно: когда оперативка кончается, глюки независимо от этого начинаются и oom-killer выпускает свою автоматную очередь).

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

Eddy_Em ☆☆☆☆☆
()

У тебя потоки вычислительные или с большим количеством операций ввода-вывода?

dave ★★★★★
()

а вытеснение из памяти и кэша процессора?

namezys ★★★★
()

Кстати, еще это сильно зависит от сложности вычислений: распараллеливание операций сложения двух изображений ощутимого прироста производительности не даст.

Eddy_Em ☆☆☆☆☆
()

Когда конфигуришь ядро, там есть число - частота переключений потоков (процессов, потоки в linux переключаются тем же «движком», что и процессы). Допустим там стоит 250 Гц.

Ты говоришь про частоту системного/локального таймера. В общем случае задачи переключаются не только по его тикам.

Правильно я понимаю, что если у меня 250 неспящих потоков, выполняющих одни и те же суровые вычисления и одно ядро ЦП, то каждый будет получать управление раз в секунду на интервал, равный 1/250 секунды? А если у меня 2 потока, то каждый в течение 1с получит управление 125 раз на 1/250 сек?

Если кроме таймера других причин для переключения не будет, то наверное так. Насколько я вижу, соответствующий таймер tick_cpu_sched ставится на 1/HZ сек.

Верно ли то, что сколько бы потоков в системе у меня ни было (1 или 1000000), операция переключения потоков (в коде шедулера) будет жрать одно и то же количество процессора? Ведь она тупо выполняется с частотой 250 Гц.

Нет, т.к. в некоторых классах планирования есть зависящие от количество процессов ф-ции pre_/post_schedule. Насколько разница существенна, сказать не берусь. Может быть, настолько маленькая, что ты ее вообще не заметишь.

Есть 100 очередей заданий и 2 ядра. Я могу запустить 2 потока, в которых по очереди брать задание из очереди или запустить 100 потоков, в каждом из которых сразу начать обрабатывать одно задание?

Можешь и то, и другое.

ttnl ★★★★★
()
Ответ на: комментарий от kiverattes

Тогда ориентируйся по числу ядер.

dave ★★★★★
()

Все слышали такое выражение, что переключение контекста - это дорого. Но современные OS не юзают автоматику TTS, сами копируют содержимое регистров туда-обратно, но таких операций в целом всего 250 в секунду. Неужели это дорого? Может быть смысл этого выражения в том, что сбивается кеш или конвееры ЦП? Кто в курсе? :)

kiverattes ★☆
() автор топика
Ответ на: комментарий от kiverattes

Речь шла о системных вызовах - на каждый системный вызов будет 2 переключения контекста, и поэтому некоторые вызовы стоит «экономить», если оно возможно.

anonymous
()

Верно ли то, что сколько бы потоков в системе у меня ни было (1 или 1000000), перация переключения потоков (в коде шедулера) будет жрать одно и то же количество процессора? Ведь она тупо выполняется с частотой 250 Гц. С повышением количества потоков каждый поток просто будет иметь меньше времени, да?

да верно - при учете того что процессы просто про себя чтото думают - недергают сисколы
с несколькими но - колво потоков влияет на обьем системной инфы (+стек для каждого) который расходуеться в системе + увеличение времени на выбор нужного при переключении

Есть 100 очередей заданий и 2 ядра. Я могу запустить 2 потока, в которых по очереди брать задание из очереди или запустить 100 потоков, в каждом из которых сразу начать обрабатывать одно задание?

особой разници нет - кроме потребление дополнительной памяти
и еще - если в системе нет групирования процессов - то 100 одновременно работающих процессов весьма сильно будут мешать другим процессам чтото делать


в если процессы работают и дергают вызовы ядра - то колво контент свитчей будет крайне высоким при бальшом колве потоков - что отразиться на эффективной тех же самых кешей процессора

ae1234 ★★
()
Ответ на: комментарий от Karapuz

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

anonymous
()

На 26 потоков.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.