【问题标题】:What does "Maximal count of pending signals (120) exceeded" mean?“超过最大未决信号数(120)”是什么意思?
【发布时间】:2011-01-19 09:23:57
【问题描述】:

我的 Perl Web 应用程序在 Apache mod_fastcgi 下运行,经常出现类似 以下:

在第 119 行超过了未决信号的最大计数 (120)。

我已经看到与文件上传有关的这种情况,但我不确定那是 唯一一次发生。在我收到该错误之前(或可能之后),我也会收到一个 SIGPIPE。

有什么想法吗?

编辑感谢大家的建议。有人问119号线是什么。抱歉,应该把它放进去。它在我对上传文件运行病毒检查程序的代码块中。我不是每次都收到错误,只是偶尔。

if(open VIRUS_CK, '|/usr/local/bin/clamscan - --no-summary >'.$tmp_file) {

  print VIRUS_CK $data; // THIS IS LINE 119

  close VIRUS_CK;

  if (($? >> 8) == 1) {

    open VIRUS_OUTPUT, '<'.$tmp_file;
    my $vout = <VIRUS_OUTPUT>;
    close VIRUS_OUTPUT;
    $vout =~ s/^stdin:\s//;
    $vout =~ s/FOUND$//;


    print STDERR "virus found on upload: $vout\n";
    return undef, 'could not accept attachment, virus found: '.$vout;
  }
  unlink($tmp_file);
}

【问题讨论】:

  • 显而易见的问题:第 119 行是什么?
  • 当 perl 出现这样的抱怨时,它会退出,还是只是失去这些信号?

标签: perl fastcgi mod-fastcgi


【解决方案1】:

这意味着操作系统向 Perl 传递信号的速度超过了它的处理速度,并且已经达到了饱和点。在操作之间,Perl 保存要处理的信号,然后在有机会时处理它们。你得到这个错误是因为在 Perl 有机会喘口气之前收到了太多的信号。这是一个致命错误,因此您的 Perl 进程终止。

解决方案是找出产生如此多信号的原因。请参阅 here 了解更多详情。


更新:我最初的回答有些不准确,说生成新的 Perl 进程是问题的一部分,而实际上并非如此。我根据下面@ysth 的评论进行了更新。

【讨论】:

  • 与启动新进程无关; perl 捕获信号并将它们保存以在操作之间的安全点分派,此错误表明在该安全点之前收到了很多信号。
  • 您对如何找出信号的来源有什么想法吗?
  • 建议检查 Apache 中 FastCGI 模块的日志记录或调试选项。
【解决方案2】:

我会手忙脚乱,因为我很长时间没有使用 mod_fastcgi,而且我已经有一段时间没有查看它的文档了。

我猜你的 Perl 模块是非分叉的,但需要一段时间才能运行,这样客户端关闭需要一段时间来处理。请参阅 FastCGI Apache 模块 mod_fastcgi 下的Notes,了解 FastCGI 使用的信号,以及程序可能希望如何处理这些信号,包括 SIGPIPE。

【讨论】:

  • 我在 SIGPIPE 上什么也不做,除了打印到 STDERR 我收到了一个 SIGPIPE。无论如何,我不确定如何关闭正在进行的请求。这是我应该设置一个标志并在任何长时间运行的循环期间偶尔检查该标志的那种事情(不是我有任何)?
  • 在任何长时间运行的循环中(不是我有任何循环) 我怀疑运行 clamscan,等待它的结果是很长的延迟。如果最终用户中止 FastCGI 脚本,因为不耐烦地等待病毒扫描程序运行,这会生成 SIGPIPE 信号,据我所知。这也会阻止其他 Web 请求,等待 Perl 脚本完成(等待病毒扫描程序),因此如果这些 Web 用户也“停止”或中止他们的连接,它们也会另外生成 SIGPIPE 信号。 -- 对这一切持保留态度,已经有一段时间了。
猜你喜欢
  • 2013-05-28
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 2010-09-29
相关资源
最近更新 更多