IT序号网

linux之在 bash 中使用多个内核

kerrycode 2024年02月27日 编程语言 19 0

我有一个 linux 工具,它(大大简化了)为我剪切 illumnaSeq 文件中指定的序列。我有 32 个文件要研磨。处理一个文件大约需要 5 个小时。我在centos上有一台服务器,它有128个核心。

我找到了一些解决方案,但每个解决方案都只使用一个核心。最后一个似乎发射了 32 个 nohups,但它仍然会用一个核心给整个东西加压。

我的问题是,有人知道如何使用服务器的潜力吗?因为基本上每个文件都可以独立处理,它们之间没有任何关系。

这是脚本的当前版本,我不知道为什么它只使用一个内核。我在堆栈上的建议的帮助下编写了它,并在 Internet 上找到了它:

#!/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 是原始文件夹中的文件列表。

执行nohup的“核心”行:第一个路径是工具路径,-a路径是要切割的带有paternas的文件路径,out保存与开头处理+OUT相同的文件名.最后一个参数是要处理的输入文件。

这里是readme工具: https://github.com/vsbuffalo/scythe

有人知道如何处理吗?

附言我也试过 move nohup before count,但它仍然使用一个核心。我对服务器没有限制。

请您参考如下方法:

恕我直言,最可能的解决方案是 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 个作业完成再开始最后一个要好在那之后还需要 5 个小时。请注意,我在这里任意选择了 64 个作业,如果您没有另外指定,GNU Parallel 将为您拥有的每个 CPU 核心运行 1 个作业。

有用的附加参数是:

  • parallel --bar ... 给出一个进度条
  • parallel --dry-run ... 进行试运行,这样您就可以在不实际执行任何操作的情况下看到它会做什么

如果您有多个服务器可用,您可以将它们添加到列表中,GNU Parallel 也会在它们之间分配作业:

parallel -S server1,server2,server3 ... 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!