Nancy Slow On Mono(使用OWIN SelfHost)

时间:2016-07-17 21:20:49

标签: c# mono raspberry-pi nancy

我正在拼命想弄清楚为什么我的所有请求似乎都有大约1.5秒的时间。我记录了在路由被命中到返回响应之间以及总是看起来小于100毫秒的时间。 Request容器也需要不到10毫秒的时间来配置。

我自己的应用程序中没有其他管道。我在运行应用程序时进行了一些分析,这里有一些耗费时间最多的方法调用。我可以显示更多信息,但日志非常冗长,所以我暂时保留它:

    Method call summary
Total(ms) Self(ms)      Calls Method name
  377145        0          1 (wrapper runtime-invoke) <Module>:runtime_invoke_void_object (object,intptr,intptr,intptr)
  377145        7          1 HobbyQuarters.Web.Program:Main (string[])
  315511        2          1 Mono.Unix.UnixSignal:WaitAny (Mono.Unix.UnixSignal[])
  315509        0          1 Mono.Unix.UnixSignal:WaitAny (Mono.Unix.UnixSignal[],int)
  315508   315504          1 (wrapper managed-to-native) Mono.Unix.UnixSignal:WaitAny (intptr[],int,int,Mono.Unix.UnixSignal/Mono_Posix_RuntimeIsShuttingDown)
   61408        0          1 Microsoft.Owin.Hosting.WebApp:Start (string,System.Action`1<Owin.IAppBuilder>)
   61369        3          1 Microsoft.Owin.Hosting.WebApp:Start (Microsoft.Owin.Hosting.StartOptions,System.Action`1<Owin.IAppBuilder>)
   61239        7          1 Microsoft.Owin.Hosting.WebApp:StartImplementation (System.IServiceProvider,Microsoft.Owin.Hosting.StartOptions,System.Action`1<Owin.IAppBuilder>)
   58935       23         32 System.Threading.ExecutionContext:Run (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool)
   58911       67         32 System.Threading.ExecutionContext:RunInternal (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool)
   58315       16          1 Microsoft.Owin.Hosting.Engine.HostingEngine:Start (Microsoft.Owin.Hosting.Engine.StartContext)
   57391        3          1 Microsoft.Owin.Hosting.Engine.HostingEngine:ResolveApp (Microsoft.Owin.Hosting.Engine.StartContext)
   56891        1          1 HobbyQuarters.Web.Program/<Main>c__AnonStorey0:<>m__0 (Owin.IAppBuilder)
   56866       10          1 Owin.AppBuilderExtensions:UseNancy (Owin.IAppBuilder,System.Action`1<Nancy.Owin.NancyOptions>)
   54087        1        135 (wrapper runtime-invoke) <Module>:runtime_invoke_bool (object,intptr,intptr,intptr)
   54085        3        134 System.Threading._ThreadPoolWaitCallback:PerformWaitCallback ()
   54082        9        134 System.Threading.ThreadPoolWorkQueue:Dispatch ()
   53886        5         37 System.Threading.QueueUserWorkItemCallback:System.Threading.IThreadPoolWorkItem.ExecuteWorkItem ()
   53732        3          1 Owin.AppBuilderExtensions:UseNancy (Owin.IAppBuilder,Nancy.Owin.NancyOptions)
   53709        8          1 Nancy.Owin.NancyMiddleware:UseNancy (Nancy.Owin.NancyOptions)
   52888        9         16 Microsoft.Owin.Host.HttpListener.OwinHttpListener/<ProcessRequestsAsync>d__0:MoveNext ()
   52870        5        139 System.Threading.Tasks.Task:FinishStageThree ()
   52869        1          8 System.Net.ListenerAsyncResult:InvokeCallback (object)
   52867        3          8 System.Threading.Tasks.TaskFactory`1/<FromAsyncImpl>c__AnonStorey1<TResult_REF>:<>m__0 (System.IAsyncResult)
   52867        3        115 System.Threading.Tasks.Task`1<TResult_REF>:TrySetResult (TResult_REF)
   52864        4        139 System.Threading.Tasks.Task:FinishContinuations ()
   52863        2          8 System.Threading.Tasks.TaskFactory`1<TResult_REF>:FromAsyncCoreLogic (System.IAsyncResult,System.Func`2<System.IAsyncResult, TResult_REF>,System.Action`1<System.IAsyncResult>,System.Threading.Tasks.Task`1<TResult_REF>,bool)
   52855        1          8 System.Threading.Tasks.AwaitTaskContinuation:RunOrScheduleAction (System.Action,bool,System.Threading.Tasks.Task&)
   52852        0          8 System.Runtime.CompilerServices.AsyncMethodBuilderCore/MoveNextRunner:Run ()
   52851        0          8 System.Runtime.CompilerServices.AsyncMethodBuilderCore/MoveNextRunner:InvokeMoveNext (object)
   52835        4          8 Microsoft.Owin.Host.HttpListener.OwinHttpListener:ProcessRequestAsync (System.Net.HttpListenerContext)
   52815        5          8 System.Runtime.CompilerServices.AsyncTaskMethodBuilder:Start<Microsoft.Owin.Host.HttpListener.OwinHttpListener/<ProcessRequestAsync>d__5> (Microsoft.Owin.Host.HttpListener.OwinHttpListener/<ProcessRequestAsync>d__5&)
   52808        9          8 Microsoft.Owin.Host.HttpListener.OwinHttpListener/<ProcessRequestAsync>d__5:MoveNext ()
   52621        3          8 Microsoft.Owin.Hosting.Utilities.Encapsulate:Invoke (System.Collections.Generic.IDictionary`2<string, object>)
   52594        4          8 Microsoft.Owin.Infrastructure.OwinMiddlewareTransition:Invoke (System.Collections.Generic.IDictionary`2<string, object>)
   52561        7          8 Microsoft.Owin.Infrastructure.AppFuncTransition:Invoke (Microsoft.Owin.IOwinContext)
   52553       19          8 Nancy.Owin.NancyMiddleware/<>c__DisplayClass4/<>c__DisplayClass6:<UseNancy>b__1 (System.Collections.Generic.IDictionary`2<string, object>)
   52403        4          8 Nancy.NancyEngineExtensions:HandleRequest (Nancy.INancyEngine,Nancy.Request,System.Func`2<Nancy.NancyContext, Nancy.NancyContext>,System.Action`1<Nancy.NancyContext>,System.Action`1<System.Exception>,System.Threading.CancellationToken)
   51297       11          8 Nancy.NancyEngine:HandleRequest (Nancy.Request,System.Func`2<Nancy.NancyContext, Nancy.NancyContext>,System.Threading.CancellationToken)
   48567        2         15 Ninject.Modules.AssemblyNameRetriever:GetAssemblyNames (System.Collections.Generic.IEnumerable`1<string>,System.Predicate`1<System.Reflection.Assembly>)
   47752       15         56 Nancy.Helpers.TaskHelpers:WhenCompleted<T_REF> (System.Threading.Tasks.Task`1<T_REF>,System.Action`1<System.Threading.Tasks.Task`1<T_REF>>,System.Action`1<System.Threading.Tasks.Task`1<T_REF>>,bool)
   44890       61          1 Nancy.Bootstrapper.NancyBootstrapperBase`1<TContainer_REF>:Initialise ()
   43596        5        247 Ninject.KernelBase/<>c__DisplayClass15:<Resolve>b__f (Ninject.Planning.Bindings.IBinding)
   43133        8        247 Ninject.Activation.Context:Resolve ()
   43094       56        247 Ninject.Activation.Context:ResolveInternal (object)
   42379       20        127 Ninject.Activation.Providers.StandardProvider:Create (Ninject.Activation.IContext)
   41979      100       3302 System.Linq.Enumerable/WhereSelectEnumerableIterator`2<TSource_REF, TResult_REF>:MoveNext ()
   36906        4         15 Ninject.Modules.AssemblyNameRetriever:CreateTemporaryAppDomain ()
   36813        6         15 System.AppDomain:CreateDomain (string,System.Security.Policy.Evidence,System.AppDomainSetup)
   35717      134        489 (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&)
   34389       14         10 Ninject.KernelBase:.ctor (Ninject.Components.IComponentContainer,Ninject.INinjectSettings,Ninject.Modules.INinjectModule[])
   34238        5         10 Ninject.KernelBase:Load (System.Collections.Generic.IEnumerable`1<string>)
   34188       14         10 Ninject.Modules.ModuleLoader:LoadModules (System.Collections.Generic.IEnumerable`1<string>)
   34177      199       4529 System.Linq.Buffer`1<TElement_REF>:.ctor (System.Collections.Generic.IEnumerable`1<TElement_REF>)
   34026        5         10 Ninject.Modules.CompiledModuleLoaderPlugin:LoadModules (System.Collections.Generic.IEnumerable`1<string>)
   33839       30       3889 System.Linq.Enumerable:ToArray<TSource_REF> (System.Collections.Generic.IEnumerable`1<TSource_REF>)
   32142       62       4564 System.Linq.Enumerable/WhereSelectArrayIterator`2<TSource_REF, TResult_REF>:MoveNext ()
   31210       21         17 Nancy.Bootstrapper.NancyBootstrapperWithRequestContainerBase`1<TContainer_REF>:GetConfiguredRequestContainer (Nancy.NancyContext)
   30087        7          5 System.Dynamic.UpdateDelegates:UpdateAndExecute2<T0_REF, T1_REF, TRet_REF> (System.Runtime.CompilerServices.CallSite,T0_REF,T1_REF)
   29806        1          9 Nancy.Bootstrappers.Ninject.NinjectNancyBootstrapper:CreateRequestContainer (Nancy.NancyContext)
   29803        0          9 Ninject.Extensions.ChildKernel.ChildKernel:.ctor (Ninject.Syntax.IResolutionRoot,Ninject.INinjectSettings,Ninject.Modules.INinjectModule[])
   29803        0          9 Ninject.StandardKernel:.ctor (Ninject.INinjectSettings,Ninject.Modules.INinjectModule[])
   29802        0          9 Ninject.KernelBase:.ctor (Ninject.INinjectSettings,Ninject.Modules.INinjectModule[])
   29610        3        222 Ninject.Activation.Providers.StandardProvider/<>c__DisplayClass4:<Create>b__2 (Ninject.Planning.Targets.ITarget)
   29607      135        222 Ninject.Activation.Providers.StandardProvider:GetValue (Ninject.Activation.IContext,Ninject.Planning.Targets.ITarget)
   29429        7        175 Ninject.Planning.Targets.Target`1<T_REF>:ResolveWithin (Ninject.Activation.IContext)
   29301        4        156 Ninject.Planning.Targets.Target`1<T_REF>:GetValue (System.Type,Ninject.Activation.IContext)
   28844        7        410 System.Linq.Enumerable:SingleOrDefault<TSource_REF> (System.Collections.Generic.IEnumerable`1<TSource_REF>)

此外,如果感兴趣,这是启动文件:

        static void Main(string[] args)
    {
        string baseUrl = args[0];
        string rootDir = args[1];

        var server = WebApp.Start(baseUrl, (appBuilder) =>
        {
            appBuilder
            .Use(typeof(RequestMiddleware))
            .UseNancy(x =>
            {
                x.Bootstrapper = new Bootstrapper(rootDir);
                x.PerformPassThrough = p =>
                {
                    Console.WriteLine("Passthrough Start: {0}", DateTime.Now.Ticks);

                    return
                    p.Request.Headers.Any(h => h.Key == "Repository") ||
                    !p.Request.Path.StartsWith("/achillescr/api");
                };
            });
        });

        using (server)
        {
            if (Type.GetType("Mono.Runtime") != null)
            {
                // on mono, processes will usually run as daemons - this allows you to listen
                // for termination signals (ctrl+c, shutdown, etc) and finalize correctly
                UnixSignal.WaitAny(new[] {
                new UnixSignal(Signum.SIGINT),
                new UnixSignal(Signum.SIGTERM),
                new UnixSignal(Signum.SIGQUIT),
                new UnixSignal(Signum.SIGHUP)
            });
            }
            else
            {
                Console.ReadLine();
            }

            Console.WriteLine("Stopping AchillesCR");
        }
    }

此外,这是Mono的版本:

Mono JIT compiler version 4.4.1 (Nightly 4.4.1.0/4747417 Wed Jun 22 11:38:12 UTC)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
        TLS:           _thread
        SIGSEGV:       normal
        Notifications: epoll
        Architecture:  armel,vpf+hard
        Disabled:      none
        Misc:          softdebug
        LLVM:          supported, not enabled
        GC:            sgen

0 个答案:

没有答案