【问题标题】:Cannot get apache mod_perl with mpirun to work无法使用 mpirun 让 apache mod_perl 工作
【发布时间】: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::RunIPC::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


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我试过 Apache2::SubProcess,但它似乎对我不起作用。请查看我编辑的问题。
【解决方案2】:

尝试 IPC::Run 或 IPC::Run3 运行您的命令。

【讨论】:

    【解决方案3】:

    Capture::Tiny 为我工作。我不确定它在mod_perl 下是否能正常工作(它可能与请求和响应的文件句柄交互不良)但它可以作为常规脚本正常工作:

    use Capture::Tiny 'capture';
    
    my ( $stdout, $stderr, $exit ) = capture {
        system( qw(mpirun -np 4 echo test) );
    };
    
    print "stdout: $stdout\n";
    print "stderr: $stderr\n";
    print "exit: $exit\n";
    

    打印:

    stdout: test
    test
    test
    test
    
    stderr:
    exit: 0
    

    【讨论】:

    • 感谢您的回答!我发现Capture::Tiny 通常适用于我的系统调用,但是,在我的 ubuntu 服务器上,它仍然不起作用,启动的 MPI 进程只是没有完成......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 2011-04-02
    • 1970-01-01
    • 2014-10-19
    相关资源
    最近更新 更多