Используйте более одного ядра в bash - PullRequest
3 голосов
/ 23 марта 2020

У меня есть инструмент linux, который (значительно упрощает) обрезает мне последовательности, указанные в файле illumnaSeq. У меня есть 32 файла для измельчения. Один файл обрабатывается примерно за 5 часов. У меня есть сервер на Centos, он имеет 128 ядер.

Я нашел несколько решений, но каждое из них работает таким образом, что использует только одно ядро. Последний, похоже, запускает 32 nohups, но он все равно будет оказывать давление на все это одним ядром.

Мой вопрос: кто-нибудь знает, как использовать потенциал сервера? Поскольку в основном каждый файл может обрабатываться независимо, между ними нет никаких отношений.

Это текущая версия скрипта, и я не знаю, почему он использует только одно ядро. Я написал это с помощью совета здесь по стеку и нашел в Inte rnet:

#!/bin/bash
FILES=/home/daw/raw/*
count=0

for f in $FILES
to
  base=${f##*/}
  echo "process $f file..."
  nohup /home/daw/scythe/scythe -a /home/daw/scythe/illumina_adapters.fa -o "OUT$base" $f &
  (( count ++ ))
  if (( count = 31 )); then
        wait
        count=0
  fi
done

Я объясняю: FILES - это список файлов из необработанной папки.

Строка «core» для выполнения nohup: первый путь - это путь к инструменту, -a путь - это путь к файлу с патерной обрезкой, из которого сохраняется то же имя файла, что и обработанный + OUT в начале. Последний параметр - это входной файл, который нужно обработать.

Вот инструменты readme: https://github.com/vsbuffalo/scythe

Кто-нибудь знает, как с этим справиться?

PS Я также пробовал передвигать nohup перед подсчетом, но он все еще использует одно ядро. У меня нет ограничений на сервере.

1 Ответ

1 голос
/ 23 марта 2020

ИМХО, наиболее вероятным решением является GNU Parallel , так что вы можете запустить, скажем, 64 задания параллельно примерно так:

parallel -j 64 /home/daw/scythe/scythe -a /home/daw/scythe/illumina_adapters.fa -o OUT{.} {} ::: /home/daw/raw/*

Это дает преимущество в том, что задания не пакетируются, он продолжает работать 64 всегда, начиная новое, когда заканчивается каждое задание, что лучше, чем ожидание потенциально 4,9 часа для всех 32 ваших заданий до конца sh, прежде чем запустить последнее, которое занимает еще 5 часов после этого. Обратите внимание, что я здесь произвольно выбрал 64 задания, если вы не укажете иное, GNU Parallel будет запускать 1 задание на каждое ядро ​​вашего процессора.

Полезные дополнительные параметры:

  • parallel --bar ... дает индикатор выполнения
  • parallel --dry-run ... выполняет dry запуск, чтобы вы могли видеть, что он будет делать, фактически ничего не делая

Если вы Если у вас есть несколько доступных серверов, вы можете добавить их в список, и GNU Parallel также распределит задания между ними:

parallel -S server1,server2,server3 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...