2015-09-12 5 views
2

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

Во-вторых, я думал, что у меня может быть «свободное время» или «смотреть ps aux» в моем файле сценария, но теперь я думаю, что если это заставит мою поданную работу застрять в сценарии просмотра памяти и никогда не переходите к главной линии, которая вызывает мою параллельную программу.

В конце концов, как я могу добиться регистрации моей памяти в PBS для заданий, которые я отправляю. Мой код - это программа на C++, использующая библиотеку MRMPI (MPI MapReduce).

+1

Вы используете исключительно узлы?Если это так, вы можете использовать информацию об использовании памяти, собранную самим PBS, что кажется намного проще, чем повторение этой функции в вашем скрипте. –

+1

Как я могу получить доступ к информации, собираемой PBS? Также я не хочу только окончательную отчетность, мне нужно понять, как изменяется потребление памяти в течение периода запуска программы. Я хочу посмотреть, какая функция Map или Reduce в моей программе вызывает проблему. – armen

+1

Увы, извините, я не проверял, какая информация доступна на выходе 'pbsnodes -a'. В поле «состояние» с крутящим моментом сообщается только среднее значение нагрузки, а в 'PBS Pro' сообщается только' assign.mem'. –

ответ

1

Чтобы узнать, сколько памяти используется на протяжении работы, запустите qstat -f:

$ qstat -f | grep used 
    resources_used.cput = 00:02:51 
    resources_used.energy_used = 0 
    resources_used.mem = 6960kb 
    resources_used.vmem = 56428kb 
    resources_used.walltime = 00:01:26 

Чтобы исследовать прошлые работы вы можете посмотреть в файл учета. Он находится в каталоге server_priv/accounting, по умолчанию используется/var/spool/torque/server_priv/accounting /.

Записи выглядеть следующим образом:

09/14/2015 10:52:11;E;202.napali;user=dbeer group=company jobname=intense.sh queue=batch ctime=1442248534 qtime=1442248534 etime=1442248534 start=1442248536 [email protected] exec_host=napali/0-2 Resource_List.neednodes=1:ppn=3 Resource_List.nodect=1 Resource_List.nodes=1:ppn=3 session=20415 total_execution_slots=3 unique_node_count=1 end=0 Exit_status=0 resources_used.cput=1989 resources_used.energy_used=0 resources_used.mem=9660kb resources_used.vmem=58500kb resources_used.walltime=995

+0

спасибо. qstat -f не показывает статистику, пока моя работа работает до тех пор, пока она не закончится (закончилась нехватка памяти), она занимает всего несколько секунд, а затем показывает полное использование памяти за этот период времени. (Возможно, потому что это занимает всего несколько секунд. pbs не обновляет данные до тех пор, пока не дойду до ошибки и не завершу?) Мне нужно посмотреть, как она меняется каждую секунду, когда работа выполняется. Также у меня нет доступа к каталогу server_priv, дается разрешение на отказ. – armen

+1

Информация об использовании обновляется каждые 45 секунд по умолчанию, поэтому что-то, что осталось всего на несколько секунд, не получит ее до конца задания. Журнал учета также доступен только после задания. Чтобы получить такую ​​вещь каждую секунду, вам нужно будет сделать что-то обычай. – dbeer

0

Примечание: если ваш доступ SSH к вычислительным узлам кластера закрыт, этот метод не будет работать!

Вот как я это сделал. Это может быть не самый лучший способ, но он работает: Итак, я добавил несколько коротких периодов сна между моей картой и уменьшил шаги, вызвав функцию C++ sleep(). А также написал сценарий, что ssh для узлов, на которых выполняется моя работа, а затем получает статус памяти на тех узлах, которые записывают их в файл (используя команды «free» или «top»).

Более подробно: в моем сценарии работы PBS, где-то перед вызовом моих двоичным, я добавил эту строку:

#this goes in job script, before the call to the job binary: 
cat $PBS_NODEFILE > /some/path/nodelist.log 

Это записывает список узлов, что моя работа бежит дальше, в файл.

У меня есть второй сценарий «watchmem.sh»:

#!/bin/bash 
for i in $(seq 60) 
do 
    while read line; 
    do 
      ssh $line 'bash -s' < /some/path/remote.sh "$line" 
    done < /some/path/nodelist.log 
    sleep 10 
done 

Этот сценарий читает файл nodelist.log, который мы сгенерировали ранее, выполняет SSH в каждый узел и вызывает третий (и последний сценарий) , remote.sh, на каждом из этих узлов.

remote.sh содержит команды, которые мы запускаем на каждом узле нашей работы. В этом случае он печатает текущее время и результат «бесплатно» в отдельные файлы для каждого узла:

#remote.sh 
echo "Current time : $(date)" >> $1 
free >> $1 #this can be replaced by top by specifying a -n for it 

Сопоставляя раз из этих файлов и времени я печать из моих двоичных давай мне узнать потребление памяти (alloc/dealloc) на каждом шаге. Спящие периоды в моей работе - убедиться, что мои сценарии фиксируют состояние памяти между шагами. «sleep 10» в моем скрипте - избежать ненужной записи в файл; этот период должен быть сопоставим с продолжительностью сна в основной работе.

Смежные вопросы