Intereting Posts
Linux – Debian 8 – Suspend Computer, но никогда не откручивайте HDD Как grep файл bz2, который находится далее в папке с zip-файлом Проверка наличия мобильного модема Dell Precision M4500 с Fedora 17 Расширение Bash $ {@} как команда Как автоматически монтировать удаленные каталоги при входе / запуске Проблемы с libGL на Fedora 20 – невозможно загрузить драйвер? Связывание функции в Emacs после поиска кода с помощью Mx describe-key Отключение от X без среды рабочего стола для каждого с массивом с несколькими элементами Почему плымут не обновится? Определение состояния пароля для пользователя какую команду я буду использовать, чтобы увидеть все строки из файла, начиная с строки, которую я нашел с помощью grep загрузочный сервер, несмотря на неправильный fstab gcc компиляция завершена с помощью «фатальной ошибки: строка: нет такого файла или каталога #include <string>" Отладка сети: внезапное увеличение потери пакетов и задержки

Что ограничивает использование моего процессора в разветвленных процессах?

Я использую несколько долгосрочных программ (для научных целей) в многоядерном ящике Linux. Процессы контролируются маленьким демоном, который перезапускает следующее задание, когда заканчивается (я запускаю 3-6 одновременно), но я заметил, что они не всегда используют 100% процессор. Программы (и демон) написаны на Python.

Когда я запускаю этот код в Mac OS X, я могу запускать программы в течение нескольких недель, и они всегда будут использовать столько системных ресурсов, пока машина работает при нормальной температуре.

Я только начал пытаться запускать такие вещи на Debian Linux (на другой машине), с 6 ядрами и намного больше оперативной памяти, чем требуется для работы. Я запускаю сразу 5 таких заданий.

Когда я впервые начал работу несколько дней назад, у меня было 5 процессов Python top , каждый из которых использовал 100% процессор. Примерно через день я проверил, как все это происходит, и у меня было 3 процесса на 100% процессоре, а два – на 50%. Совсем недавно (около 4 дней) у меня есть 5 процессов, работающих на 20% CPU.

Что может быть причиной этого? Кажется, ничто не говорит о том, что инструменты управления использованием процессора предварительно установлены на Debian Wheezy, и я сам не установил ничего подобного (насколько мне известно) и не настроил его. Кроме того, поскольку ограничения, по-видимому, меняются в зависимости от того, как долго работает демон, я не уверен, что это может быть такая система. Я проверял, перегревается ли машина, и кажется, что это не так сильно, как холодная комната, в которой она находится; воздух от вентиляторов / вентиляционных отверстий является беспрепятственным и прохладным.

Процессы все еще запущены, поэтому я могу измерить все, что может быть полезно для отладки (длительность работы, приоритет процесса и т. Д.), Чтобы отладить эту проблему. Может ли кто-нибудь сказать мне, с чего начать, или какие возможные решения могут быть?

ОБНОВИТЬ:

Когда я пытаюсь сделать то же самое с 3 нитями вместо 5, я теряю до 33% каждый (после первоначального падения до 50%).

Существует ли какая-либо программа или политика планирования, которая ограничивает все дочерние процессы одного процесса до 100%? как это, кажется, происходит.

Следующий тест заключается в том, чтобы напрямую запускать скрипты в отдельных оболочках screen (BTW, первый скрипт был запущен с внутреннего screen ) и посмотреть, не получилось ли у нас замедление. Резать рабочие места вручную так, это обходное решение OK-ish, но довольно раздражает (и должно быть ненужным.) В целом, конечно, такая проблема может быть не разрешима таким образом, но поскольку все результаты от каждого задания сохраненный на диске, а не возвращенный диспетчер потоков, я сойду с ним.

ОБНОВЛЕНИЕ 2:

Отдельные процессы, запущенные из разных экземпляров экрана, по-прежнему идут на 100% CPU через 14 часов, будут отчитываться, если я вижу какое-либо замедление, но, как ожидалось, на этот случай не влияет любое дросселирование.

кто-нибудь хочет написать (или указать мне) что-то, что объясняет приоритет процесса для Linux? Мне интересно, отмечены ли мои процессы нереста как более низкий приоритет (поскольку он использует очень мало самого процессора), а затем дочерние процессы наследуют это.

РЕДАКТИРОВАТЬ:

Меня спросили о скрипте, который я запускаю, и о функции разворачивания процессов демона.

