Вы читаете свой журнал

Оживший юзерпик - Линуксовое

авг. 21, 2014

06:24 pm - Линуксовое

Previous Entry Редактировать запись Редактировать метки В избранное Поделиться Отслеживать Next Entry

У линукса есть несколько механизмов ограничить процесс в доступных процессорных ядрах. Как минимум, cgroup и taskset. Если процессу важно знать, сколько у него ядер (чтобы сконфигурировать thread pool или ещё зачем-нибудь), то наивный способ -- прочитать /proc/cpuinfo. Он неправильный. Менее наивный -- позвать sysconf(_SC_NPROCESSORS_ONLN). Он тоже неправильный. Правильный -- вот:

  long num_processor_configured = sysconf (_SC_NPROCESSORS_CONF); /* list the number of processors configured */
  long num_processor_available;
  cpu_set_t mask;

  if (sched_getaffinity(0, sizeof(cpu_set_t), &mask) == 0) {
	num_processor_available = CPU_COUNT(&mask);
  } else {
	num_processor_available = sysconf(_SC_NPROCESSORS_ONLN);
  }

Comments:

[User Picture]
From:drf_ckoff
Date:21 Август 2014 18:37 (местное)
Удалить Spam Скрыть Заморозить Отслеживать
(Link)
"Если процессу важно знать, сколько у него ядер" - его надо переписать. ибо никто ему не гарантирует, что этих ядер вдруг не станет меньше или больше.
(Ответить) (Thread)
From:ostapru
Date:21 Август 2014 19:54 (местное)
Удалить Spam Скрыть Заморозить Отслеживать
(Link)
Ну, например, всякие считалки/процессилки.
Запускать нитей больше, чем доступное количество ядер не имеет смысла. Поэтому getaffinity и запуск нитей на все доступные ядра.
Как в этом случае переписать, чтобы учитывать изменение количества ядер? Постоянно дергать getaffinity?
(Ответить) (Parent) (Thread)
[User Picture]
From:drf_ckoff
Date:21 Август 2014 20:26 (местное)
Удалить Spam Скрыть Заморозить Отслеживать
(Link)
исходить из того, что количество ядер неограничено. прикинуть - после какого количества дальше плодить треды смысла не имеет и столько и делать. а дальше пусть ядро разбирается.
(Ответить) (Parent) (Thread)
[User Picture]
From:tobotras
Date:21 Август 2014 20:58 (местное)
Редактировать Удалить Скрыть Заморозить Отслеживать
(Link)
Гхм. Если количество ядер неограничено, то есть класс задач, когда плодить треды имеет смысл именно неограниченно.
(Ответить) (Parent) (Thread)
From:ostapru
Date:22 Август 2014 05:20 (местное)
Удалить Spam Скрыть Заморозить Отслеживать
(Link)
Так оно работает хреново. Если задача хорошо параллелится и синхронизация минимальна, то больше чем поток на ядро - тут же сажает производительность.
(Ответить) (Parent) (Thread)
[User Picture]
From:tobotras
Date:21 Август 2014 20:56 (местное)
Редактировать Удалить Скрыть Заморозить Отслеживать
(Link)
Ну, нифига. Все тред пулы осмысленно делать с оглядкой на количество процессоров.
(Ответить) (Parent) (Thread)
[User Picture]
From:_slw
Date:21 Август 2014 19:51 (местное)
Удалить Spam Скрыть Заморозить Отслеживать
(Link)
линуксятина какая-то
пороть на конюшне
(Ответить) (Thread)
From:ostapru
Date:21 Август 2014 19:56 (местное)
Удалить Spam Скрыть Заморозить Отслеживать
(Link)
На виндах оно примерно также. Только вызов будет GetProcessAffinityMask().
(Ответить) (Parent) (Thread)
[User Picture]
From:_slw
Date:21 Август 2014 20:00 (местное)
Удалить Spam Скрыть Заморозить Отслеживать
(Link)
т.е. ты даже не понял, за что пороть?
(Ответить) (Parent) (Thread)
[User Picture]
From:tobotras
Date:21 Август 2014 20:57 (местное)
Редактировать Удалить Скрыть Заморозить Отслеживать
(Link)
Ты бы лучше снизошёл и объяснил.
(Ответить) (Parent) (Thread)
[User Picture]
From:_slw
Date:21 Август 2014 22:37 (местное)
Удалить Spam Скрыть Заморозить Отслеживать
(Link)
нехорошо пользоваться менее переносимым апи при наличии более переносимого
я про pthread_getaffinity_np, например
(Ответить) (Parent) (Thread)
[User Picture]
From:tobotras
Date:21 Август 2014 23:16 (местное)
Редактировать Удалить Скрыть Заморозить Отслеживать
(Link)
Что, по-твоему, означают буквы «np»?
(Ответить) (Parent) (Thread)
[User Picture]
From:_slw
Date:21 Август 2014 23:19 (местное)
Удалить Spam Скрыть Заморозить Отслеживать
(Link)
по факту, sched_getaffinity кроме линуха нигде нет, в отличии от pthread_getaffinity_np
(Ответить) (Parent) (Thread)
From:ostapru
Date:22 Август 2014 05:40 (местное)
Удалить Spam Скрыть Заморозить Отслеживать
(Link)
Ну pthread, так pthread.
IMHO, если задача переносимости не ставится, то лучше использовать родной API.
(Ответить) (Parent) (Thread)
[User Picture]
From:_slw
Date:22 Август 2014 08:30 (местное)
Удалить Spam Скрыть Заморозить Отслеживать
(Link)
сегодня не ставится, а завтра -- опа и ставится.
а апи эти поди похожи как близнецы-братья, разница только в инклюдах и префиксах, т.е. все бесплатно, если сразу.
(Ответить) (Parent) (Thread)
[User Picture]
From:tobotras
Date:22 Август 2014 08:23 (местное)
Редактировать Удалить Скрыть Заморозить Отслеживать
(Link)
Ну, по моему факту, ничего, кроме линуха, нигде нет :-P
(Ответить) (Parent) (Thread)
[User Picture]
From:_slw
Date:22 Август 2014 08:30 (местное)
Удалить Spam Скрыть Заморозить Отслеживать
(Link)
да ну, это линуха нет
(Ответить) (Parent) (Thread)
[User Picture]
From:livejournal
Date:21 Август 2014 19:53 (местное)
Удалить Spam Раскрыть Заморозить Отслеживать

