4

我在 mod_mono 下使用 mono 2.8.1 运行 ASP.NET MVC2 应用程序,目前必须定期清除 apache 似乎正在泄漏的信号量数组。

前段时间我开始使用单 rpm 的 2.6.7,但在泄漏信号量数组(即越来越多的ipcs中累积)和与 ASP.NET MVC2 的一些不兼容方面遇到了一些问题,因此我从源代码构建了 2.8。泄漏仍在继续,所以我刚刚从源代码构建了 2.8.1,同样的事情仍在发生。这是在 Amazon AMI 上(我猜它是引擎盖下的 centos)。症状是信号量数组不断建立,如果我在一段时间后不使用ipcrm手动删除它们,则对 ASP.NET 页面的请求不会返回任何内容,并且日志中没有错误。我还在 centos 5.4 AMI 中重现了同样的问题。

有没有人在 apache/mod_mono 下成功运行 ASP.NET 而我只是遇到了一些边缘情况?由于我找不到任何其他人提到这件事,我认为这不是一般的 ASP.NET 错误。有什么想法可以进一步解决这个问题吗?

4

3 回答 3

9

终于弄清楚了这一点,虽然解决方案暴露了我自己的错误,即没有跟进我收到的其他警告,但我认为这对遇到此问题的其他人应该有用。

默认情况下,apache config 具有以下配置顺序:

Include conf.d/*.conf
User apache
Group apache

即所有的 conf 文件(通常是定义 vhosts 的地方)在 httpd 用户和组设置之前加载。这会导致在重新启动时出现以下警告:

[Mon Jan 24 00:12:50 2011] [crit] The unix daemon module not initialized yet.
Please make sure that your mod_mono module is loaded after the User/Group
directives have been parsed. Not initializing the dashboard.

尽管一切似乎都正常工作,但这就是信号量泄漏的原因。如果您在Include之后移动User/Group,则警告消失并且 mod_mono 不再泄漏信号量。

于 2011-01-26T17:58:00.683 回答
1

我已经在跨进程句柄使用的共享内存中看到了这一点。

我的解决方法是设置 MONO_DISABLE_SHM=1,但是我不确定这是否是您的问题,因为从 2.8 开始禁用跨进程句柄支持。

您可能仍然可以尝试 MONO_DISABLE_SHM 看看它是否有所作为。

于 2011-01-04T22:21:13.077 回答
0

尝试使用新的sgen垃圾收集器而不是 Boehm。

要使用新的垃圾收集器,您只需使用 --gc=sgen 命令行选项调用 Mono,或将 MONO_ENV_OPTIONS 环境变量设置为包含“--gc=sgen”选项。默认情况下,Mono 继续使用 Boehm 收集器。

于 2011-01-04T09:43:54.007 回答