Программа зависает во время длительных запусков

Фиксированный:

Ну, это выглядит немного глупо. Выяснилось, что top отображался неправильно, и программы продолжали работать. Возможно, процессорное время стало слишком большим для отображения? В любом случае, программа, кажется, работает нормально, и весь этот вопрос был спорным.

Спасибо (и извините за глупый вопрос).

Оригинальный вопрос:

Я запускаю симуляцию на компьютере с сервером Ubuntu 10.04.3. Короткие пробеги (‹24 часа) работают нормально, но длинные пробеги со временем останавливаются. Под остановкой я подразумеваю, что программа больше не получает процессорного времени, но по-прежнему хранит всю информацию в памяти. Чтобы запустить эти симуляции, я использую SSH и nohup для программы и передаю любой вывод в файл.

Разнообразная информация:

Системе определенно не хватает оперативной памяти. Программе не нужно читать или записывать на жесткий диск до завершения; вычисление выполняется полностью в памяти. Программа не убита, так как у нее все еще есть PID после того, как она остановилась. Я использую openmp, но увеличил максимальное количество процессов, а максимальное время не ограничено. Я нахожу самые большие собственные значения матрицы, используя библиотеку ARPACK fortran.

Любые мысли о том, что вызывает такое поведение или как возобновить мою текущую остановленную программу?

Спасибо


person user779810    schedule 16.10.2011    source источник
comment
Откуда вы знаете, что у него не заканчивается оперативная память?   -  person bdonlan    schedule 16.10.2011
comment
Система имеет 98 ГБ ОЗУ, и с параметрами, которые я использую, программа консервативно использует ~ 3 ГБ (рассчитано и наблюдаемо).   -  person user779810    schedule 16.10.2011
comment
Является ли процесс 32-разрядным или 64-разрядным?   -  person wkl    schedule 16.10.2011
comment
@birryree Машина 64-битная (x86_64). Я не знаю, является ли моя программа на Фортране автоматически 64-битной. Я использую gfortran в качестве компилятора.   -  person user779810    schedule 16.10.2011
comment
@user779810 user779810 - если вы создали его на этой машине, gfortran по умолчанию будет 64-битным. Вы можете убедиться, используя команду file, чтобы узнать, собран ли ваш двоичный файл как 32-битная или 64-битная сборка: file your_executable_name.   -  person wkl    schedule 16.10.2011
comment
Возможно, вы захотите написать свое решение в фактическом ответе ниже и отметить его принятым — это гарантирует, что ваш вопрос не будет отображаться в списке вопросов без ответа.   -  person bdonlan    schedule 18.10.2011


Ответы (3)


Я предполагаю, что это программа OpenMP из ваших тегов, хотя на самом деле вы никогда не заявляете об этом. Является ли ARPACK потокобезопасным?

Похоже, вы попали в тупик (чаще встречается в программах MPI, чем в OpenMP, но это определенно возможно). Первое, что нужно сделать, это скомпилировать с включенными флагами отладки, а затем в следующий раз, когда вы обнаружите эту проблему, подключитесь с помощью отладчика и узнайте, что делают различные потоки. Например, для gdb показаны некоторые инструкции по переключению между потоками здесь.

person Jonathan Dursi    schedule 16.10.2011
comment
ARPACK определяет собственные значения, анализируя результаты умножения матрицы на вектор. Единственная параллельная часть моего кода находится во время умножения, а подпрограммы ARPACK вызываются вне параллельных частей. Когда время выполнения составляет менее ~ 24 часов (меньшие матрицы), программа работает нормально, и результаты повторяются. - person user779810; 16.10.2011
comment
Хорошо, это исключает одну возможность. Поэтому я бы предложил выполнить действие attach-gdb на следующей остановке и/или посмотреть, не остановится ли однопоточная большая работа. - person Jonathan Dursi; 17.10.2011

В следующий раз, когда ваша программа "зависнет", подключите к ней GDB и выполните thread apply all where.

  • Если все ваши потоки заблокированы в ожидании некоторого мьютекса, у вас тупик.
  • Если они ждут чего-то другого (например, чтения), то нужно выяснить, что мешает завершить операцию.

Как правило, в UNIX вам не нужно перестраиваться с включенными флагами отладки, чтобы получить значимую трассировку стека. Вы не получите номера файлов/строк, но они могут не понадобиться для диагностики проблемы.

person Employed Russian    schedule 16.10.2011

Возможный способ понять, что делает работающая программа (т. это, используя strace -p *pid*. команда strace — это утилита (технически специализированный отладчик, построенный над интерфейсом системных вызовов ptrace), который показывает вам все системные вызовы, выполненные программой или процессом.

Существует также вариант под названием ltrace, который перехватывает вызов функций в динамических библиотеках.

Чтобы почувствовать это, попробуйте, например, strace ls

Конечно, strace мало чем вам поможет, если запущенная программа не выполняет никаких системных вызовов.

С Уважением. Василий Старынкевич

person Basile Starynkevitch    schedule 16.10.2011
comment
Это свидетельствует о том, какой результат я получаю. (с форматированием пока не разобрался) futex(0x2b97714, FUTEX_WAKE_PRIVATE, 2147483647) = 0 futex(0x6780ae0, FUTEX_WAKE_PRIVATE, 2147483647) = 0 brk(0x2bbb000) = 0x2bbb000 brk(0x49ae000) = 0x49ae000 brk(0x67a1000) = 0x67a1000 futex(0x2b986a4, FUTEX_WAKE_PRIVATE, 2147483647) = 23 futex(0x2b986a4, FUTEX_WAKE_PRIVATE, 2147483647) = 0 - person user779810; 17.10.2011