【发布时间】:2014-09-02 03:05:15
【问题描述】:
我正在尝试构建一个简单的 Web 服务,该服务在带有 apache 和 mod_perl2 的 ubuntu 机器上运行。该服务运行mpirun 并返回调用的输出。
我通过 Web 浏览器调用 apache 响应处理程序。问题是mpirun 命令似乎挂起。
重要: 此问题发生在使用 apache、mod_perl 和 openmpi 运行 Ubuntu (12.04.4) 的服务器上。在我的 mac (Macos 10.9.3) 上运行它时,它工作正常并且 mpirun 返回。两台机器上,openmpi都安装在同一个版本(1.6.5)
这里是我的 mod_perl 处理程序:
package MyHandler;
use Apache2::Const '-compile' => 'OK';
sub handler {
my $command = "mpirun -np 4 echo test";
my $out = qx($command);
print $out;
return Apache2::Const::OK;
}
1;
mpirun 作业似乎没有完成。 ps aux | grep mpirun 给了我这个:
www-data 24023 0.0 0.1 23600 2424 ? S 13:02 0:00 mpirun -np 4 echo test
当我执行kilall -9 mpirun 时,服务会返回结果。
没有错误写入 apache 错误日志。
这是我尝试/测试过的:
- 确保命令
mpirun -np 4 echo test在以用户www-data运行时生成正确的输出 - 尝试以不同方式调用
mpirun:使用IPC::Run和IPC::Run3,正如 Sergei 所建议的那样,我也尝试使用管道,但每次 mpirun 都没有完成。 - 试图通过 perl 脚本而不是浏览器直接调用处理程序:mpirun 完成,处理程序打印所需的输出。
- 比较了
ompi_info --param mpi all在mac和ubuntu两台机器上的输出,但没有发现差异
知道为什么 mpirun 会在我的情况下挂起,或者知道如何调试它?
编辑
我尝试按照 hrunting 的建议使用 Apache2::SubProcess。这是我的代码遵循链接中的简单示例:
package MyHandler;
use Apache2::SubProcess ();
use Apache2::Const '-compile' => 'OK';
use Apache2::Request;
use Config;
use constant PERLIO_IS_ENABLED => $Config{useperlio};
sub handler {
my $r = shift;
my $command = "mpirun -np 4 echo test";
my ($in_fh, $out_fh, $err_fh) = $r->spawn_proc_prog($command);
$r->content_type('text/plain');
my $output = read_data($out_fh);
my $error = read_data($err_fh);
print "output : $output \n";
print "error : $error \n";
return Apache2::Const::OK;
}
# helper function to work w/ and w/o perlio-enabled Perl
sub read_data {
my ($fh) = @_;
my $data;
if (PERLIO_IS_ENABLED || IO::Select->new($fh)->can_read(10)) {
$data = <$fh>;
}
return defined $data ? $data : '';
}
1;
这对我不起作用。从浏览器调用处理程序时,我得到输出:
output :
error :
ps aux 告诉我 mpirun 没有运行。
关于如何调试它并让mpirun 使用我的配置的任何其他想法?
【问题讨论】:
-
问题已解决:通过 apt-get 在 Ubuntu 12.04 上安装 apache 和 mod_perl 时,安装的 apache 2.2.22 似乎无法使用 mod_perl 处理此类系统调用。安装 mod_perl 2.08 和 apache 2.2.27 解决了这个问题!
-
您应该将其写为答案,以便将来遇到相同问题的访问者可以看到解决问题的方法。
-
好主意,因为我发现全新安装的 Ubuntu 12.04 可以重现该问题:我使用全新的 Virtualbox 机器再次对其进行了测试,并使用
apt-get安装了 mpi、mod_perl 和 apache -- mpirun不适用于 apache。
标签: apache web-services perl mpi mod-perl