专栏首页张善友的专栏FileSystemWatcher 导致Mono ASP.NET应用程序CPU使用率比较高

FileSystemWatcher 导致Mono ASP.NET应用程序CPU使用率比较高

大家都知道ASP.NET 网站应用程序(WebSite)可以自动检测到你的ASP.NET应用的文件修改,其中要使用到的就是监视磁盘上的文件/目录的更改,以便应用程序可以采取它认为必要文件创建/删除/修改事件的反应中的任何步骤的FileSystemWatcher 类

Mono的 FileSystemWatcher实现尽了最大的努力适应各种环境(Linux/Windows/*BSD),在各种操作系统环境下执行其分配的任务,在Unix环境下支持以下后端的系统:

  • FAM
  • kevent (BSD*/MacOSX only)
  • gamin
  • inotify (Linux only)
  • Managed watcher

其中,假设您运行 Linux(内核2.6.13以上), inotify是一种首选的后端机制因为它需要对用户态应用程序的一部分,他不是使用轮询而是使用 Linux 内核的通知机制 (在我们的例子,Mono的运行库)。然而,它需要 Linux 内核来支持机制。

如果你的内核不支持inotify,Mono将尝试使用FAM和gamin 这样的用户态的应用程序来监测文件系统的文件/目录的更改,然后通知到Mono运行时,这样效率就大打折扣了,性能就很糟糕了。如果Mono 都无法检测到inotify,Fam以及gamin,mono将使用最后一个选项Managed watcher,此监测程序在托管代码中实现,并为监测、 轮询更改所选文件/目录上的文件系统使用一个单独的线程。由于应用程序可能 (和在 ASP.NET 的情况下有时不会)递归查看目录,它可能会非常昂贵的情况,需要检查更改为一大组的文件。每个运行的变化检测需要检查文件/目录是否存在 (以防托管观察程序这些都是两个 stat (2) 调用),然后检查更改的文件元数据 (大小、 修改时间等),生成一个事件。大约每750ms发生一次,并给服务器的 CPU 上带来大量的负载,导致CPU飙升。

解决方法也很简单,如果你可以的话的关闭文件系统监测 (这意味着您的ASP.NET应用程序将不自动重新启动修改 Web.config 时,不会重新编译文件,如果您修改代码隐藏.cs 或.aspx、.ascx 文件等)。Mono支持MONO_MANAGED_WATCHER环境变量 设置为值disable,减轻您的应用程序做上面所述的文件系统轮询事务,既然是生产环境,就不会有什么经常性更新关闭这个特性也不会有大的影响,还可以节约后台的线程资源 。

在linux上跑ASP.NET网站,有时cpu会出现占用率比较高的情况,过段时间它又正常了,在VPS中,这样情况出现的机率更大,处理方法: 1、不必管它,它自然会降下来,只是等的时间要长一点,而且有可能过段时间又出现,原因就是上述说明,如果是VPS或者云主机上出现这个问题,你一定得好好的分析下原因,是不是就是有这个特性引起的,如果是就把他关掉; 2、使用Jexus 跑ASP.NET网站,在jws.start/jws.restart两个文件中,插一句:export MONO_MANAGED_WATCHER=disable,禁止ASP.NET自动检测,当然副作用是:你修改源码后,得手工重启这个网站。

3、使用Apache的 Mod_mono 使用命令 MonoSetEnv [server_alias] MONO_MANAGED_WATCHER=disable

可以使用下面的代码检测你的Linux服务器上使用的是哪个FileSystemWatcher 实现

using System;   
using System.Collections.Generic;    
using System.Linq;    
using System.Text;    
using System.IO;    
using System.Reflection;
namespace FileWatchDetect   
{    
    class Program    
    {    
        static void Main(string[] args)    
        {    
            object watcher = new FileSystemWatcher().GetType()    
                .GetField("watcher", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null);    
 
            Console.WriteLine(watcher != null ? watcher.GetType().FullName : "unknown");    
            Console.Read();    
        }    
    }    
}

下面的结果是在Windows Azure上的一台OpenSuse 12.0.4上的运行:

Inotify: 高效、实时的Linux文件系统事件监控框架

使用FAM来监视linux文件系统变化

Tip: Mono ASP.NET application burning CPU in idle state - FileSystemWatcher

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 检测常见ASP.NET配置安全漏洞

    看到一篇国外MVP Troy Hunt的文章: 67% of ASP.NET websites have serious configuration relat...

    张善友
  • Novell 发布Mono 1.2 推动.NET跨平台

          微软开发框架的开源版本现在能够在更多现有.NET应用程序上运行。Mono项目宣布发布Mono 1.2版——微软.NET框架的开源版本。该项目由Nov...

    张善友
  • ASP.NET安全隐患的临时解决方法

    前几天的一个安全会议上公布了一个ASP.NET中的安全隐患(在1.0至4.0的版本中均存在),黑客可以使用这个隐患获取到网站的web.config文件(往往保存...

    张善友
  • Shadow Copying导致ASP.NET应用启动很慢的解决办法

    我们安装一个应用程序并启动后,我们是无法更新应用程序安装目录中程序集文件的。如果强制替换会提示文件正在使用,如下图所示。

    圣杰
  • 亲儿子 | Azure SignalR 服务现在支持 ASP.NET

    Azure SignalR 服务是一种完全托管的用于实时消息传递的 Azure 服务。它是扩展 ASP.NET Core SignalR 应用程序的首选方法。但...

    Edi Wang
  • ASP.NET安全隐患的临时解决方法

    前几天的一个安全会议上公布了一个ASP.NET中的安全隐患(在1.0至4.0的版本中均存在),黑客可以使用这个隐患获取到网站的web.config文件(往往保存...

    张善友
  • 全球各大公有云厂商对.NET的支持情况汇总

    惊奇的发现国外的公有云厂商都已经支持.NETCore, 而且和微软达成合作关系, 国内的公有云厂商都不支持.NET Core, 对应的.NET SDK也非常简陋...

    张善友
  • GTK、KDE、Gnome、XWindows 图形界面

    一、linux图形界面的实现只是linux下的应用程序实现 图形界面(GUI)并不是linux的一部分,linux只是一个基于命令行的操作系统,linux和Xf...

    阳光岛主
  • zookeeper集群间通信类型

    zookeeper集群间通信大体可分为四类:数据同步型,服务器初始化型,请求处理型,会话管理型 数据同步型

    Monica2333
  • Win10 Bash/WSL调试Linux环境下的.NET Core应用程序

    使用过Mac OS的程序员都知道,在Mac Book Pro上写程序是一件比较爽的事儿,作为dotneter,我们都比较羡慕Mac系统的环境,比如命令行,当然设...

    yoyofx

扫码关注云+社区

领取腾讯云代金券