Долгосрочный сценарий – это большой расчет, который всегда работает на 100% CPU до тех пор, пока он не завершится, и не делает ничего смешного в отношении параллелизации или многопроцессорности. (это широко проверенное утверждение.) Чтобы уточнить, – только раз, когда я видел, что эти процессы работают на менее чем 100% процессоре на моем Mac, это перегрев или при подкачке / подкачке. Ни один из них не относится к делу Linux.

Вот функция, которая висит, а затем управляет длительными процессами:

 from multiprocessing import Process import time, sys, os # An alternative entry point which runs N jobs in parallel over a list of files. # Note, since this is designed to be used as a library function, we "return" from the initial # function call rather than exiting. def run_over_file_list(script_path, list_of_data_files, num_processes, timeout=float('inf')): try: pid = os.fork() if pid > 0: # exit first parent return except OSError, e: print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) # decouple from parent environment os.chdir("/") os.setsid() os.umask(0) # do second fork try: pid = os.fork() if pid > 0: # exit from second parent, print eventual PID before print "Daemon PID %d" % pid sys.exit(0) except OSError, e: print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) # OK, we're inside a manager daemon. if os.path.isfile(status_filename): raise Exception("a daemon is already running. failed.") f = open(status_filename, "w") f.write(str(os.getpid())) f.close() jobs = [script_path] * num_processes data_files_remaining = [f for f in list_of_data_files] update_files_remaining_file(len(data_files_remaining)) assert num_processes <= len(data_files_remaining) restart = False with nostdout(): while True: processes = [] for job in jobs: p = Process(target=file_list_worker, args=(job, data_files_remaining.pop(0))) p.started = time.time() p.start() processes.append(p) stop = False while True: time.sleep(10) ended = [] for i, p in enumerate(processes): if not p.is_alive(): j = i ended.append((j,p)) elif time.time() - p.started > timeout: p.terminate() j = i ended.append((j,p)) if not stop: for tup in ended: if not data_files_remaining: stop = True break i, e = tup new_p = Process(target=file_list_worker, args=(jobs[i], data_files_remaining.pop(0))) new_p.started = time.time() new_p.start() processes[i] = new_p # old e will be garbage collected else: if len(ended) == len(processes) and not data_files_remaining: stop = False break try: command = check_for_command() if command == "stop": stop = True elif command == "restart": stop = True restart = True elif command == "kill": for p in processes: p.terminate() clear_command() os.remove(status_filename) exit(0) except NoCommandError: pass update_files_remaining_file(len(data_files_remaining)) clear_command() update_files_remaining_file(len(data_files_remaining)) if not restart: os.remove(status_filename) break else: jobs = None restart = False # While in a fork, we should never return (will continue running the original/calling script in parallel, hilarity ensues.) exit(0) 

EDIT 2:

приоритет

Итак, все, кажется, работает с приоритетом 20 из любого источника; предварительные дросселирование процессов, пост-дросселирование процессов, диспетчер демона, процессы, выполняемые непосредственно из оболочки под экраном.

ulimit -a

от bash:

 core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 127788 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 127788 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited 

от рыбы:

 Maximum size of core files created (kB, -c) 0 Maximum size of a process's data segment (kB, -d) unlimited Maximum size of files created by the shell (kB, -f) unlimited Maximum size that may be locked into memory (kB, -l) 64 Maximum resident set size (kB, -m) unlimited Maximum number of open file descriptors (-n) 1024 Maximum stack size (kB, -s) 8192 Maximum amount of cpu time in seconds (seconds, -t) unlimited Maximum number of processes available to a single user (-u) 127788 Maximum amount of virtual memory available to the shell (kB, -v) unlimited 

из рыбы под экраном:

(точно так же, как и обычная рыба).


Значительно позднее обновление

Я также заметил эту ошибку с длительными процессами, запущенными из отдельных оболочек. например:

 Instance 1: 17% (one core of 6 at 100%.) Instance 2: 8% (one core of 6 at 50%.) Instance 3: 8% (one core of 6 at 50%.) 

если я изменил приоритет экземпляра 2 как «очень высокий», состояние будет:

 Instance 1: 17% (one core of 6 at 100%.) Instance 2: 17% (one core of 6 at 100%.) Instance 3: 0% (one core of 6 at 0%.) 

Если приоритеты все уравнены снова, мы вернемся к первому состоянию.

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