[about] [index] [prev] [2022-09-02 16:10:04+03:00] [9c18bbe6efb16197cd494b7a4583e09328560165]
Topics: [tip]

Распределённые задачи по NFS

Есть тут множество файлов, которые надо сжать. И есть три компьютера
мощных дома и поэтому хотелось бы как-то распараллелить этот процесс.
Все они лежат в shared NFS директории, поэтому можно работать по сети.
Думал что в GNU parallel есть из коробки что-то для этого, но нет.

Помню про lockf утилиту, которая могла бы идеально подойти для этой
задачи: взяли lock -- продолжаем работать, иначе выполняем следующую
задачу. Делает lock она путём открытия файла с O_EXLOCK. Но по NFS это
не работает. Не падает, но lock не отрабатывает.

Поэтому решил применить mkdir для этой задачи. Вроде бы, говорят, что он
атомарен на NFS. Хотя даже имитация атомарности мне бы подошла. На
каждой машине делаю:

    nice parallel 'mkdir {}.lock && cpuset -l $(( {%} - 1 ))
                   zstd -v --ultra -22 --rm {}' ::: *.tar

Делать несколько zstd вместо одного zstdmt эффективнее, так как
распараллеливает работу он по достаточно большим кускам и под конец
сжатия несколько минут может оставаться работать меньшее количество
нитей, не полностью утилизируя все ядра. cpuset уже и прежде использовал
для того, чтобы процесс был прибит к конкретному ядру
(30e51579624d482c2fd13324f0e1d6a5c4db40b6). И с parallel очень приятно
завершать задачи плавно, дожидаясь окончания уже запущенных процессов:
kill -HUP `pgrep -f parallel` (f5ea219cd5f1f8361e48a31d7fc29ee5b2b0fe14).

[leave comment]