The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Автоматическое определение в Linux количества процессорных ядер из скрипта
Данный подход можно применять для обработки данных на компьютерных системах с
разным количеством процессорных ядер и использовать для параллелизации
обработки данных по усмотрению.

Пример скрипта с использованием cppcheck (статический анализ исходников в
несколько потоков, опция -j)


Пример скрипта с использованием cppcheck

   #!/bin/sh

   COUNT=$(cat /proc/cpuinfo | grep 'model name' | sed -e 's/.*: //' | wc -l)
   echo "number of detected CPUs =" $COUNT

   cppcheck -j $COUNT --force --inline-suppr . 2>errors.txt


вариант от Vee Nee

   COUNT=$(lscpu -p=cpu | grep -v \\# | wc -l)

вариант от pavlinux:

   COUNT=$(getconf _NPROCESSORS_ONLN)

дополнение от Andrey Mitrofanov:

   COUNT=$(egrep -c '^processor' /proc/cpuinfo)
 
18.08.2012 , Автор: Карбофос
Ключи: cpu, cppcheck, shell / Лицензия: CC-BY
Раздел:    Корень / Программисту и web-разработчику / Shell / Готовые скрипты

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, Андрей (??), 23:05, 19/08/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Хмм.. А зачем?? Типа каждый день отсылать статистику по кол-ву процов на мыло админа?? Плюс еще график от рисовать :)
    Было бы неплохо описать задачу с которой столкнулись и для чего это?? Загрузку процессоров, понятно для чего в автоматическом режиме, но кол-во... Что-то я не догоняю - подскажите??
     
     
  • 2.3, Карбофос (ok), 23:19, 19/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    например, для параллельной обработки фотографий
    отчасти проблематика была затронута здесь http://www.opennet.me/tips/info/2498.shtml
    то есть, немного переписав скрипт, его можно применять универсально для разных компов, с различным кол-вом процессоров
     
     
  • 3.7, Андрей (??), 04:53, 20/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Далек от этой темы.. Пока далек.. Но кто знает когда потребуется.. Спасибо :)
    В любом случае, чтобы избежать подобных глупых вопросов, не помешало бы описание 'проблемы' в начале 'типса' :)
    Спасибо еще раз..
     
     
  • 4.13, Карбофос (ok), 12:45, 20/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    это нужно для параллельного запуска заданий по обработке данных, для полного использования компьютерных ресурсов.
    как раз с cppcheck и был приведен пример: запускается несколько параллельных потоков статической проверки исходников
     
  • 2.23, Аноним (-), 21:19, 22/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Например чтобы make пинать с нужным -j. Ну так, самый очевидный вариант :)
     

  • 1.2, Vee Nee (?), 23:11, 19/08/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Как вариант:
    COUNT=$(lscpu -p=cpu | grep -v \# | wc -l)

    Не понимаю только, для чего вырезание заголовка строки sed-ом, вариант без него что-то упускает?
    COUNT=$(grep 'model name' /proc/cpuinfo | wc -l)

     
     
  • 2.4, Карбофос (ok), 23:25, 19/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    благодарю за дополнение!
    нет, не упускает. видимо, sed еще использовался для того, чтобы выдавать имя процессора, после этого просто ничего не меняли :)
     
  • 2.9, pavlinux (ok), 05:49, 20/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    COUNT=$(('lscpu -p=cpu | tail -1'+1))

     
  • 2.11, Andrey Mitrofanov (?), 09:58, 20/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Не понимаю только, для чего вырезание заголовка строки sed-ом, вариант без него что-то упускает?

    А wc?!%)

    > COUNT=$(grep 'model name' /proc/cpuinfo | wc -l)

    egrep -c '^processor' /proc/cpuinfo

     
     
  • 3.12, Карбофос (ok), 10:35, 20/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    кстати, тоже хорошая идея использовать как можно меньше утилит, мерси за сие!
    grep -c '^processor' /proc/cpuinfo
     
  • 2.25, Аноним (-), 10:38, 23/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    как все сложно в ваших линухах, толи дело во фре:
    sysctl kern.smp.cpus
     

  • 1.6, pavlinux (ok), 03:49, 20/08/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Кто больше вариантов определения процов?




    #!/bin/sh

      # Вот этот самый Юникс-вей фен-шуйный, POSIX IEEE Std 1003.1-2001, все дела...

      getconf _NPROCESSORS_ONLN;

      # А дальше скриптодрочка.
      echo $(('cat /sys/devices/system/cpu/online | cut -d"-" -f2'+1));
      dmesg | grep "processors activated" | cut -d" " -f3;


    Хардкор мазафака кульхацкер метод



    #!/bin/sh

    cat >> /tmp/cpus.c << EOF
    #include <stdio.h>
    #include <unistd.h>

    int main(void) {

         printf("%ld\n", sysconf(_SC_NPROCESSORS_ONLN));

    return 0;
    }
    EOF
    gcc /tmp/cpus.c -o /tmp/cpus;

    export CPU=$(/tmp/cpus)



     
     
  • 2.8, pavlinux (ok), 05:04, 20/08/2012 [^] [^^] [^^^] [ответить]  
  • +/



    #!/bin/sh

    sed -ne '/processor/p;' /proc/cpuinfo | wc -l;
    awk '/processor/{x++}; END {print x}' /proc/cpuinfo;



     
  • 2.10, Карбофос (ok), 07:10, 20/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    с комуляцией - вообще жесть.
    спасибо за варианты :)

    слушай, а он разве в /proc/cpuinfo как раз не показывает только активированные процы?

     
     
  • 3.18, pavlinux (ok), 01:09, 21/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Да, только онлайновые!

    Где-то там: http://lxr.free-electrons.com/source/arch/x86/kernel/cpu/proc.c#L141

     
     
  • 4.21, Карбофос (ok), 00:52, 22/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    ну вот и речь об чем: нефиг забор городить из нескольких скриптов
     
     
  • 5.22, pavlinux (ok), 04:05, 22/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    # getconf _NPROCESSORS_ONLN;

    как раз делает вот это

    # echo $(('cat /sys/devices/system/cpu/online | cut -d"-" -f2'+1));

    только тебе не видно :)

    $ strace -e open getconf _NPROCESSORS_ONLN 2>&1 | grep sys

    open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3

     

  • 1.14, Анонимуз (?), 15:24, 20/08/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Процов? Насколько я заметил, тут речь идет исключительно о количестве ядер.
    Ну, я понимаю, что обычно не количество сокетов интересует, а именно ядра, но почему бы так и не написать сразу?
     
     
  • 2.15, Карбофос (ok), 15:41, 20/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    это принципиально что-то меняет?
    для меня лично ядро=процессор. точка.
    можно, конечно, вступить в бессмысленный диспут, в том числе и затронуть HT.
     
     
  • 3.16, Анонимуз (?), 16:37, 20/08/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Для большинства людей операционная система = винда, а название статьи не соответствует содержимому.
    Не-не, спорить тут не о чем, все хорошо.
     
     
  • 4.30, Michael Shigorin (ok), 17:39, 24/08/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Для большинства людей операционная система = винда

    Большинство людей таких слов-то не знают, из наблюдений...

     
     
  • 5.38, Аноним (-), 19:05, 27/10/2012 [^] [^^] [^^^] [ответить]  
  • +/
    >> Для большинства людей операционная система = винда
    > Большинство людей таких слов-то не знают, из наблюдений...

    А должны были?

     
     
  • 6.39, Michael Shigorin (ok), 20:14, 27/10/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > А должны были?

    Здесь -- да, наверное.

     
  • 2.17, Andrey Mitrofanov (?), 23:22, 20/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > но почему бы так и не написать сразу?

    А в "процессора-а-ах" я зничиительно длинннее! <.)>

     
     
  • 3.24, pavlinux (ok), 02:42, 23/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    А двайте регистрами меряться?!
     
     
  • 4.32, Аноним (-), 21:01, 24/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    И сколько сантиметров у тебя регистр?
     
     
  • 5.33, pavlinux (ok), 05:18, 26/08/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > И сколько сантиметров у тебя регистр?

    strlen("sizeof(register);");

     

  • 1.19, АнонимусРекс (?), 00:10, 22/08/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    а где разделение на треды?
     
     
  • 2.20, Карбофос (ok), 00:50, 22/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    если шапка жмёт - дополни
     
     
  • 3.27, Michael Shigorin (ok), 02:55, 24/08/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > если шапка жмёт - дополни

    Вообще в первом же Вашем примере наблюдается избыточное применение cat(1), да и остального:

    echo "CPU cores available: 'grep -c ^processor /proc/cpuinfo'"

    А для адаптивного параллельного выполнения лучше сразу смотреть на parallel(1) или paexec(1).

     
     
  • 4.31, Карбофос (ok), 18:04, 24/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    >echo "CPU cores available: 'grep -c ^processor /proc/cpuinfo'"

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

     

  • 1.26, DelGod (?), 20:56, 23/08/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Количество физических процессоров
    grep 'physical id' /proc/cpuinfo | sort -u | wc -l

    Количиство Ядер в каждом из процесоров
    grep 'core id' /proc/cpuinfo | sort -u | wc -l

     
     
  • 2.34, pavlinux (ok), 05:41, 26/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Количество физических процессоров
    > grep 'physical id' /proc/cpuinfo | sort -u | wc -l

    Да не, жирно слишком - и grep, и sort, и wc...  

    $ getconf _NPROCESSORS_ONLN;


    > Количиство Ядер в каждом из процесоров
    > grep 'core id' /proc/cpuinfo | sort -u | wc -l

    12
    4
    8

    А че, на моем кластере и 4-х ядерные есть и 8-ми и 12... :)


     

  • 1.28, zumm (?), 17:32, 24/08/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    гыгы

    #!/bin/sh
    cat >> /tmp/cpus.f90 << EOF
    program cpus_num
    use omp_lib
    write (*,*) omp_get_num_procs()
    end program cpus_num
    EOF

    gfortran /tmp/cpus.f90 -fopenmp -o /tmp/cpus;
    /tmp/cpus

     
     
  • 2.29, Michael Shigorin (ok), 17:38, 24/08/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > -fopenmp

    Этак недалеко до "поставить оракл и сделать запрос". :)

    (напомнило анекдот про выяснение чётности числа различными программистами)

     
     
  • 3.35, pavlinux (ok), 05:54, 26/08/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > (напомнило анекдот про выяснение чётности числа различными программистами)

    Как-то лет 12-13 назад, мерились в фидо, в RU.LINUX, кто-сколько,
    придумает способов замены команды ls


     
     
  • 4.37, Crazy Alex (ok), 11:47, 06/09/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Мне, кстати, такие извращения когда-то пригодились - надо было разобраться с железкой, в которой было что-то адски ограниченное в роли шелла - в частности, ls не было. Обходился "echo *" и подобными.
     

  • 1.36, ананим (?), 00:14, 29/08/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    ну тады и от меня добавь:
    1)
    $ cat /sys/devices/system/cpu/online
    0-7
    $ cat /sys/devices/system/cpu/offline
    $ cat /sys/devices/system/cpu/possible
    0-7
    $ cat /sys/devices/system/cpu/present
    0-7
    2)
    # dmidecode -t processor|grep Thread
    Thread Count: 8
    # dmidecode -t processor|grep Core
    Family: Core i7
    Version: Intel(R) Core(TM) i7-3610QM CPU @ 2.30GHz
    Core Count: 4
    Core Enabled: 4
     
  • 1.40, sailor (??), 22:56, 05/05/2013 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    COUNT=$(sed -ne '/processor/p;' /proc/cpuinfo | wc -l)
     
  • 1.41, ziplex (?), 15:18, 26/09/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Забыли про утилиту nproc
     


     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру