【问题标题】:Unity IoC spending a lot of time in ReadDirectoryChangesWUnity IoC 花费大量时间在 ReadDirectoryChangesW
【发布时间】:2023-03-11 16:48:01
【问题描述】:

我们在 MVC3 项目中使用 Unity 作为 IoC 容器。我们刚刚安装了 dynatrace,它显示在 FileSystemWatcher.StartRaisingEvents 方法中花费的时间过多,特别是在 ReadDirectoryChangesW 中。这似乎导致了糟糕的表现。

Unity 到底为什么要监控文件系统?

Here's the call stack:

ChildActionExtensions.RenderAction
  HttpServerUtility.Execute
    HttpHandlerUtil+ServerExecuteHttpHandler.Wrap
      UnityControllerFactory.CreateController
        XmlConfigurator.ConfigureAndWatch
          FileSystemWatcher.StartRaisingEvents
            UnsafeNativeMethods.ReadDirectoryChangesW

这里是 UnityControllerFactoryCode

        try
        {
            if (requestContext.RouteData.DataTokens.ContainsKey("area") && !string.IsNullOrWhiteSpace(requestContext.RouteData.DataTokens["area"].ToString()))
            {
                controllerName = string.Format("{0}/{1}", requestContext.RouteData.DataTokens["area"], controllerName);
            }

            controllerName = controllerName.ToLower();

            return _container.Resolve<IController>(controllerName);
        }
        catch (Exception ex)
        {
            if (ex is ResolutionFailedException)
            {
                IMyLogger logger = _container.Resolve<IMyLogger>();
                logger.Error(LogEventIdType.General, ex, "Is the '{0}' controller defined in the Unity Container via RegisterType (in lowercase) in UnityIocBootstrapConfigure?", new object[] {controllerName});
                throw;
            }             
        }

记录器记录到 Windows 事件日志。

【问题讨论】:

  • 嗯,XmlConfigurator 似乎是 log4net 的东西。你在使用 log4net 吗?我认为这是你的罪魁祸首,而不是 Unity。
  • 是的,这就是我一直在寻找的地方。我们正在使用 log4net,它正在记录到一个文件,所以我认为这是罪魁祸首,但即使文件附加程序被注释掉,这些调用仍然存在。
  • @vcsjones - 你是对的 - log4net 配置了自己的配置文件(与 web.config 中的配置相比),因此它正在监视该文件的更改。如果您可以发表您的评论作为答案,我可以给您信用 - 谢谢!

标签: asp.net-mvc-3 unity-container ioc-container


【解决方案1】:

您的跟踪指向XmlConfigurator,即 log4net。 log4net 将其配置存储在与 web.config 不同的文件中,因此它会启动文件系统观察程序来检查文件是否已更改以重新配置自身。

看来你的性能问题的罪魁祸首是 log4net,而不是 Unity。

【讨论】:

    【解决方案2】:

    Unity 本身不做这样的事情。实际上,堆栈跟踪根本不在 Unity 代码中,而是在控制器工厂内部。

    添加文件系统观察程序的作者。这很愚蠢,因为 ASP。 NET 已经监视 web.config 并在它发生变化时重新启动 appdomain。

    【讨论】:

    • 我已经添加了控制器工厂 CreateController 代码。此类中没有文件系统观察程序。
    猜你喜欢
    • 2018-01-10
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多