gpt4 book ai didi

apache - 无法使用 mpirun 使 apache mod_perl 工作

转载 作者:行者123 更新时间:2023-12-04 18:06:48 24 4
gpt4 key购买 nike

我正在尝试构建一个简单的 Web 服务,该服务在带有 apache 和 mod_perl2 的 ubuntu 机器上运行。该服务运行 mpirun 并返回调用的输出。我通过网络浏览器调用 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 辅助 | 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::RunIPC::Run3,正如 Sergei 所建议的,我也尝试使用管道,但每次 mpirun 死机都没有完成。
  • 尝试通过 perl 脚本而不是通过浏览器直接调用处理程序:mpirun 完成并且处理程序打印所需的输出。
  • 比较了 mac 和 ubuntu 两台机器上 ompi_info --param mpi all 的输出,但没有发现差异

知道为什么 mpirun 会在我的情况下挂起,或者知道如何调试它吗?

编辑

我尝试使用 Apache2::SubProcess正如hrunting所建议的那样。这里我的代码遵循链接中的简单示例:

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 与我的配置一起工作的任何进一步想法?

最佳答案

Apache2::SubProcess .当您在 mod_perl 处理程序中运行外部进程时,Apache 内存、I/O 和进程管理开始发挥作用。请记住,您的代码在 Apache 本身内运行,并受 Apache 环境的约束。 Apache2::SubProcess 模块旨在使 exec()system() 风格的调用在 Apache 中正常工作。

请注意,模块文档概述了处理不同 Perl 配置的注意事项。

关于apache - 无法使用 mpirun 使 apache mod_perl 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24698570/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com