我将aspnetboilerplate / aspnetzero模板用于具有多数据库的多租户SaaS应用程序。
这使用CastleWindsor作为DI框架。

我遇到了非常糟糕的性能,并使用dotTrace进行了跟踪-它说Castle.MicroKernel是最活跃的代码。

我的请求大约需要5到6秒,并且大部分时间甚至都没有到达控制器。 (调试时)
我认为解决所有服务/控制器的速度很慢。我将某些依赖项(应用程序服务)从Transient更改为PerWebRequestLifetime,但这并没有影响性能。

有谁知道,我如何获得更好的性能?

在我的视图(_Layout文件)中,我调用了Layoutcontroller上的几个不同的Childaction,此Controller注入了以下Service:

     public LayoutController(
        IPerSessionCache sessionCache,
        IUserNavigationManager userNavigationManager,
        IMultiTenancyConfig multiTenancyConfig,
        ILanguageManager languageManager,
        ITenancyNameFinder tenancyNameFinder,
        TenantManager tenantManager,
        IUserLinkAppService userLinkAppService,
        UserManager userManager)


动作是

[ChildActionOnly]
    public PartialViewResult AppHeader()
    {
        var headerModel = new Areas.Mpa.Models.Layout.HeaderViewModel
        {
            LoginInformations = AsyncHelper.RunSync(_sessionCache.GetCurrentLoginInformationsAsync),
            Languages = _languageManager.GetLanguages(),
            CurrentLanguage = _languageManager.CurrentLanguage,
            IsMultiTenancyEnabled = _multiTenancyConfig.IsEnabled,
            IsImpersonatedLogin = AbpSession.ImpersonatorUserId.HasValue,
            HasLinkedAccounts = AsyncHelper.RunSync(_userLinkAppService.HasLinkedAccounts)
        };

        return PartialView("~/Views/Layout/_AppHeader.cshtml", headerModel);
    }

[ChildActionOnly]
    public PartialViewResult AppNavbar(string currentPageName = "")
    {
        var sidebarModel = new Areas.Mpa.Models.Layout.NavbarViewModel
        {
            Menu = AsyncHelper.RunSync(() => _userNavigationManager.GetMenuAsync(MeNavigationProvider.MenuName, AbpSession.ToUserIdentifier())),
            CurrentPageName = currentPageName
        };

        return PartialView("_AppNavbar", sidebarModel);
    }


和类似的...但是我用一个空的布局文件检查了性能,但是我的请求仍然花费太长时间

最佳答案

ASP.NET Boilerplate性能基准测试结果

我们创建了2个相同的简单应用程序:一个具有ABP(https://github.com/aspnetboilerplate/aspnetboilerplate-samples/tree/master/TestProjects/AbpPerformanceTestApp)的应用程序

以及其他没有ABP(https://github.com/aspnetboilerplate/aspnetboilerplate-samples/tree/master/TestProjects/StandartTestApp

二手框架


ASP.NET Core 1.x
EF Core 1.x


测试工具

我们使用jMeter进行测试。

检测结果

没有ABP

asp.net-mvc - Aspnet样板/Aspnet零速(IoC)-LMLPHP

使用ABP

asp.net-mvc - Aspnet样板/Aspnet零速(IoC)-LMLPHP

从统计数据中可以看出,ABP在默认的asp.net代码之上平均增加了5ms的开销。由于此开销是CPU使用率,因此吞吐量平均相差5%。

为了更好地进行比较,我们禁用了ABP的日志记录和事务处理(日志记录特别影响性能,因为它使用I / O)。其他方面,过滤器和功能默认情况下处于启用状态。

10-01 23:30