Параллель GNU ограничивает использование памяти

Вы могли бы взглянуть на --fuzzy опция.

Заключение в кавычки из страницы справочника:

Эта опция говорит rsync, что это должно искать базисный файл для любого целевого файла, который отсутствует. Текущий алгоритм смотрит в том же каталоге как целевой файл или для файла, который имеет идентичный размер и измененный разовый, или так же названный файл. Если найдено, rsync использует нечеткий базисный файл, чтобы попытаться ускорить передачу.

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

Согласно этому описанию алгоритм не очень интеллектуален и не будет работать на переименованные каталоги или идентичные файлы в различных каталогах.

7
22.09.2016, 01:08
2 ответа

Краткий ответ:

ulimit -m 1000000
ulimit -v 1000000

, который ограничит каждый процесс на 1 ГБ ОЗУ.

Ограничение памяти «правильный» путь на практике чрезвычайно сложно: давайте скажем, у вас есть 1 ГБ ОЗУ. Вы начинаете процесс каждые 10 секунд, и каждый процесс использует 1 МБ более каждую секунду. Поэтому через 140 секунд у вас будет что-то подобное:

10██▎                                                          
20██████▍                                                      
30██████████▌                                                  
40██████████████▋                                              
50██████████████████▊                                          
60██████████████████████▉                                      
70███████████████████████████                                  
80███████████████████████████████▏                             
90███████████████████████████████████▎                         
100██████████████████████████████████████▍                     
110██████████████████████████████████████████▌                 
120██████████████████████████████████████████████▋             
130██████████████████████████████████████████████████▊         
140██████████████████████████████████████████████████████▉     

Это сумма до 1050 МБ ОЗУ, поэтому теперь вам нужно что-то убить. Какая правильная работа убить? Это 140 (при условии, что это бегало амок)? Это 10 (потому что он запускает наименьшее количество времени)?

На моем опыте работы, где память - это проблема, как правило, очень предсказуема (например, преобразование растрового изображения) или очень мало предсказуемого. Для очень предсказуемых вы можете сделать вычисление заранее и посмотреть, сколько рабочих мест может быть запущена.

Для непредсказуемого вы в идеале хотите, чтобы система начала несколько рабочих мест, которые занимают много памяти, и когда они сделаны, вы хотите, чтобы система начнут больше рабочих мест, которые забирают меньше памяти. Но вы заранее не знаете, какие работы займет много, что займет немного, а какие бегут Amok. Некоторые рабочие места нормальный жизненный цикл - пробежать с небольшим количеством памяти в течение длительного времени, а затем воздушный шар до намного большего размера позже. Очень трудно сказать разницу между этими рабочими работами и работой, которые управляют AMOK.

Когда кто-то указывает мне на хорошо продуманный способ сделать это таким образом, чтобы иметь смысл для многих приложений, то GNU Parallel, вероятно, будет расширен с этим.

3
27.01.2020, 20:19

С 2014 года все изменилось.

Git-версия e81a0eba теперь имеет--memsuspend

--memsuspend size (alpha testing)

Suspend jobs when there is less than 2 * size memory free. The size can be
postfixed with K, M, G, T, P, k, m, g, t, or p which would multiply the size
with 1024, 1048576, 1073741824, 1099511627776, 1125899906842624, 1000,
1000000, 1000000000, 1000000000000, or 1000000000000000, respectively.

If the available memory falls below 2 * size, GNU parallel will suspend some
of the running jobs. If the available memory falls below size, only one job
will be running.

If a single job takes up at most size RAM, all jobs will complete without
running out of memory. If you have swap available, you can usually lower
size to around half the size of a single jobs - with the slight risk of
swapping a little.

Jobs will be resumed when more RAM is available - typically when the oldest
job completes.
1
20.01.2021, 16:46

Теги

Похожие вопросы