ЦКП ССКЦ ИВМиМГ СО РАН > Информация
  1. Правила работы
  2. Использование ПО
  3. Распараллеливание задач
    • Стандарт MPI
    • Стандарт OpenMP
    • Гибридный метод: MPI + OpenMP
    • Использование узлов с GPU
    • Использование узлов с Intel Xeon Phi
  4. Прочее
Чтобы узнать, сколько программа потребляет ОЗУ и насколько эффективно загружает процессорные ядра, можно использовать методы, описанные ниже.
Во время работы программы
Предварительно необходимо выяснить, на каких именно узлах работает задача. Это делается командой 'qstat -f XXXX', где XXXX - номер выполняющейся задачи. Выделенные задаче узлы будут отображаться в строке 'exec_host':
user01clu:~> qstat -f 389182
...
exec_host = cn225/0*4+cn226/0*4+cn227/0*4+cn228/0*4
...
В данном случае задача работает на узлах cn225, cn226, cn227 и cn228. '0*4' означает, что на каждом узле выделено по 4 ядра.
Далее необходимо выполнить следующие действия:
  • Зайти на используемый узел с помощью команды 'ssh':
    user01clu:~> ssh cn225
    user01cn225:~>
    Подобным образом можно зайти только на тот узел, на котором уже выполняется Ваша программа, запущенная планировщиком. Если же зайти на какой-то другой узел, то ssh-сессия будет принудительно закрыта в течении нескольких секунд.
  • Запустить команду 'top':
    user01cn225:~> top
    top - 22:56:25 up 1 day, 10:06,  1 user,  load average: 4.43, 4.44, 4.45
    Tasks: 349 total, 5 running, 344 sleeping, 0 stopped, 0 zombie
    Cpu(s): 31.8%us, 0.4%sy, 0.0%ni, 67.6%id, 0.2%wa, 0.0%hi, 0.0%si, 0.0%st
    Mem: 24684348k total, 23334268k used, 1350080k free, 119680k buffers
    Swap: 33559776k total, 0k used, 33559776k free, 7100712k cached

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    25415 user01 20 0 3835m 3.7g 15m R 101 15.6 293:43.08 fluent_mpi.13.0
    25417 user01 20 0 3776m 3.6g 15m R 101 15.3 293:58.96 fluent_mpi.13.0
    25416 user01 20 0 3945m 3.8g 15m R 99 16.0 294:04.56 fluent_mpi.13.0
    25418 user01 20 0 3961m 3.8g 15m R 99 16.1 293:17.68 fluent_mpi.13.0
    9300 root 20 0 27060 8316 1168 S 2 0.0 5:37.87 pbs_mom
    1 root 20 0 1064 412 348 S 0 0.0 0:01.92 init
    2 root 15 -5 0 0 0 S 0 0.0 0:00.02 kthreadd
    ...
    В данном случае видно, что:
    1. Работают 4 процесса пользователя user01, каждый из которых потребляет около 3.7 ГБ ОЗУ (столбец RES) и полностью загружает одно ядро (столбец %CPU).
    2. Всеми процессами (включая операционную систему) на узле суммарно используется 23334268 КБ ОЗУ из имеющихся 24684348 КБ.
    3. Виртуальная память (SWAP) на узле не используется.
  • Полное потребление памяти, включая виртуальную, отображается в столбце VIRT
  • Если число в столбце RES не имеет суффикса g или m, то это значение в килобайтах.
  • Чтобы прервать работу утилиты top, необходимо нажать Ctrl-C
Загруженность GPU
При выполнении вычислений на GPU cтепень загруженности GPU можно узнать с помощью утилиты nvidia-smi. Для этого необходимо:
  • Определить, какой виртуальный узел (vnode) выделен задаче. Из него получить имя соответствующего сервера и номер GPU (от 0 до 2).
  • Командой 'ssh' зайти с интерфейсного сервера на узел с GPU, на котором работает задача.
  • Выполнить следующую команду, заменив 'X' на номер GPU:
    nvidia-smi -i X --query-gpu=utilization.gpu --format=csv,noheader
    Например, нас интересует задача с номером 3437445. Чтобы узнать выделенные задаче виртуальные узлы, выполняем на интерфейсном сервере:
    user01clu:~> qstat -f 3437445|tr -d '\n'' ''\t'|sed 's/Hold_Types.*//'|sed 's/.*exec_vnode=//'|tr -d \(\)|tr + '\n'|sed 's/:.*//'|sort
    Допустим, команда выведет:
    sl003[0]
    sl003[1]
    sl003[2]
    Т.е. задача иcпользует все три GPU на узле sl003. Переходим с интерфесного сервера на узел sl003:
    user01clu:~> ssh sl003
    Чтобы узнать степень загруженности всех GPU, выполняем:
    user01sl003:~> nvidia-smi -i 0 --query-gpu=utilization.gpu --format=csv,noheader
    user01sl003:~> nvidia-smi -i 1 --query-gpu=utilization.gpu --format=csv,noheader
    user01sl003:~> nvidia-smi -i 2 --query-gpu=utilization.gpu --format=csv,noheader
После завершения работы
Выполнить команду 'tracejob XXX', где 'XXX' - номер задачи. Эта команда анализирует логи PBS и выводит информацию, связанную с работой указанной задачи. По умолчанию обрабатываются данные только за последний день. Если задача закончилась несколько дней назад или Вы хотите получить данные, начиная с момента постановки задачи в очередь, то надо дополнительно указать параметр '-n ZZZ', где 'ZZZ' - количество дней, прошедших с данного момента, логи за которые должна проанализировать команда.
Пример: запрос информации по задаче с номером 482685 за два прошедших дня:
tracejob -n 2 482685
...
11/19/2013 06:05:04 A user=user01 group=users project=_pbs_project_default jobname=runs queue=bl2x220g7q ctime=1384777907
qtime=1384777907 etime=1384777907 start=1384777908 exec_host=cn263/0 exec_vnode=(cn263:mem=4194304kb:ncpus=1)
Resource_List.mem=4gb Resource_List.ncpus=1 Resource_List.nodect=1 Resource_List.place=pack
Resource_List.qlist=bl2x220g7q Resource_List.select=1:mem=4gb:ncpus=1:qlist=bl2x220g7q
Resource_List.walltime=100:00:00 session=10647 end=1384815904 Exit_status=271 resources_used.cpupercent=98
resources_used.cput=10:33:16 resources_used.mem=1321292kb resources_used.ncpus=1 resources_used.vmem=2144544kb
resources_used.walltime=10:33:17 run_count=1
Здесь видно, в частности, что задача:
  • Запросила 1 ядро (Resource_List.ncpus) и 4 ГБ ОЗУ (Resource_List.mem)
  • Но ОЗУ использовалась крайне неэффективно: resources_used.mem=1321292kb, т.е. примерно 1.26 ГБ из 4 ГБ запрошенных. Что означает, что 2.5 ГБ из зарезервированных PBS под эту задачу, не использовались и при этом были недоступны другим пользователям.
Время работы команды 'tracejob' зависит от временного интервала, за который запрашивается информация.
Если с момента завершения задачи прошло не очень много времени, то можно также открыть веб-интерфейс Ganglia и посмотреть на графики работы. Однако, чем больше прошло времени, тем сложнее будет по графикам определить период работы задачи.