?

Log in

No account? Create an account

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

Aug. 21st, 2014

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

Previous Entry Share 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:August 21st, 2014 03:37 pm (UTC)
(Link)
"Если процессу важно знать, сколько у него ядер" - его надо переписать. ибо никто ему не гарантирует, что этих ядер вдруг не станет меньше или больше.
(Reply) (Thread)
From:ostapru
Date:August 21st, 2014 04:54 pm (UTC)
(Link)
Ну, например, всякие считалки/процессилки.
Запускать нитей больше, чем доступное количество ядер не имеет смысла. Поэтому getaffinity и запуск нитей на все доступные ядра.
Как в этом случае переписать, чтобы учитывать изменение количества ядер? Постоянно дергать getaffinity?
(Reply) (Parent) (Thread)
[User Picture]
From:drf_ckoff
Date:August 21st, 2014 05:26 pm (UTC)
(Link)
исходить из того, что количество ядер неограничено. прикинуть - после какого количества дальше плодить треды смысла не имеет и столько и делать. а дальше пусть ядро разбирается.
(Reply) (Parent) (Thread)
[User Picture]
From:tobotras
Date:August 21st, 2014 05:58 pm (UTC)
(Link)
Гхм. Если количество ядер неограничено, то есть класс задач, когда плодить треды имеет смысл именно неограниченно.
(Reply) (Parent) (Thread)
From:ostapru
Date:August 22nd, 2014 02:20 am (UTC)
(Link)
Так оно работает хреново. Если задача хорошо параллелится и синхронизация минимальна, то больше чем поток на ядро - тут же сажает производительность.
(Reply) (Parent) (Thread)
[User Picture]
From:tobotras
Date:August 21st, 2014 05:56 pm (UTC)
(Link)
Ну, нифига. Все тред пулы осмысленно делать с оглядкой на количество процессоров.
(Reply) (Parent) (Thread)
[User Picture]
From:_slw
Date:August 21st, 2014 04:51 pm (UTC)
(Link)
линуксятина какая-то
пороть на конюшне
(Reply) (Thread)
From:ostapru
Date:August 21st, 2014 04:56 pm (UTC)
(Link)
На виндах оно примерно также. Только вызов будет GetProcessAffinityMask().
(Reply) (Parent) (Thread)
[User Picture]
From:_slw
Date:August 21st, 2014 05:00 pm (UTC)
(Link)
т.е. ты даже не понял, за что пороть?
(Reply) (Parent) (Thread)
[User Picture]
From:tobotras
Date:August 21st, 2014 05:57 pm (UTC)
(Link)
Ты бы лучше снизошёл и объяснил.
(Reply) (Parent) (Thread)
[User Picture]
From:_slw
Date:August 21st, 2014 07:37 pm (UTC)
(Link)
нехорошо пользоваться менее переносимым апи при наличии более переносимого
я про pthread_getaffinity_np, например
(Reply) (Parent) (Thread)
[User Picture]
From:tobotras
Date:August 21st, 2014 08:16 pm (UTC)
(Link)
Что, по-твоему, означают буквы «np»?
(Reply) (Parent) (Thread)
[User Picture]
From:_slw
Date:August 21st, 2014 08:19 pm (UTC)
(Link)
по факту, sched_getaffinity кроме линуха нигде нет, в отличии от pthread_getaffinity_np
(Reply) (Parent) (Thread)
From:ostapru
Date:August 22nd, 2014 02:40 am (UTC)
(Link)
Ну pthread, так pthread.
IMHO, если задача переносимости не ставится, то лучше использовать родной API.
(Reply) (Parent) (Thread)
[User Picture]
From:_slw
Date:August 22nd, 2014 05:30 am (UTC)
(Link)
сегодня не ставится, а завтра -- опа и ставится.
а апи эти поди похожи как близнецы-братья, разница только в инклюдах и префиксах, т.е. все бесплатно, если сразу.
(Reply) (Parent) (Thread)
[User Picture]
From:tobotras
Date:August 22nd, 2014 05:23 am (UTC)
(Link)
Ну, по моему факту, ничего, кроме линуха, нигде нет :-P
(Reply) (Parent) (Thread)
[User Picture]
From:_slw
Date:August 22nd, 2014 05:30 am (UTC)
(Link)
да ну, это линуха нет
(Reply) (Parent) (Thread)
[User Picture]
From:alec_v
Date:August 21st, 2014 07:40 pm (UTC)
(Link)
Количество ядер может ВНЕЗАПНО поменяться, если виртуалка по-живому мигрируется в облаке на другую материнку.
(Reply) (Thread)
[User Picture]
From:tobotras
Date:August 21st, 2014 08:13 pm (UTC)
(Link)
Ну, значит, надо регулярно проверять, не поменялось ли :) Но сжимать thread pool — то ещё развлечение. Я б забил :)
(Reply) (Parent) (Thread)
[User Picture]
From:tobotras
Date:August 21st, 2014 08:14 pm (UTC)
(Link)
Оно может и вышеупомянутыми средствами ВНЕЗАПНО поменяться безо всяких виртуалок.
(Reply) (Parent) (Thread)
[User Picture]
From:d1f
Date:August 22nd, 2014 06:18 am (UTC)
(Link)
А как это правильно сделать из шелла?
Мне нужно знать N для make -jN.
(Reply) (Thread)
[User Picture]
From:tobotras
Date:August 22nd, 2014 07:52 am (UTC)
(Link)
А никак :) Ну, грепать /proc/cpuinfo или /proc/stat. Но см. выше про taskset/cgroup.
(Reply) (Parent) (Thread)