Как определить, какие процессоры подключены к сети в Linux

#c #linux

Вопрос:

В Linux функции C sysconf(_SC_NPROCESSORS_CONF) и get_nprocs_conf() возвращают количество логических процессоров, настроенных в системе, в то время sysconf(_SC_NPROCESSORS_ONLN) get_nprocs() как и возвращают количество доступных в настоящее время логических процессоров.

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

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

Существует ли функция пользовательского режима, которая перечисляет идентификаторы процессоров или выдает маску со всеми доступными процессорами?

Или, если такой функции пользовательского режима нет, насколько безопасно предполагать, что количество настроенных и доступных процессоров одинаковы?

Комментарии:

1. Будет ли для вас работать быстрый и грязный анализ /proc/cpuinfo ?

2. Предпочтительно нет, так как это включает в себя разбор текста. Я ищу быструю встроенную функцию. Поискав в Интернете, я нашел for_each_cpu , но в моем Debian Linux, похоже, этого нет (или, может быть, это только для разработки ядра).

3. I'm looking for a fast native function Напишите свой собственный модуль ядра. found for_each_cpu for_each_cpu является функцией внутри исходного кода ядра. Снаружи это недоступно.

4. Я просто смотрю, как получить доступ к этой информации из пользовательского режима. Или можно с уверенностью предположить, что в пользовательском режиме настроенные и доступные процессоры одинаковы?

Ответ №1:

Я не знаю, существуют ли какие-либо API для получения этой информации, но в пользовательском пространстве вы можете просто использовать /sys/устройства/система/процессор/ для получения различной информации о процессоре

 cat /sys/devices/system/cpu/offline # get the list of offline CPUs
cat /sys/devices/system/cpu/online  # get the list of online CPUs
ls -ld /sys/devices/system/cpu/cpu* # get the list of CPUs
cat /sys/devices/system/cpu/cpu*/online # print individual CPU's online/offline status
 

В C вы можете открыть эти файлы и проанализировать их содержимое

См. также Подключение центрального процессора в ядре

Комментарии:

1. Я хотел избежать разбора файлов, но ваше последнее предложение довольно простое, так как каждый файл содержит только 0 или 1. Однако cpu0, похоже, не включен. Когда я запускаю cat /sys/devices/system/cpu/cpu*/online|wc -l свою систему, я получаю 19, в то время как у меня 20 логических процессоров.

2. @BrechtSanders это странно. Я проверил много систем, и всегда есть CPU0. Я сам тоже не люблю читать sysfs, но многие проекты в моей компании используют его для чтения данных

3. Да, всегда есть CPU0, но в большинстве случаев его нельзя перевести в автономный режим, поэтому /sys/devices/system/cpu/cpu0/online статуса нет

Ответ №2:

Кроме /sys/devices/system/cpu того , существуют различные псевдофайлы для запроса и вывода cpu в онлайн/оффлайн. /sys/devices/system/cpu/online предоставляет вам список диапазонов, разделенных запятыми:

 $ cat /sys/devices/system/cpu/online
0-6,8-9,11,13-15
 

Вы можете расширить диапазоны с помощью чего-то вроде этого:

 $ perl -pe 's/(d )-(d )/join(",",$1..$2)/eg' /sys/devices/system/cpu/online
0,1,2,3,4,5,6,8,9,11,13,14,15