MAKER并行分為兩種,一種基于MPI,運(yùn)行方式為mpiexec -n 線程數(shù) maker, 一種是在同一個(gè)項(xiàng)目中運(yùn)行多次maker。前者需要在安裝MAKER時(shí)進(jìn)行設(shè)置,后者相當(dāng)于你手動(dòng)按照染色體數(shù)目進(jìn)行拆分,然后分開(kāi)運(yùn)行MAKER。本片主要介紹基于MPI的并行策略。
下圖是MAKER是基于MPI的并行化流程。分為三個(gè)層次,contig水平,更小的片段水平,不同程序的并行。
contig水平就是對(duì)每條contig進(jìn)行分別注釋。而由于每個(gè)contig的長(zhǎng)度不一,當(dāng)較短的contig運(yùn)行結(jié)束后,我們還需要等待較長(zhǎng)的contig結(jié)束。因此,我們還需要將contig繼續(xù)拆分,讓每條contig分成更小的片段,成為基本的分析單元。對(duì)于每個(gè)分析單元,還可以考慮將不同程序進(jìn)行并行。

在MAKER實(shí)際運(yùn)行時(shí),如果用gotop進(jìn)行查看你會(huì)發(fā)現(xiàn)系統(tǒng)中會(huì)出現(xiàn)很多maker進(jìn)程(以mpiexec -n 10為例)

但是你發(fā)現(xiàn)只有少量的和注釋有關(guān)的程序(如blastx)。如果用ps aux | grep maker查找和maker有關(guān)的進(jìn)程,你會(huì)發(fā)現(xiàn)大量的maintain.pl進(jìn)程,并且這些進(jìn)程后面跟著一大串你不認(rèn)識(shí)的符號(hào)
/usr/bin/perl /opt/biosoft/maker/bin/../lib/File/maintain.pl 46535 30 %04%09%08%31%3...
為了理解MAKER的并行,你需要通過(guò)pstree -ap [mpiexec進(jìn)程ID]更細(xì)致的了解MAKER的進(jìn)程樹(shù)

從中你可以發(fā)現(xiàn),因?yàn)槲覀冇?code>mpiexec啟動(dòng)了10個(gè)maker進(jìn)程,所以hydra_pmi_proxy有10個(gè)maker子進(jìn)程。對(duì)于這10個(gè)maker子進(jìn)程,每個(gè)進(jìn)程都至少會(huì)有一個(gè)maintain.pl。通過(guò)閱讀maintain.pl的源代碼,我們可以得知該程序后接參數(shù)中的46535是PID(進(jìn)程號(hào)), 30是sleep time, 最后一個(gè)是URI編碼字符,是利用Storable::freeze持久化的數(shù)據(jù)結(jié)構(gòu),可以通過(guò)如下的代碼進(jìn)行解碼(命名為decode.pl)
#!/usr/bin/env perl
use warnings;
use strict;
use URI::Escape;
use Storable;
use vars qw($LOCK);
my $serial = shift;
$serial = uri_unescape($serial);
$LOCK = Storable::thaw($serial);
print "$LOCK->{lock_file} \n"
可以批量對(duì)maintain.pl里的信息進(jìn)行解碼
ps aux | grep maintain.pl | grep -v grep | awk '{print $15}' | xargs -i perl decode.pl {}
因此,那么多的maker并不是在話說(shuō),而是在負(fù)責(zé)任務(wù)調(diào)度,差不多一個(gè)任務(wù)會(huì)有3個(gè)maker進(jìn)程保駕護(hù)航。
回到之前的進(jìn)程數(shù),這里有一些maker進(jìn)程下會(huì)跟著一些正在運(yùn)行的命令,blastx, exonerate

而有些只有maker和maintain.pl進(jìn)程。

如果等待一會(huì),再次運(yùn)行pstree -ap [mpiexec進(jìn)程ID],你會(huì)發(fā)現(xiàn)這兩種狀態(tài)會(huì)發(fā)生轉(zhuǎn)換,這說(shuō)明任務(wù)啟動(dòng)也需要一段時(shí)間。
因此,以后用MAKER注釋的時(shí)候,看到那么多maker進(jìn)程不要害怕,用pstree進(jìn)行檢查,看看它們到底是在摸魚(yú),而是在維護(hù)程序運(yùn)行。