У линукса есть несколько механизмов ограничить процес

(Link)
Пользователь boza_revenge сослался на вашу запись в своей записи «У линукса есть несколько механизмов ограничить процесс в доступных процессорных ядрах.» в контексте: [...] amp;mask); } else { num_processor_available = sysconf(_SC_NPROCESSORS_ONLN); } --- Оригинал вот [...]
(Раскрыть для ответа) (Thread)
[User Picture]
From:alec_v
Date:21 Август 2014 22:40 (местное)
Удалить Spam Скрыть Заморозить Отслеживать
(Link)
Количество ядер может ВНЕЗАПНО поменяться, если виртуалка по-живому мигрируется в облаке на другую материнку.
(Ответить) (Thread)
[User Picture]
From:tobotras
Date:21 Август 2014 23:13 (местное)
Редактировать Удалить Скрыть Заморозить Отслеживать
(Link)
Ну, значит, надо регулярно проверять, не поменялось ли :) Но сжимать thread pool — то ещё развлечение. Я б забил :)
(Ответить) (Parent) (Thread)
[User Picture]
From:tobotras
Date:21 Август 2014 23:14 (местное)
Редактировать Удалить Скрыть Заморозить Отслеживать
(Link)
Оно может и вышеупомянутыми средствами ВНЕЗАПНО поменяться безо всяких виртуалок.
(Ответить) (Parent) (Thread)
[User Picture]
From:d1f
Date:22 Август 2014 09:18 (местное)
Удалить Spam Скрыть Заморозить Отслеживать
(Link)
А как это правильно сделать из шелла?
Мне нужно знать N для make -jN.
(Ответить) (Thread)
[User Picture]
From:tobotras
Date:22 Август 2014 10:52 (местное)
Редактировать Удалить Скрыть Заморозить Отслеживать
(Link)
А никак :) Ну, грепать /proc/cpuinfo или /proc/stat. Но см. выше про taskset/cgroup.
(Ответить) (Parent) (Thread)

Mass Action

Групповое действие над комментариями: