我正在拼命想弄清楚为什么我的所有请求似乎都有大约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