From 8c06cb0b249576b69b7d738f298b3f0e4a7ef5f5 Mon Sep 17 00:00:00 2001 From: Zhaodong Tian Date: Tue, 16 Aug 2022 22:27:53 -0700 Subject: [PATCH 01/12] Add perf testing and service develop with corewcf --- .../tests/Benchmarks/Perf/WCFCorePerf.sln | 31 ++ .../Perf/WCFCorePerfClient/ISayHello.cs | 12 + .../Perf/WCFCorePerfClient/Program.cs | 200 ++++++++ .../WCFCorePerfClient.csproj | 16 + .../Perf/WCFCorePerfService/ISayHello.cs | 12 + .../WCFCorePerfService/MyCustomValidator.cs | 18 + .../Perf/WCFCorePerfService/Program.cs | 126 +++++ .../Perf/WCFCorePerfService/SayHello.cs | 61 +++ .../WCFCorePerfService.csproj | 15 + .../Perf/benchmarks.wcfcore.Perf.yml | 474 ++++++++++++++++++ 10 files changed, 965 insertions(+) create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerf.sln create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/ISayHello.cs create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/Program.cs create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/ISayHello.cs create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/MyCustomValidator.cs create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/Program.cs create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/SayHello.cs create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerf.sln b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerf.sln new file mode 100644 index 00000000000..3d9c7eece2e --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerf.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32714.290 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WCFCorePerfService", "WCFCorePerfService\WCFCorePerfService.csproj", "{35B05C6A-9FF0-4A9C-9BBE-E88963416022}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WCFCorePerfClient", "WCFCorePerfClient\WCFCorePerfClient.csproj", "{D9001454-F77C-4053-B4AE-34342351FD49}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {35B05C6A-9FF0-4A9C-9BBE-E88963416022}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {35B05C6A-9FF0-4A9C-9BBE-E88963416022}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35B05C6A-9FF0-4A9C-9BBE-E88963416022}.Release|Any CPU.ActiveCfg = Release|Any CPU + {35B05C6A-9FF0-4A9C-9BBE-E88963416022}.Release|Any CPU.Build.0 = Release|Any CPU + {D9001454-F77C-4053-B4AE-34342351FD49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D9001454-F77C-4053-B4AE-34342351FD49}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D9001454-F77C-4053-B4AE-34342351FD49}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D9001454-F77C-4053-B4AE-34342351FD49}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {BD5D3AEC-A9AB-412C-A41B-A410030B454A} + EndGlobalSection +EndGlobal diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/ISayHello.cs b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/ISayHello.cs new file mode 100644 index 00000000000..65e880231fe --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/ISayHello.cs @@ -0,0 +1,12 @@ +using System.ServiceModel; +using System.Threading.Tasks; + +namespace WCFCorePerfClient +{ + [ServiceContract] + public interface ISayHello + { + [OperationContract] + Task HelloAsync(string name); + } +} diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/Program.cs b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/Program.cs new file mode 100644 index 00000000000..09b7de9cb5d --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/Program.cs @@ -0,0 +1,200 @@ +using Microsoft.Crank.EventSources; +using System; +using System.Diagnostics; +using System.Security.Cryptography.X509Certificates; +using System.ServiceModel; +using System.ServiceModel.Security; + +namespace WCFCorePerfClient +{ + public class Parameters + { + public const string Binding = "binding"; + public const string ServiceUrl = "serviceurl"; + public const string TransferMode = "transfermode"; + public const string ReportingUrl = "reportingurl"; + public const string PerfMeasurementDuration = "perfmeasurementduration"; + } + + public enum TestBinding { BasicHttp, WSHttp, NetTcp } + + class Program + { + private TestBinding _paramBinding = TestBinding.BasicHttp; + private TimeSpan _paramPerfMeasurementDuration = s_defaultPerfMeasurementDuration; + private string _paramServiceUrl = ""; + private readonly static TimeSpan s_defaultPerfMeasurementDuration = TimeSpan.FromSeconds(10); + private string _paramTransferMode = "Buffered"; + + static void Main(string[] args) + { + Console.WriteLine("WCFCorePerf Client."); + + Program test = new Program(); + + if (test.ProcessRunOptions(args)) + { + var startTime = DateTime.Now; + int request = 0; + + BenchmarksEventSource.Register("wcfcoreperf/channelopen", Operations.Max, Operations.Max, "Channel Open Time (ms)", "Time to Open Channel in ms", "n0"); + BenchmarksEventSource.Register("wcfcoreperf/firstrequest", Operations.Max, Operations.Max, "First Request (ms)", "Time to first request in ms", "n0"); + BenchmarksEventSource.Register("wcfcoreperf/requests", Operations.Max, Operations.Sum, "Requests (" + test._paramPerfMeasurementDuration.TotalMilliseconds + " ms)", "Total number of requests", "n0"); + BenchmarksEventSource.Register("wcfcoreperf/rps/max", Operations.Max, Operations.Sum, "Requests/sec (max)", "Max requests per second", "n0"); + + switch (test._paramBinding) + { + case TestBinding.BasicHttp: + BasicHttpBinding binding = new BasicHttpBinding(); + switch (test._paramTransferMode.ToLower()) + { + case "buffered": + binding.TransferMode = TransferMode.Buffered; + break; + case "streamed": + binding.TransferMode = TransferMode.Streamed; + break; + case "streamedrequest": + binding.TransferMode = TransferMode.StreamedRequest; + break; + case "streamedresponse": + binding.TransferMode = TransferMode.StreamedResponse; + break; + default: + break; + } + + Console.WriteLine($"Testing TransferMode: {binding.TransferMode}"); + ChannelFactory factory = new ChannelFactory(binding, new EndpointAddress(test._paramServiceUrl)); + var stopwatchChannelOpen = new Stopwatch(); + stopwatchChannelOpen.Start(); + factory.Open(); + BenchmarksEventSource.Measure("wcfcoreperf/channelopen", stopwatchChannelOpen.ElapsedMilliseconds); + + var client = factory.CreateChannel(); + var stopwatchFirstReq = new Stopwatch(); + stopwatchFirstReq.Start(); + var result = client.HelloAsync("helloworld").Result; + BenchmarksEventSource.Measure("wcfcoreperf/firstrequest", stopwatchFirstReq.ElapsedMilliseconds); + + while (DateTime.Now <= startTime.Add(test._paramPerfMeasurementDuration)) + { + var rtnResult = client.HelloAsync("helloworld").Result; + request++; + } + + BenchmarksEventSource.Measure("wcfcoreperf/requests", request); + BenchmarksEventSource.Measure("wcfcoreperf/rps/max", request / test._paramPerfMeasurementDuration.TotalSeconds); + break; + case TestBinding.WSHttp: + WSHttpBinding wsHttpBinding = new WSHttpBinding(SecurityMode.TransportWithMessageCredential); + wsHttpBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; + ChannelFactory wsHttpFactory = new ChannelFactory(wsHttpBinding, new EndpointAddress(test._paramServiceUrl)); + wsHttpFactory.Credentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication + { + CertificateValidationMode = X509CertificateValidationMode.None, + RevocationMode = X509RevocationMode.NoCheck + }; + wsHttpFactory.Credentials.UserName.UserName = "abc"; + wsHttpFactory.Credentials.UserName.Password = "[PLACEHOLDER]"; + + var stopwatchWSHttpChannelOpen = new Stopwatch(); + stopwatchWSHttpChannelOpen.Start(); + wsHttpFactory.Open(); + BenchmarksEventSource.Measure("wcfcoreperf/channelopen", stopwatchWSHttpChannelOpen.ElapsedMilliseconds); + + var clientWSHttp = wsHttpFactory.CreateChannel(); + var stopwatchWSHttpFirstReq = new Stopwatch(); + stopwatchWSHttpFirstReq.Start(); + Console.WriteLine(clientWSHttp.HelloAsync("helloworld").Result); + BenchmarksEventSource.Measure("wcfcoreperf/firstrequest", stopwatchWSHttpFirstReq.ElapsedMilliseconds); + + while (DateTime.Now <= startTime.Add(test._paramPerfMeasurementDuration)) + { + var rtnResult = clientWSHttp.HelloAsync("helloworld").Result; + request++; + } + + BenchmarksEventSource.Measure("wcfcoreperf/requests", request); + BenchmarksEventSource.Measure("wcfcoreperf/rps/max", request / test._paramPerfMeasurementDuration.TotalSeconds); + break; + case TestBinding.NetTcp: + NetTcpBinding netTcpBinding = new NetTcpBinding(SecurityMode.None); + ChannelFactory netTcpFactory = new ChannelFactory(netTcpBinding, new EndpointAddress(test._paramServiceUrl)); + + var stopwatchNetTcpChannelOpen = new Stopwatch(); + stopwatchNetTcpChannelOpen.Start(); + netTcpFactory.Open(); + BenchmarksEventSource.Measure("wcfcoreperf/channelopen", stopwatchNetTcpChannelOpen.ElapsedMilliseconds); + + var clientNetTcp = netTcpFactory.CreateChannel(); + var stopwatchNetTcpFirstReq = new Stopwatch(); + stopwatchNetTcpFirstReq.Start(); + var netTcpResult = clientNetTcp.HelloAsync("helloworld").Result; + BenchmarksEventSource.Measure("wcfcoreperf/firstrequest", stopwatchNetTcpFirstReq.ElapsedMilliseconds); + + while (DateTime.Now <= startTime.Add(test._paramPerfMeasurementDuration)) + { + var rtnResult = clientNetTcp.HelloAsync("helloworld").Result; + request++; + } + + BenchmarksEventSource.Measure("wcfcoreperf/requests", request); + BenchmarksEventSource.Measure("wcfcoreperf/rps/max", request / test._paramPerfMeasurementDuration.TotalSeconds); + break; + } + } + } + + private bool ProcessRunOptions(string[] args) + { + foreach (string s in args) + { + Console.WriteLine(s); + string[] p = s.Split(new char[] { ':' }, count: 2); + if (p.Length != 2) + { + continue; + } + + switch (p[0].ToLower()) + { + case Parameters.Binding: + if (!Enum.TryParse(p[1], ignoreCase: true, result: out _paramBinding)) + { + return ReportWrongArgument(s); + } + break; + + case Parameters.PerfMeasurementDuration: + int perfPerfMeasurementDurationSeconds = 0; + if (!Int32.TryParse(p[1], out perfPerfMeasurementDurationSeconds)) + { + return ReportWrongArgument(s); + } + _paramPerfMeasurementDuration = TimeSpan.FromSeconds(perfPerfMeasurementDurationSeconds); + break; + + case Parameters.ServiceUrl: + _paramServiceUrl = p[1]; + break; + + case Parameters.TransferMode: + _paramTransferMode = p[1]; + break; + default: + Console.WriteLine("unknown argument: " + s); + continue; + } + } + + return true; + } + + private bool ReportWrongArgument(string arg) + { + Console.WriteLine("Wrong parameter: " + arg); + return false; + } + } +} diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj new file mode 100644 index 00000000000..0e11fb05b66 --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj @@ -0,0 +1,16 @@ + + + + Exe + net5.0;net6.0 + + + + + + + + + + + diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/ISayHello.cs b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/ISayHello.cs new file mode 100644 index 00000000000..683a76e1dc3 --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/ISayHello.cs @@ -0,0 +1,12 @@ +using CoreWCF; +using System.Threading.Tasks; + +namespace WCFCorePerfService +{ + [ServiceContract] + public interface ISayHello + { + [OperationContract] + Task HelloAsync(string name); + } +} diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/MyCustomValidator.cs b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/MyCustomValidator.cs new file mode 100644 index 00000000000..d1f37c97500 --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/MyCustomValidator.cs @@ -0,0 +1,18 @@ +using CoreWCF.IdentityModel.Selectors; +using System; +using System.Threading.Tasks; + +namespace WCFCorePerfService +{ + public class MyCustomValidator : UserNamePasswordValidator + { + public override ValueTask ValidateAsync(string userName, string password) + { + if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password)) + { + return new ValueTask(Task.CompletedTask); + } + return new ValueTask(Task.FromException(new Exception("username and password cannot be empty"))); + } + } +} diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/Program.cs b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/Program.cs new file mode 100644 index 00000000000..de8fb9d14da --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/Program.cs @@ -0,0 +1,126 @@ +using CoreWCF; +using CoreWCF.Configuration; +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Diagnostics; +using System.IO; +using System.Net; + +namespace WCFCorePerfService +{ + public class Program + { + static void Main(string[] args) + { + string filePath = Path.Combine(Environment.CurrentDirectory, "WCFCorePerfService.exe"); + Console.WriteLine(filePath); + string command = $" advfirewall firewall add rule name=\"WCFCorePerfService\" dir=in protocol=any action=allow program=\"{filePath}\" enable=yes"; + ExecuteCommand(command, Environment.CurrentDirectory, TimeSpan.FromSeconds(20)); + Console.WriteLine("Application start."); + + using (var host = CreateWebHostBuilder(args).Build()) + { + host.Start(); + + Console.WriteLine("Service is Ready"); + Console.WriteLine("Press Any Key to Terminate..."); + Console.ReadLine(); + } + + command = $" advfirewall firewall delete rule name=\"WCFCorePerfService\" program=\"{filePath}\""; + ExecuteCommand(command, Environment.CurrentDirectory, TimeSpan.FromSeconds(20)); + Console.WriteLine("Clean up the firewall rule."); + } + + public static IWebHostBuilder CreateWebHostBuilder(string[] args) => + WebHost.CreateDefaultBuilder(args) + .UseKestrel(options => + { + options.ListenLocalhost(8080); + options.Listen(IPAddress.Loopback, 8443, listenOptions => + { + listenOptions.UseHttps(); + } + ); + }) + .UseNetTcp(8808) + .UseStartup(); + + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddServiceModelServices(); + } + + public void Configure(IApplicationBuilder app) + { + WSHttpBinding serverBinding = new WSHttpBinding(SecurityMode.TransportWithMessageCredential); + serverBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; + app.UseServiceModel(builder => + { + builder.AddService(); + builder.AddServiceEndpoint(new BasicHttpBinding(), "/WCFCorePerf/TestService.svc/BasicHttp"); + builder.AddServiceEndpoint(new NetTcpBinding(SecurityMode.None), "/WCFCorePerf/TestService.svc/NetTcp"); + builder.AddServiceEndpoint(serverBinding, "/WCFCorePerf/TestService.svc/WSHttp"); + Action serviceHost = host => ChangeHostBehavior(host); + builder.ConfigureServiceHostBase(serviceHost); + }); + } + + public void ChangeHostBehavior(ServiceHostBase host) + { + var srvCredentials = new CoreWCF.Description.ServiceCredentials(); + srvCredentials.UserNameAuthentication.UserNamePasswordValidationMode + = CoreWCF.Security.UserNamePasswordValidationMode.Custom; + srvCredentials.UserNameAuthentication.CustomUserNamePasswordValidator + = new MyCustomValidator(); + host.Description.Behaviors.Add(srvCredentials); + } + } + + private static int ExecuteCommand(string command, string workingDirectory, TimeSpan timeout) + { + Process process = new Process(); + process.StartInfo.FileName = "netsh"; + process.StartInfo.Arguments = command; + + if (workingDirectory != null) + { + process.StartInfo.WorkingDirectory = workingDirectory; + } + + process.StartInfo.UseShellExecute = false; + process.Start(); + + bool flag; + if (timeout.TotalMilliseconds >= Int32.MaxValue) + { + flag = process.WaitForExit(Int32.MaxValue); + } + else + { + flag = process.WaitForExit((int)timeout.TotalMilliseconds); + } + + if (!flag) + { + process.Kill(); + } + + if (!flag) + { + throw new TimeoutException(string.Format("Command '{0}' was killed by timeout {1}.", new object[] + { + command, + timeout.ToString() + })); + } + + return process.ExitCode; + } + } +} diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/SayHello.cs b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/SayHello.cs new file mode 100644 index 00000000000..a37b597c8dc --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/SayHello.cs @@ -0,0 +1,61 @@ +using System; +using System.Diagnostics; +using System.Threading.Tasks; + +namespace WCFCorePerfService +{ + public class SayHello : ISayHello + { + public Task HelloAsync(string name) + { + return Task.Factory.StartNew(() => { return name; }); + } + + public bool Cleanup(string name) + { + string command = $" advfirewall firewall delete rule name=\"{name}\""; + bool flag = false; + int code = ExecuteCommand(command, Environment.CurrentDirectory, TimeSpan.FromSeconds(20)); + if (code == 0) + flag = true; + + return flag; + } + + private int ExecuteCommand(string command, string workingDirectory, TimeSpan timeout) + { + Process process = new Process(); + process.StartInfo.FileName = "netsh"; + process.StartInfo.Arguments = command; + if (workingDirectory != null) + { + process.StartInfo.WorkingDirectory = workingDirectory; + } + process.StartInfo.UseShellExecute = false; + process.Start(); + bool flag; + if (timeout.TotalMilliseconds >= Int32.MaxValue) + { + flag = process.WaitForExit(Int32.MaxValue); + } + else + { + flag = process.WaitForExit((int)timeout.TotalMilliseconds); + } + if (!flag) + { + process.Kill(); + } + + if (!flag) + { + throw new TimeoutException(string.Format("Command '{0}' was killed by timeout {1}.", new object[] + { + command, + timeout.ToString() + })); + } + return process.ExitCode; + } + } +} diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj new file mode 100644 index 00000000000..eb08af5d9ca --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj @@ -0,0 +1,15 @@ + + + + Exe + net5.0;net6.0 + + + + + + + + + + diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml new file mode 100644 index 00000000000..6f08cc747e5 --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml @@ -0,0 +1,474 @@ +jobs: + WCFCorePerf: + source: + repository: https://github.com/dotnet/wcf.git + branchOrCommit: main + project: src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerf/WCFCorePerfClient.csproj + isConsoleApp: true + waitForExit: true + variables: + Duration: 300 + arguments: " binding:{{Binding}} serviceurl:{{Protocol}}://{{serverAddress}}{% if Binding == 'WSHttp' %}:{{serverPort}}{% endif %}/WCFCorePerf/TestService.svc/{{EndpointAddress}} transfermode:{{TransferMode}} perfmeasurementduration:{{Duration}} " + WCFCorePerfService: + source: + repository: https://github.com/dotnet/wcf.git + branchOrCommit: main + project: src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj + isConsoleApp: true + + +scenarios: + BasicHttpWithBuffered: + application: + job: WCFCorePerfService + load: + job: WCFCorePerf + variables: + Protocol: Http + EndpointAddress: BasicHttp + Binding: BasicHttp + TransferMode: Buffered + serverPort: 8080 + BasicHttpWithDefault: + application: + job: WCFCorePerfService + load: + job: WCFCorePerf + variables: + Protocol: Http + EndpointAddress: BasicHttp + Binding: BasicHttp + TransferMode: Default + serverPort: 8080 + WSHttp: + application: + job: WCFCorePerfService + load: + job: WCFCorePerf + variables: + Protocol: Https + EndpointAddress: WSHttp + Binding: WSHttp + serverPort: 8443 + NetTcp: + application: + job: WCFCorePerfService + load: + job: WCFCorePerf + variables: + Protocol: net.tcp + EndpointAddress: NetTcp + Binding: NetTcp + serverPort: 8808 + +profiles: + short: + variables: + warmup: 3 + duration: 7 + + pgo: + jobs: + application: + environmentVariables: + - DOTNET_TieredPGO: 1 + - DOTNET_TC_QuickJitForLoops: 1 + - DOTNET_ReadyToRun: 0 + + local: + variables: + serverAddress: localhost + jobs: + db: + endpoints: + - http://localhost:5010 + aliases: + - downstream + application: + endpoints: + - http://localhost:5010 + variables: + databaseServer: localhost + load: + endpoints: + - http://localhost:5010 + aliases: + - warmup + + aspnet-citrine-lin: + variables: + serverAddress: 10.0.0.102 + cores: 28 + jobs: + db: + endpoints: + - http://asp-citrine-db:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-lin:5001 + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - http://asp-citrine-load:5001 + aliases: + - warmup + + aspnet-citrine-lin-relay: + variables: + serverAddress: 10.0.0.102 + cores: 28 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinedb + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinelin + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrineload + aliases: + - warmup + + aspnet-citrine-win: + variables: + serverAddress: 10.0.0.104 + cores: 28 + jobs: + db: + endpoints: + - http://asp-citrine-load:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-win:5001 + variables: + databaseServer: 10.0.0.105 + load: + endpoints: + - http://asp-citrine-db:5001 + aliases: + - warmup + + aspnet-citrine-win-relay: + variables: + serverAddress: 10.0.0.104 + cores: 28 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrineload + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinewin + variables: + databaseServer: 10.0.0.105 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinedb + aliases: + - warmup + + aspnet-citrine-win2: + variables: + serverAddress: 10.0.0.101 + cores: 28 + jobs: + db: + endpoints: + - http://asp-citrine-db:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-win2:5001 + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - http://asp-citrine-amd:5001 + aliases: + - warmup + + aspnet-citrine-win-relay: + variables: + serverAddress: 10.0.0.101 + cores: 28 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinedb + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinewin2 + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrineload + aliases: + - warmup + + aspnet-citrine-arm: + variables: + serverAddress: 10.0.0.107 + cores: 32 + jobs: + db: + endpoints: + - http://asp-citrine-db:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-arm:5001 + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - http://asp-citrine-load:5001 + aliases: + - warmup + + aspnet-citrine-arm-relay: + variables: + serverAddress: 10.0.0.107 + cores: 32 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinedb + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinearm + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrineload + aliases: + - warmup + + aspnet-citrine-ampere: + variables: + serverAddress: 10.0.0.108 + cores: 80 + jobs: + db: + endpoints: + - http://asp-citrine-amd2:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-ampere:5001 + variables: + databaseServer: 10.0.0.109 + load: + endpoints: + - http://asp-citrine-amd2:5001 + aliases: + - warmup + + aspnet-citrine-arm-lin: + variables: + serverAddress: 10.0.0.108 + cores: 80 + jobs: + db: + endpoints: + - http://asp-citrine-amd2:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-ampere:5001 + variables: + databaseServer: 10.0.0.109 + load: + endpoints: + - http://asp-citrine-amd2:5001 + aliases: + - warmup + + aspnet-citrine-arm-win: + variables: + serverAddress: 10.0.0.110 + cores: 80 + jobs: + db: + endpoints: + - http://asp-citrine-amd2:5001 + aliases: + - downstream + application: + endpoints: + - http://10.240.177.200:5001 + variables: + databaseServer: 10.0.0.109 + load: + endpoints: + - http://asp-citrine-amd:5001 + aliases: + - warmup + + aspnet-citrine-amd2: + variables: + serverAddress: 10.0.0.109 + cores: 48 + jobs: + db: + endpoints: + - http://asp-citrine-ampere:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-amd2:5001 + variables: + databaseServer: 10.0.0.108 + load: + endpoints: + - http://asp-citrine-ampere:5001 + aliases: + - warmup + + aspnet-citrine-amd: + variables: + serverAddress: 10.0.0.106 + cores: 48 + jobs: + db: + endpoints: + - http://asp-citrine-load:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-amd:5001 + variables: + databaseServer: 10.0.0.105 + load: + endpoints: + - http://asp-citrine-db:5001 + aliases: + - warmup + + aspnet-citrine-amd-relay: + variables: + serverAddress: 10.0.0.106 + cores: 48 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrineload + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrineamd + variables: + databaseServer: 10.0.0.105 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinedb + aliases: + - warmup + + aspnet-perf-lin: + variables: + serverAddress: 10.0.0.102 + cores: 12 + jobs: + db: + endpoints: + - http://asp-perf-db:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-perf-lin:5001 + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - http://asp-perf-load:5001 + aliases: + - warmup + + aspnet-perf-lin-relay: + variables: + serverAddress: 10.0.0.102 + cores: 12 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/perfdb + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/perflin + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/perfload + aliases: + - warmup + + aspnet-perf-win: + variables: + serverAddress: 10.0.0.110 + cores: 12 + jobs: + db: + endpoints: + - http://asp-perf-load:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-perf-win:5001 + variables: + databaseServer: 10.0.0.104 + load: + endpoints: + - http://asp-perf-db:5001 + aliases: + - warmup + + aspnet-perf-win-relay: + variables: + serverAddress: 10.0.0.110 + cores: 12 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/perfload + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/perfwin + variables: + databaseServer: 10.0.0.104 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/perfsb + aliases: + - warmup \ No newline at end of file From ae83d13bd93cddd4f26c2b7ac95d558d086d2ac3 Mon Sep 17 00:00:00 2001 From: Zhaodong Tian Date: Tue, 16 Aug 2022 23:05:23 -0700 Subject: [PATCH 02/12] update targetframework --- .../Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj | 2 +- .../Perf/WCFCorePerfService/WCFCorePerfService.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj index 0e11fb05b66..d23feb18d98 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj @@ -2,7 +2,7 @@ Exe - net5.0;net6.0 + net7.0 diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj index eb08af5d9ca..a3c3830341a 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj @@ -2,7 +2,7 @@ Exe - net5.0;net6.0 + net7.0 From ddf3fa30a129bfd8f7df71fc57b071b54f62332f Mon Sep 17 00:00:00 2001 From: Zhaodong Tian Date: Tue, 16 Aug 2022 23:59:46 -0700 Subject: [PATCH 03/12] update the yml --- .../tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml index 6f08cc747e5..a45604c30ac 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml @@ -3,7 +3,7 @@ jobs: source: repository: https://github.com/dotnet/wcf.git branchOrCommit: main - project: src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerf/WCFCorePerfClient.csproj + project: src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj isConsoleApp: true waitForExit: true variables: @@ -471,4 +471,4 @@ profiles: endpoints: - https://aspnetperf.servicebus.windows.net/perfsb aliases: - - warmup \ No newline at end of file + - warmup From d5277a4c1aee058d9c79f23df9aec53057b2f600 Mon Sep 17 00:00:00 2001 From: Zhaodong Tian Date: Wed, 17 Aug 2022 00:04:53 -0700 Subject: [PATCH 04/12] Add port for http and nettcp --- .../tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml | 2 +- .../tests/Benchmarks/WCFCorePerf/benchmarks.wcfcore.Perf.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml index a45604c30ac..2d5678aaf2c 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml @@ -8,7 +8,7 @@ jobs: waitForExit: true variables: Duration: 300 - arguments: " binding:{{Binding}} serviceurl:{{Protocol}}://{{serverAddress}}{% if Binding == 'WSHttp' %}:{{serverPort}}{% endif %}/WCFCorePerf/TestService.svc/{{EndpointAddress}} transfermode:{{TransferMode}} perfmeasurementduration:{{Duration}} " + arguments: " binding:{{Binding}} serviceurl:{{Protocol}}://{{serverAddress}}:{{serverPort}}/WCFCorePerf/TestService.svc/{{EndpointAddress}} transfermode:{{TransferMode}} perfmeasurementduration:{{Duration}} " WCFCorePerfService: source: repository: https://github.com/dotnet/wcf.git diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/benchmarks.wcfcore.Perf.yml b/src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/benchmarks.wcfcore.Perf.yml index 1399c1430c3..59a1e6ba0e4 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/benchmarks.wcfcore.Perf.yml +++ b/src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/benchmarks.wcfcore.Perf.yml @@ -2,7 +2,7 @@ jobs: WCFCorePerf: source: repository: https://github.com/dotnet/wcf.git - branchOrCommit: master + branchOrCommit: main project: src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/WCFCorePerf/WCFCorePerf.csproj isConsoleApp: true waitForExit: true @@ -12,7 +12,7 @@ jobs: WCFCorePerfService: source: repository: https://github.com/dotnet/wcf.git - branchOrCommit: master + branchOrCommit: main project: src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/WCFCorePerfService/WCFCorePerfService.csproj arguments: " port:{{serverPort}}" isConsoleApp: true From 0ec724372c2aadb5313ee0554ec4faee74741f0d Mon Sep 17 00:00:00 2001 From: Zhaodong Tian Date: Mon, 29 Aug 2022 19:16:35 -0700 Subject: [PATCH 05/12] Rename project name --- .../CoreWCFPerfService.csproj} | 0 .../CoreWCFPerfService}/ISayHello.cs | 0 .../CoreWCFPerfService}/MyCustomValidator.cs | 0 .../CoreWCFPerfService}/Program.cs | 0 .../CoreWCFPerfService}/SayHello.cs | 0 .../WCFCorePerf.sln | 2 +- .../WCFCorePerfClient/ISayHello.cs | 0 .../WCFCorePerfClient/Program.cs | 0 .../WCFCorePerfClient.csproj | 8 +- .../benchmarks.wcfcore.Perf.yml | 4 +- .../NetfxWCFPerfService.csproj} | 2 +- .../NetfxWCFPerfService}/Program.cs | 0 .../WCFCorePerf.sln | 4 +- .../WCFCorePerfClient}/ClientContracts.cs | 0 .../WCFCorePerfClient}/Program.cs | 0 .../WCFCorePerfClient.csproj} | 10 +- .../benchmarks.wcfcore.Perf.yml | 475 ++++++++++++++++++ .../WCFCorePerf/benchmarks.wcfcore.Perf.yml | 180 ------- 18 files changed, 490 insertions(+), 195 deletions(-) rename src/System.Private.ServiceModel/tests/Benchmarks/{Perf/WCFCorePerfService/WCFCorePerfService.csproj => PerfUsingCoreWCFService/CoreWCFPerfService/CoreWCFPerfService.csproj} (100%) rename src/System.Private.ServiceModel/tests/Benchmarks/{Perf/WCFCorePerfService => PerfUsingCoreWCFService/CoreWCFPerfService}/ISayHello.cs (100%) rename src/System.Private.ServiceModel/tests/Benchmarks/{Perf/WCFCorePerfService => PerfUsingCoreWCFService/CoreWCFPerfService}/MyCustomValidator.cs (100%) rename src/System.Private.ServiceModel/tests/Benchmarks/{Perf/WCFCorePerfService => PerfUsingCoreWCFService/CoreWCFPerfService}/Program.cs (100%) rename src/System.Private.ServiceModel/tests/Benchmarks/{Perf/WCFCorePerfService => PerfUsingCoreWCFService/CoreWCFPerfService}/SayHello.cs (100%) rename src/System.Private.ServiceModel/tests/Benchmarks/{Perf => PerfUsingCoreWCFService}/WCFCorePerf.sln (92%) rename src/System.Private.ServiceModel/tests/Benchmarks/{Perf => PerfUsingCoreWCFService}/WCFCorePerfClient/ISayHello.cs (100%) rename src/System.Private.ServiceModel/tests/Benchmarks/{Perf => PerfUsingCoreWCFService}/WCFCorePerfClient/Program.cs (100%) rename src/System.Private.ServiceModel/tests/Benchmarks/{Perf => PerfUsingCoreWCFService}/WCFCorePerfClient/WCFCorePerfClient.csproj (90%) rename src/System.Private.ServiceModel/tests/Benchmarks/{Perf => PerfUsingCoreWCFService}/benchmarks.wcfcore.Perf.yml (98%) rename src/System.Private.ServiceModel/tests/Benchmarks/{WCFCorePerf/WCFCorePerfService/WCFCorePerfService.csproj => PerfUsingNetfxWCFService/NetfxWCFPerfService/NetfxWCFPerfService.csproj} (65%) rename src/System.Private.ServiceModel/tests/Benchmarks/{WCFCorePerf/WCFCorePerfService => PerfUsingNetfxWCFService/NetfxWCFPerfService}/Program.cs (100%) rename src/System.Private.ServiceModel/tests/Benchmarks/{WCFCorePerf => PerfUsingNetfxWCFService}/WCFCorePerf.sln (83%) rename src/System.Private.ServiceModel/tests/Benchmarks/{WCFCorePerf/WCFCorePerf => PerfUsingNetfxWCFService/WCFCorePerfClient}/ClientContracts.cs (100%) rename src/System.Private.ServiceModel/tests/Benchmarks/{WCFCorePerf/WCFCorePerf => PerfUsingNetfxWCFService/WCFCorePerfClient}/Program.cs (100%) rename src/System.Private.ServiceModel/tests/Benchmarks/{WCFCorePerf/WCFCorePerf/WCFCorePerf.csproj => PerfUsingNetfxWCFService/WCFCorePerfClient/WCFCorePerfClient.csproj} (80%) create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/benchmarks.wcfcore.Perf.yml delete mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/benchmarks.wcfcore.Perf.yml diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/CoreWCFPerfService.csproj similarity index 100% rename from src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj rename to src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/CoreWCFPerfService.csproj diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/ISayHello.cs b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/ISayHello.cs similarity index 100% rename from src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/ISayHello.cs rename to src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/ISayHello.cs diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/MyCustomValidator.cs b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/MyCustomValidator.cs similarity index 100% rename from src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/MyCustomValidator.cs rename to src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/MyCustomValidator.cs diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/Program.cs b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/Program.cs similarity index 100% rename from src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/Program.cs rename to src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/Program.cs diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/SayHello.cs b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/SayHello.cs similarity index 100% rename from src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/SayHello.cs rename to src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/SayHello.cs diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerf.sln b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerf.sln similarity index 92% rename from src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerf.sln rename to src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerf.sln index 3d9c7eece2e..6deb1d612be 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerf.sln +++ b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerf.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.3.32714.290 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WCFCorePerfService", "WCFCorePerfService\WCFCorePerfService.csproj", "{35B05C6A-9FF0-4A9C-9BBE-E88963416022}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CoreWCFPerfService", "CoreWCFPerfService\CoreWCFPerfService.csproj", "{35B05C6A-9FF0-4A9C-9BBE-E88963416022}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WCFCorePerfClient", "WCFCorePerfClient\WCFCorePerfClient.csproj", "{D9001454-F77C-4053-B4AE-34342351FD49}" EndProject diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/ISayHello.cs b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/ISayHello.cs similarity index 100% rename from src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/ISayHello.cs rename to src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/ISayHello.cs diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/Program.cs b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/Program.cs similarity index 100% rename from src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/Program.cs rename to src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/Program.cs diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/WCFCorePerfClient.csproj similarity index 90% rename from src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj rename to src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/WCFCorePerfClient.csproj index d23feb18d98..19fdc98fb40 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj +++ b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/WCFCorePerfClient.csproj @@ -7,10 +7,10 @@ - - - - + + + + diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/benchmarks.wcfcore.Perf.yml similarity index 98% rename from src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml rename to src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/benchmarks.wcfcore.Perf.yml index 2d5678aaf2c..ded61d26724 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml +++ b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/benchmarks.wcfcore.Perf.yml @@ -3,7 +3,7 @@ jobs: source: repository: https://github.com/dotnet/wcf.git branchOrCommit: main - project: src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj + project: src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/WCFCorePerfClient.csproj isConsoleApp: true waitForExit: true variables: @@ -13,7 +13,7 @@ jobs: source: repository: https://github.com/dotnet/wcf.git branchOrCommit: main - project: src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj + project: src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/CoreWCFPerfService.csproj isConsoleApp: true diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/WCFCorePerfService/WCFCorePerfService.csproj b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/NetfxWCFPerfService/NetfxWCFPerfService.csproj similarity index 65% rename from src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/WCFCorePerfService/WCFCorePerfService.csproj rename to src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/NetfxWCFPerfService/NetfxWCFPerfService.csproj index 8a147311663..120e38c3150 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/WCFCorePerfService/WCFCorePerfService.csproj +++ b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/NetfxWCFPerfService/NetfxWCFPerfService.csproj @@ -2,7 +2,7 @@ Exe - net5.0;netcoreapp3.1 + net7.0 diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/WCFCorePerfService/Program.cs b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/NetfxWCFPerfService/Program.cs similarity index 100% rename from src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/WCFCorePerfService/Program.cs rename to src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/NetfxWCFPerfService/Program.cs diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/WCFCorePerf.sln b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/WCFCorePerf.sln similarity index 83% rename from src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/WCFCorePerf.sln rename to src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/WCFCorePerf.sln index a63a093dcb8..391590c4341 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/WCFCorePerf.sln +++ b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/WCFCorePerf.sln @@ -3,9 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.30323.103 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WCFCorePerf", "WCFCorePerf\WCFCorePerf.csproj", "{57DAD894-E349-43FD-9A55-0924F9F5D31A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WCFCorePerfClient", "WCFCorePerfClient\WCFCorePerfClient.csproj", "{57DAD894-E349-43FD-9A55-0924F9F5D31A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WCFCorePerfService", "WCFCorePerfService\WCFCorePerfService.csproj", "{BEB8FF58-A77B-4F14-BB4F-A07C0BED0227}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetfxWCFPerfService", "NetfxWCFPerfService\NetfxWCFPerfService.csproj", "{BEB8FF58-A77B-4F14-BB4F-A07C0BED0227}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/WCFCorePerf/ClientContracts.cs b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/WCFCorePerfClient/ClientContracts.cs similarity index 100% rename from src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/WCFCorePerf/ClientContracts.cs rename to src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/WCFCorePerfClient/ClientContracts.cs diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/WCFCorePerf/Program.cs b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/WCFCorePerfClient/Program.cs similarity index 100% rename from src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/WCFCorePerf/Program.cs rename to src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/WCFCorePerfClient/Program.cs diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/WCFCorePerf/WCFCorePerf.csproj b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/WCFCorePerfClient/WCFCorePerfClient.csproj similarity index 80% rename from src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/WCFCorePerf/WCFCorePerf.csproj rename to src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/WCFCorePerfClient/WCFCorePerfClient.csproj index 40da6011173..9cbd7338696 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/WCFCorePerf/WCFCorePerf.csproj +++ b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/WCFCorePerfClient/WCFCorePerfClient.csproj @@ -2,15 +2,15 @@ Exe - net5.0;netcoreapp3.1 + net7.0 - - - - + + + + diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/benchmarks.wcfcore.Perf.yml b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/benchmarks.wcfcore.Perf.yml new file mode 100644 index 00000000000..b0f7c6d8ba6 --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/benchmarks.wcfcore.Perf.yml @@ -0,0 +1,475 @@ +jobs: + WCFCorePerf: + source: + repository: https://github.com/dotnet/wcf.git + branchOrCommit: main + project: src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/WCFCorePerfClient/WCFCorePerfClient.csproj + isConsoleApp: true + waitForExit: true + variables: + Duration: 300 + arguments: " binding:{{Binding}} serviceurl:{{Protocol}}://{{serverAddress}}{% if Binding == 'WSHttp' %}:{{serverPort}}{% endif %}/WCFCorePerf/TestService.svc/{{EndpointAddress}} transfermode:{{TransferMode}} perfmeasurementduration:{{Duration}} " + WCFCorePerfService: + source: + repository: https://github.com/dotnet/wcf.git + branchOrCommit: main + project: src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingNetfxWCFService/NetfxWCFPerfService/NetfxWCFPerfService.csproj + arguments: " port:{{serverPort}}" + isConsoleApp: true + + +scenarios: + BasicHttpWithBuffered: + application: + job: WCFCorePerfService + load: + job: WCFCorePerf + variables: + Protocol: Http + EndpointAddress: BasicHttp + Binding: BasicHttp + TransferMode: Buffered + serverPort: 5000 + BasicHttpWithDefault: + application: + job: WCFCorePerfService + load: + job: WCFCorePerf + variables: + Protocol: Http + EndpointAddress: BasicHttp + Binding: BasicHttp + TransferMode: Default + serverPort: 5000 + WSHttp: + application: + job: WCFCorePerfService + load: + job: WCFCorePerf + variables: + Protocol: Https + EndpointAddress: WSHttp + Binding: WSHttp + serverPort: 5000 + NetTcp: + application: + job: WCFCorePerfService + load: + job: WCFCorePerf + variables: + Protocol: net.tcp + EndpointAddress: NetTcp + Binding: NetTcp + serverPort: 5000 + +profiles: + short: + variables: + warmup: 3 + duration: 7 + + pgo: + jobs: + application: + environmentVariables: + - DOTNET_TieredPGO: 1 + - DOTNET_TC_QuickJitForLoops: 1 + - DOTNET_ReadyToRun: 0 + + local: + variables: + serverAddress: localhost + jobs: + db: + endpoints: + - http://localhost:5010 + aliases: + - downstream + application: + endpoints: + - http://localhost:5010 + variables: + databaseServer: localhost + load: + endpoints: + - http://localhost:5010 + aliases: + - warmup + + aspnet-citrine-lin: + variables: + serverAddress: 10.0.0.102 + cores: 28 + jobs: + db: + endpoints: + - http://asp-citrine-db:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-lin:5001 + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - http://asp-citrine-load:5001 + aliases: + - warmup + + aspnet-citrine-lin-relay: + variables: + serverAddress: 10.0.0.102 + cores: 28 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinedb + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinelin + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrineload + aliases: + - warmup + + aspnet-citrine-win: + variables: + serverAddress: 10.0.0.104 + cores: 28 + jobs: + db: + endpoints: + - http://asp-citrine-load:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-win:5001 + variables: + databaseServer: 10.0.0.105 + load: + endpoints: + - http://asp-citrine-db:5001 + aliases: + - warmup + + aspnet-citrine-win-relay: + variables: + serverAddress: 10.0.0.104 + cores: 28 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrineload + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinewin + variables: + databaseServer: 10.0.0.105 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinedb + aliases: + - warmup + + aspnet-citrine-win2: + variables: + serverAddress: 10.0.0.101 + cores: 28 + jobs: + db: + endpoints: + - http://asp-citrine-db:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-win2:5001 + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - http://asp-citrine-amd:5001 + aliases: + - warmup + + aspnet-citrine-win-relay: + variables: + serverAddress: 10.0.0.101 + cores: 28 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinedb + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinewin2 + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrineload + aliases: + - warmup + + aspnet-citrine-arm: + variables: + serverAddress: 10.0.0.107 + cores: 32 + jobs: + db: + endpoints: + - http://asp-citrine-db:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-arm:5001 + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - http://asp-citrine-load:5001 + aliases: + - warmup + + aspnet-citrine-arm-relay: + variables: + serverAddress: 10.0.0.107 + cores: 32 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinedb + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinearm + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrineload + aliases: + - warmup + + aspnet-citrine-ampere: + variables: + serverAddress: 10.0.0.108 + cores: 80 + jobs: + db: + endpoints: + - http://asp-citrine-amd2:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-ampere:5001 + variables: + databaseServer: 10.0.0.109 + load: + endpoints: + - http://asp-citrine-amd2:5001 + aliases: + - warmup + + aspnet-citrine-arm-lin: + variables: + serverAddress: 10.0.0.108 + cores: 80 + jobs: + db: + endpoints: + - http://asp-citrine-amd2:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-ampere:5001 + variables: + databaseServer: 10.0.0.109 + load: + endpoints: + - http://asp-citrine-amd2:5001 + aliases: + - warmup + + aspnet-citrine-arm-win: + variables: + serverAddress: 10.0.0.110 + cores: 80 + jobs: + db: + endpoints: + - http://asp-citrine-amd2:5001 + aliases: + - downstream + application: + endpoints: + - http://10.240.177.200:5001 + variables: + databaseServer: 10.0.0.109 + load: + endpoints: + - http://asp-citrine-amd:5001 + aliases: + - warmup + + aspnet-citrine-amd2: + variables: + serverAddress: 10.0.0.109 + cores: 48 + jobs: + db: + endpoints: + - http://asp-citrine-ampere:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-amd2:5001 + variables: + databaseServer: 10.0.0.108 + load: + endpoints: + - http://asp-citrine-ampere:5001 + aliases: + - warmup + + aspnet-citrine-amd: + variables: + serverAddress: 10.0.0.106 + cores: 48 + jobs: + db: + endpoints: + - http://asp-citrine-load:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-amd:5001 + variables: + databaseServer: 10.0.0.105 + load: + endpoints: + - http://asp-citrine-db:5001 + aliases: + - warmup + + aspnet-citrine-amd-relay: + variables: + serverAddress: 10.0.0.106 + cores: 48 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrineload + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrineamd + variables: + databaseServer: 10.0.0.105 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinedb + aliases: + - warmup + + aspnet-perf-lin: + variables: + serverAddress: 10.0.0.102 + cores: 12 + jobs: + db: + endpoints: + - http://asp-perf-db:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-perf-lin:5001 + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - http://asp-perf-load:5001 + aliases: + - warmup + + aspnet-perf-lin-relay: + variables: + serverAddress: 10.0.0.102 + cores: 12 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/perfdb + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/perflin + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/perfload + aliases: + - warmup + + aspnet-perf-win: + variables: + serverAddress: 10.0.0.110 + cores: 12 + jobs: + db: + endpoints: + - http://asp-perf-load:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-perf-win:5001 + variables: + databaseServer: 10.0.0.104 + load: + endpoints: + - http://asp-perf-db:5001 + aliases: + - warmup + + aspnet-perf-win-relay: + variables: + serverAddress: 10.0.0.110 + cores: 12 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/perfload + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/perfwin + variables: + databaseServer: 10.0.0.104 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/perfsb + aliases: + - warmup diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/benchmarks.wcfcore.Perf.yml b/src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/benchmarks.wcfcore.Perf.yml deleted file mode 100644 index 59a1e6ba0e4..00000000000 --- a/src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/benchmarks.wcfcore.Perf.yml +++ /dev/null @@ -1,180 +0,0 @@ -jobs: - WCFCorePerf: - source: - repository: https://github.com/dotnet/wcf.git - branchOrCommit: main - project: src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/WCFCorePerf/WCFCorePerf.csproj - isConsoleApp: true - waitForExit: true - variables: - Duration: 300 - arguments: " binding:{{Binding}} serviceurl:{{Protocol}}://{{serverAddress}}{% if Binding == 'WSHttp' %}:{{serverPort}}{% endif %}/WCFCorePerf/TestService.svc/{{EndpointAddress}} transfermode:{{TransferMode}} perfmeasurementduration:{{Duration}} " - WCFCorePerfService: - source: - repository: https://github.com/dotnet/wcf.git - branchOrCommit: main - project: src/System.Private.ServiceModel/tests/Benchmarks/WCFCorePerf/WCFCorePerfService/WCFCorePerfService.csproj - arguments: " port:{{serverPort}}" - isConsoleApp: true - - -scenarios: - BasicHttpWithBuffered: - application: - job: WCFCorePerfService - load: - job: WCFCorePerf - variables: - Protocol: Http - EndpointAddress: BasicHttp - Binding: BasicHttp - TransferMode: Buffered - BasicHttpWithDefault: - application: - job: WCFCorePerfService - load: - job: WCFCorePerf - variables: - Protocol: Http - EndpointAddress: BasicHttp - Binding: BasicHttp - TransferMode: Default - WSHttp: - application: - job: WCFCorePerfService - load: - job: WCFCorePerf - variables: - Protocol: Https - EndpointAddress: WSHttp - Binding: WSHttp - NetTcp: - application: - job: WCFCorePerfService - load: - job: WCFCorePerf - variables: - Protocol: net.tcp - EndpointAddress: NetTcp - Binding: NetTcp - -profiles: - local: - variables: - serverAddress: localhost - serverPort: 5000 - jobs: - application: - endpoints: - - http://localhost:5010 - load: - endpoints: - - http://localhost:5010 - - aspnet-citrine-lin: - variables: - serverPort: 5000 - serverAddress: 10.0.0.102 - cores: 28 - jobs: - db: - endpoints: - - http://asp-citrine-db:5001 - application: - endpoints: - - http://asp-citrine-lin:5001 - variables: - databaseServer: 10.0.0.103 - load: - endpoints: - - http://asp-citrine-load:5001 - - aspnet-citrine-win: - variables: - serverPort: 5000 - serverAddress: 10.0.0.104 - cores: 28 - jobs: - db: - endpoints: - - http://asp-citrine-load:5001 - application: - endpoints: - - http://asp-citrine-win:5001 - variables: - databaseServer: 10.0.0.105 - load: - endpoints: - - http://asp-citrine-db:5001 - - aspnet-citrine-arm: - variables: - serverPort: 5000 - serverAddress: 10.0.0.107 - cores: 32 - jobs: - db: - endpoints: - - http://asp-citrine-db:5001 - application: - endpoints: - - http://asp-citrine-arm:5001 - variables: - databaseServer: 10.0.0.103 - load: - endpoints: - - http://asp-citrine-load:5001 - - aspnet-citrine-amd: - variables: - serverPort: 5000 - serverAddress: 10.0.0.106 - cores: 48 - jobs: - db: - endpoints: - - http://asp-citrine-load:5001 - application: - endpoints: - - http://asp-citrine-amd:5001 - variables: - databaseServer: 10.0.0.105 - load: - endpoints: - - http://asp-citrine-db:5001 - - aspnet-perf-lin: - variables: - serverPort: 5000 - serverAddress: 10.0.0.102 - cores: 12 - jobs: - db: - endpoints: - - http://asp-perf-db:5001 - application: - endpoints: - - http://asp-perf-lin:5001 - variables: - databaseServer: 10.0.0.103 - load: - endpoints: - - http://asp-perf-load:5001 - - aspnet-perf-win: - variables: - serverPort: 5000 - serverAddress: 10.0.0.110 - cores: 12 - jobs: - db: - endpoints: - - http://asp-perf-load:5001 - application: - endpoints: - - http://asp-perf-win:5001 - variables: - databaseServer: 10.0.0.104 - load: - endpoints: - - http://asp-perf-db:5001 From 49ae44d3bf020673c922b67d32d242baef80d387 Mon Sep 17 00:00:00 2001 From: Zhaodong Tian Date: Tue, 16 Aug 2022 22:27:53 -0700 Subject: [PATCH 06/12] Add perf testing and service develop with corewcf --- .../tests/Benchmarks/Perf/WCFCorePerf.sln | 31 ++ .../Perf/WCFCorePerfClient/ISayHello.cs | 12 + .../Perf/WCFCorePerfClient/Program.cs | 200 ++++++++ .../WCFCorePerfClient.csproj | 16 + .../Perf/WCFCorePerfService/ISayHello.cs | 12 + .../WCFCorePerfService/MyCustomValidator.cs | 18 + .../Perf/WCFCorePerfService/Program.cs | 126 +++++ .../Perf/WCFCorePerfService/SayHello.cs | 61 +++ .../WCFCorePerfService.csproj | 15 + .../Perf/benchmarks.wcfcore.Perf.yml | 474 ++++++++++++++++++ 10 files changed, 965 insertions(+) create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerf.sln create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/ISayHello.cs create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/Program.cs create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/ISayHello.cs create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/MyCustomValidator.cs create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/Program.cs create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/SayHello.cs create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerf.sln b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerf.sln new file mode 100644 index 00000000000..3d9c7eece2e --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerf.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32714.290 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WCFCorePerfService", "WCFCorePerfService\WCFCorePerfService.csproj", "{35B05C6A-9FF0-4A9C-9BBE-E88963416022}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WCFCorePerfClient", "WCFCorePerfClient\WCFCorePerfClient.csproj", "{D9001454-F77C-4053-B4AE-34342351FD49}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {35B05C6A-9FF0-4A9C-9BBE-E88963416022}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {35B05C6A-9FF0-4A9C-9BBE-E88963416022}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35B05C6A-9FF0-4A9C-9BBE-E88963416022}.Release|Any CPU.ActiveCfg = Release|Any CPU + {35B05C6A-9FF0-4A9C-9BBE-E88963416022}.Release|Any CPU.Build.0 = Release|Any CPU + {D9001454-F77C-4053-B4AE-34342351FD49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D9001454-F77C-4053-B4AE-34342351FD49}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D9001454-F77C-4053-B4AE-34342351FD49}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D9001454-F77C-4053-B4AE-34342351FD49}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {BD5D3AEC-A9AB-412C-A41B-A410030B454A} + EndGlobalSection +EndGlobal diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/ISayHello.cs b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/ISayHello.cs new file mode 100644 index 00000000000..65e880231fe --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/ISayHello.cs @@ -0,0 +1,12 @@ +using System.ServiceModel; +using System.Threading.Tasks; + +namespace WCFCorePerfClient +{ + [ServiceContract] + public interface ISayHello + { + [OperationContract] + Task HelloAsync(string name); + } +} diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/Program.cs b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/Program.cs new file mode 100644 index 00000000000..09b7de9cb5d --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/Program.cs @@ -0,0 +1,200 @@ +using Microsoft.Crank.EventSources; +using System; +using System.Diagnostics; +using System.Security.Cryptography.X509Certificates; +using System.ServiceModel; +using System.ServiceModel.Security; + +namespace WCFCorePerfClient +{ + public class Parameters + { + public const string Binding = "binding"; + public const string ServiceUrl = "serviceurl"; + public const string TransferMode = "transfermode"; + public const string ReportingUrl = "reportingurl"; + public const string PerfMeasurementDuration = "perfmeasurementduration"; + } + + public enum TestBinding { BasicHttp, WSHttp, NetTcp } + + class Program + { + private TestBinding _paramBinding = TestBinding.BasicHttp; + private TimeSpan _paramPerfMeasurementDuration = s_defaultPerfMeasurementDuration; + private string _paramServiceUrl = ""; + private readonly static TimeSpan s_defaultPerfMeasurementDuration = TimeSpan.FromSeconds(10); + private string _paramTransferMode = "Buffered"; + + static void Main(string[] args) + { + Console.WriteLine("WCFCorePerf Client."); + + Program test = new Program(); + + if (test.ProcessRunOptions(args)) + { + var startTime = DateTime.Now; + int request = 0; + + BenchmarksEventSource.Register("wcfcoreperf/channelopen", Operations.Max, Operations.Max, "Channel Open Time (ms)", "Time to Open Channel in ms", "n0"); + BenchmarksEventSource.Register("wcfcoreperf/firstrequest", Operations.Max, Operations.Max, "First Request (ms)", "Time to first request in ms", "n0"); + BenchmarksEventSource.Register("wcfcoreperf/requests", Operations.Max, Operations.Sum, "Requests (" + test._paramPerfMeasurementDuration.TotalMilliseconds + " ms)", "Total number of requests", "n0"); + BenchmarksEventSource.Register("wcfcoreperf/rps/max", Operations.Max, Operations.Sum, "Requests/sec (max)", "Max requests per second", "n0"); + + switch (test._paramBinding) + { + case TestBinding.BasicHttp: + BasicHttpBinding binding = new BasicHttpBinding(); + switch (test._paramTransferMode.ToLower()) + { + case "buffered": + binding.TransferMode = TransferMode.Buffered; + break; + case "streamed": + binding.TransferMode = TransferMode.Streamed; + break; + case "streamedrequest": + binding.TransferMode = TransferMode.StreamedRequest; + break; + case "streamedresponse": + binding.TransferMode = TransferMode.StreamedResponse; + break; + default: + break; + } + + Console.WriteLine($"Testing TransferMode: {binding.TransferMode}"); + ChannelFactory factory = new ChannelFactory(binding, new EndpointAddress(test._paramServiceUrl)); + var stopwatchChannelOpen = new Stopwatch(); + stopwatchChannelOpen.Start(); + factory.Open(); + BenchmarksEventSource.Measure("wcfcoreperf/channelopen", stopwatchChannelOpen.ElapsedMilliseconds); + + var client = factory.CreateChannel(); + var stopwatchFirstReq = new Stopwatch(); + stopwatchFirstReq.Start(); + var result = client.HelloAsync("helloworld").Result; + BenchmarksEventSource.Measure("wcfcoreperf/firstrequest", stopwatchFirstReq.ElapsedMilliseconds); + + while (DateTime.Now <= startTime.Add(test._paramPerfMeasurementDuration)) + { + var rtnResult = client.HelloAsync("helloworld").Result; + request++; + } + + BenchmarksEventSource.Measure("wcfcoreperf/requests", request); + BenchmarksEventSource.Measure("wcfcoreperf/rps/max", request / test._paramPerfMeasurementDuration.TotalSeconds); + break; + case TestBinding.WSHttp: + WSHttpBinding wsHttpBinding = new WSHttpBinding(SecurityMode.TransportWithMessageCredential); + wsHttpBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; + ChannelFactory wsHttpFactory = new ChannelFactory(wsHttpBinding, new EndpointAddress(test._paramServiceUrl)); + wsHttpFactory.Credentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication + { + CertificateValidationMode = X509CertificateValidationMode.None, + RevocationMode = X509RevocationMode.NoCheck + }; + wsHttpFactory.Credentials.UserName.UserName = "abc"; + wsHttpFactory.Credentials.UserName.Password = "[PLACEHOLDER]"; + + var stopwatchWSHttpChannelOpen = new Stopwatch(); + stopwatchWSHttpChannelOpen.Start(); + wsHttpFactory.Open(); + BenchmarksEventSource.Measure("wcfcoreperf/channelopen", stopwatchWSHttpChannelOpen.ElapsedMilliseconds); + + var clientWSHttp = wsHttpFactory.CreateChannel(); + var stopwatchWSHttpFirstReq = new Stopwatch(); + stopwatchWSHttpFirstReq.Start(); + Console.WriteLine(clientWSHttp.HelloAsync("helloworld").Result); + BenchmarksEventSource.Measure("wcfcoreperf/firstrequest", stopwatchWSHttpFirstReq.ElapsedMilliseconds); + + while (DateTime.Now <= startTime.Add(test._paramPerfMeasurementDuration)) + { + var rtnResult = clientWSHttp.HelloAsync("helloworld").Result; + request++; + } + + BenchmarksEventSource.Measure("wcfcoreperf/requests", request); + BenchmarksEventSource.Measure("wcfcoreperf/rps/max", request / test._paramPerfMeasurementDuration.TotalSeconds); + break; + case TestBinding.NetTcp: + NetTcpBinding netTcpBinding = new NetTcpBinding(SecurityMode.None); + ChannelFactory netTcpFactory = new ChannelFactory(netTcpBinding, new EndpointAddress(test._paramServiceUrl)); + + var stopwatchNetTcpChannelOpen = new Stopwatch(); + stopwatchNetTcpChannelOpen.Start(); + netTcpFactory.Open(); + BenchmarksEventSource.Measure("wcfcoreperf/channelopen", stopwatchNetTcpChannelOpen.ElapsedMilliseconds); + + var clientNetTcp = netTcpFactory.CreateChannel(); + var stopwatchNetTcpFirstReq = new Stopwatch(); + stopwatchNetTcpFirstReq.Start(); + var netTcpResult = clientNetTcp.HelloAsync("helloworld").Result; + BenchmarksEventSource.Measure("wcfcoreperf/firstrequest", stopwatchNetTcpFirstReq.ElapsedMilliseconds); + + while (DateTime.Now <= startTime.Add(test._paramPerfMeasurementDuration)) + { + var rtnResult = clientNetTcp.HelloAsync("helloworld").Result; + request++; + } + + BenchmarksEventSource.Measure("wcfcoreperf/requests", request); + BenchmarksEventSource.Measure("wcfcoreperf/rps/max", request / test._paramPerfMeasurementDuration.TotalSeconds); + break; + } + } + } + + private bool ProcessRunOptions(string[] args) + { + foreach (string s in args) + { + Console.WriteLine(s); + string[] p = s.Split(new char[] { ':' }, count: 2); + if (p.Length != 2) + { + continue; + } + + switch (p[0].ToLower()) + { + case Parameters.Binding: + if (!Enum.TryParse(p[1], ignoreCase: true, result: out _paramBinding)) + { + return ReportWrongArgument(s); + } + break; + + case Parameters.PerfMeasurementDuration: + int perfPerfMeasurementDurationSeconds = 0; + if (!Int32.TryParse(p[1], out perfPerfMeasurementDurationSeconds)) + { + return ReportWrongArgument(s); + } + _paramPerfMeasurementDuration = TimeSpan.FromSeconds(perfPerfMeasurementDurationSeconds); + break; + + case Parameters.ServiceUrl: + _paramServiceUrl = p[1]; + break; + + case Parameters.TransferMode: + _paramTransferMode = p[1]; + break; + default: + Console.WriteLine("unknown argument: " + s); + continue; + } + } + + return true; + } + + private bool ReportWrongArgument(string arg) + { + Console.WriteLine("Wrong parameter: " + arg); + return false; + } + } +} diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj new file mode 100644 index 00000000000..0e11fb05b66 --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj @@ -0,0 +1,16 @@ + + + + Exe + net5.0;net6.0 + + + + + + + + + + + diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/ISayHello.cs b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/ISayHello.cs new file mode 100644 index 00000000000..683a76e1dc3 --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/ISayHello.cs @@ -0,0 +1,12 @@ +using CoreWCF; +using System.Threading.Tasks; + +namespace WCFCorePerfService +{ + [ServiceContract] + public interface ISayHello + { + [OperationContract] + Task HelloAsync(string name); + } +} diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/MyCustomValidator.cs b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/MyCustomValidator.cs new file mode 100644 index 00000000000..d1f37c97500 --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/MyCustomValidator.cs @@ -0,0 +1,18 @@ +using CoreWCF.IdentityModel.Selectors; +using System; +using System.Threading.Tasks; + +namespace WCFCorePerfService +{ + public class MyCustomValidator : UserNamePasswordValidator + { + public override ValueTask ValidateAsync(string userName, string password) + { + if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password)) + { + return new ValueTask(Task.CompletedTask); + } + return new ValueTask(Task.FromException(new Exception("username and password cannot be empty"))); + } + } +} diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/Program.cs b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/Program.cs new file mode 100644 index 00000000000..de8fb9d14da --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/Program.cs @@ -0,0 +1,126 @@ +using CoreWCF; +using CoreWCF.Configuration; +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Diagnostics; +using System.IO; +using System.Net; + +namespace WCFCorePerfService +{ + public class Program + { + static void Main(string[] args) + { + string filePath = Path.Combine(Environment.CurrentDirectory, "WCFCorePerfService.exe"); + Console.WriteLine(filePath); + string command = $" advfirewall firewall add rule name=\"WCFCorePerfService\" dir=in protocol=any action=allow program=\"{filePath}\" enable=yes"; + ExecuteCommand(command, Environment.CurrentDirectory, TimeSpan.FromSeconds(20)); + Console.WriteLine("Application start."); + + using (var host = CreateWebHostBuilder(args).Build()) + { + host.Start(); + + Console.WriteLine("Service is Ready"); + Console.WriteLine("Press Any Key to Terminate..."); + Console.ReadLine(); + } + + command = $" advfirewall firewall delete rule name=\"WCFCorePerfService\" program=\"{filePath}\""; + ExecuteCommand(command, Environment.CurrentDirectory, TimeSpan.FromSeconds(20)); + Console.WriteLine("Clean up the firewall rule."); + } + + public static IWebHostBuilder CreateWebHostBuilder(string[] args) => + WebHost.CreateDefaultBuilder(args) + .UseKestrel(options => + { + options.ListenLocalhost(8080); + options.Listen(IPAddress.Loopback, 8443, listenOptions => + { + listenOptions.UseHttps(); + } + ); + }) + .UseNetTcp(8808) + .UseStartup(); + + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddServiceModelServices(); + } + + public void Configure(IApplicationBuilder app) + { + WSHttpBinding serverBinding = new WSHttpBinding(SecurityMode.TransportWithMessageCredential); + serverBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; + app.UseServiceModel(builder => + { + builder.AddService(); + builder.AddServiceEndpoint(new BasicHttpBinding(), "/WCFCorePerf/TestService.svc/BasicHttp"); + builder.AddServiceEndpoint(new NetTcpBinding(SecurityMode.None), "/WCFCorePerf/TestService.svc/NetTcp"); + builder.AddServiceEndpoint(serverBinding, "/WCFCorePerf/TestService.svc/WSHttp"); + Action serviceHost = host => ChangeHostBehavior(host); + builder.ConfigureServiceHostBase(serviceHost); + }); + } + + public void ChangeHostBehavior(ServiceHostBase host) + { + var srvCredentials = new CoreWCF.Description.ServiceCredentials(); + srvCredentials.UserNameAuthentication.UserNamePasswordValidationMode + = CoreWCF.Security.UserNamePasswordValidationMode.Custom; + srvCredentials.UserNameAuthentication.CustomUserNamePasswordValidator + = new MyCustomValidator(); + host.Description.Behaviors.Add(srvCredentials); + } + } + + private static int ExecuteCommand(string command, string workingDirectory, TimeSpan timeout) + { + Process process = new Process(); + process.StartInfo.FileName = "netsh"; + process.StartInfo.Arguments = command; + + if (workingDirectory != null) + { + process.StartInfo.WorkingDirectory = workingDirectory; + } + + process.StartInfo.UseShellExecute = false; + process.Start(); + + bool flag; + if (timeout.TotalMilliseconds >= Int32.MaxValue) + { + flag = process.WaitForExit(Int32.MaxValue); + } + else + { + flag = process.WaitForExit((int)timeout.TotalMilliseconds); + } + + if (!flag) + { + process.Kill(); + } + + if (!flag) + { + throw new TimeoutException(string.Format("Command '{0}' was killed by timeout {1}.", new object[] + { + command, + timeout.ToString() + })); + } + + return process.ExitCode; + } + } +} diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/SayHello.cs b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/SayHello.cs new file mode 100644 index 00000000000..a37b597c8dc --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/SayHello.cs @@ -0,0 +1,61 @@ +using System; +using System.Diagnostics; +using System.Threading.Tasks; + +namespace WCFCorePerfService +{ + public class SayHello : ISayHello + { + public Task HelloAsync(string name) + { + return Task.Factory.StartNew(() => { return name; }); + } + + public bool Cleanup(string name) + { + string command = $" advfirewall firewall delete rule name=\"{name}\""; + bool flag = false; + int code = ExecuteCommand(command, Environment.CurrentDirectory, TimeSpan.FromSeconds(20)); + if (code == 0) + flag = true; + + return flag; + } + + private int ExecuteCommand(string command, string workingDirectory, TimeSpan timeout) + { + Process process = new Process(); + process.StartInfo.FileName = "netsh"; + process.StartInfo.Arguments = command; + if (workingDirectory != null) + { + process.StartInfo.WorkingDirectory = workingDirectory; + } + process.StartInfo.UseShellExecute = false; + process.Start(); + bool flag; + if (timeout.TotalMilliseconds >= Int32.MaxValue) + { + flag = process.WaitForExit(Int32.MaxValue); + } + else + { + flag = process.WaitForExit((int)timeout.TotalMilliseconds); + } + if (!flag) + { + process.Kill(); + } + + if (!flag) + { + throw new TimeoutException(string.Format("Command '{0}' was killed by timeout {1}.", new object[] + { + command, + timeout.ToString() + })); + } + return process.ExitCode; + } + } +} diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj new file mode 100644 index 00000000000..eb08af5d9ca --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj @@ -0,0 +1,15 @@ + + + + Exe + net5.0;net6.0 + + + + + + + + + + diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml new file mode 100644 index 00000000000..6f08cc747e5 --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml @@ -0,0 +1,474 @@ +jobs: + WCFCorePerf: + source: + repository: https://github.com/dotnet/wcf.git + branchOrCommit: main + project: src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerf/WCFCorePerfClient.csproj + isConsoleApp: true + waitForExit: true + variables: + Duration: 300 + arguments: " binding:{{Binding}} serviceurl:{{Protocol}}://{{serverAddress}}{% if Binding == 'WSHttp' %}:{{serverPort}}{% endif %}/WCFCorePerf/TestService.svc/{{EndpointAddress}} transfermode:{{TransferMode}} perfmeasurementduration:{{Duration}} " + WCFCorePerfService: + source: + repository: https://github.com/dotnet/wcf.git + branchOrCommit: main + project: src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj + isConsoleApp: true + + +scenarios: + BasicHttpWithBuffered: + application: + job: WCFCorePerfService + load: + job: WCFCorePerf + variables: + Protocol: Http + EndpointAddress: BasicHttp + Binding: BasicHttp + TransferMode: Buffered + serverPort: 8080 + BasicHttpWithDefault: + application: + job: WCFCorePerfService + load: + job: WCFCorePerf + variables: + Protocol: Http + EndpointAddress: BasicHttp + Binding: BasicHttp + TransferMode: Default + serverPort: 8080 + WSHttp: + application: + job: WCFCorePerfService + load: + job: WCFCorePerf + variables: + Protocol: Https + EndpointAddress: WSHttp + Binding: WSHttp + serverPort: 8443 + NetTcp: + application: + job: WCFCorePerfService + load: + job: WCFCorePerf + variables: + Protocol: net.tcp + EndpointAddress: NetTcp + Binding: NetTcp + serverPort: 8808 + +profiles: + short: + variables: + warmup: 3 + duration: 7 + + pgo: + jobs: + application: + environmentVariables: + - DOTNET_TieredPGO: 1 + - DOTNET_TC_QuickJitForLoops: 1 + - DOTNET_ReadyToRun: 0 + + local: + variables: + serverAddress: localhost + jobs: + db: + endpoints: + - http://localhost:5010 + aliases: + - downstream + application: + endpoints: + - http://localhost:5010 + variables: + databaseServer: localhost + load: + endpoints: + - http://localhost:5010 + aliases: + - warmup + + aspnet-citrine-lin: + variables: + serverAddress: 10.0.0.102 + cores: 28 + jobs: + db: + endpoints: + - http://asp-citrine-db:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-lin:5001 + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - http://asp-citrine-load:5001 + aliases: + - warmup + + aspnet-citrine-lin-relay: + variables: + serverAddress: 10.0.0.102 + cores: 28 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinedb + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinelin + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrineload + aliases: + - warmup + + aspnet-citrine-win: + variables: + serverAddress: 10.0.0.104 + cores: 28 + jobs: + db: + endpoints: + - http://asp-citrine-load:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-win:5001 + variables: + databaseServer: 10.0.0.105 + load: + endpoints: + - http://asp-citrine-db:5001 + aliases: + - warmup + + aspnet-citrine-win-relay: + variables: + serverAddress: 10.0.0.104 + cores: 28 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrineload + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinewin + variables: + databaseServer: 10.0.0.105 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinedb + aliases: + - warmup + + aspnet-citrine-win2: + variables: + serverAddress: 10.0.0.101 + cores: 28 + jobs: + db: + endpoints: + - http://asp-citrine-db:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-win2:5001 + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - http://asp-citrine-amd:5001 + aliases: + - warmup + + aspnet-citrine-win-relay: + variables: + serverAddress: 10.0.0.101 + cores: 28 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinedb + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinewin2 + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrineload + aliases: + - warmup + + aspnet-citrine-arm: + variables: + serverAddress: 10.0.0.107 + cores: 32 + jobs: + db: + endpoints: + - http://asp-citrine-db:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-arm:5001 + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - http://asp-citrine-load:5001 + aliases: + - warmup + + aspnet-citrine-arm-relay: + variables: + serverAddress: 10.0.0.107 + cores: 32 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinedb + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinearm + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrineload + aliases: + - warmup + + aspnet-citrine-ampere: + variables: + serverAddress: 10.0.0.108 + cores: 80 + jobs: + db: + endpoints: + - http://asp-citrine-amd2:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-ampere:5001 + variables: + databaseServer: 10.0.0.109 + load: + endpoints: + - http://asp-citrine-amd2:5001 + aliases: + - warmup + + aspnet-citrine-arm-lin: + variables: + serverAddress: 10.0.0.108 + cores: 80 + jobs: + db: + endpoints: + - http://asp-citrine-amd2:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-ampere:5001 + variables: + databaseServer: 10.0.0.109 + load: + endpoints: + - http://asp-citrine-amd2:5001 + aliases: + - warmup + + aspnet-citrine-arm-win: + variables: + serverAddress: 10.0.0.110 + cores: 80 + jobs: + db: + endpoints: + - http://asp-citrine-amd2:5001 + aliases: + - downstream + application: + endpoints: + - http://10.240.177.200:5001 + variables: + databaseServer: 10.0.0.109 + load: + endpoints: + - http://asp-citrine-amd:5001 + aliases: + - warmup + + aspnet-citrine-amd2: + variables: + serverAddress: 10.0.0.109 + cores: 48 + jobs: + db: + endpoints: + - http://asp-citrine-ampere:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-amd2:5001 + variables: + databaseServer: 10.0.0.108 + load: + endpoints: + - http://asp-citrine-ampere:5001 + aliases: + - warmup + + aspnet-citrine-amd: + variables: + serverAddress: 10.0.0.106 + cores: 48 + jobs: + db: + endpoints: + - http://asp-citrine-load:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-citrine-amd:5001 + variables: + databaseServer: 10.0.0.105 + load: + endpoints: + - http://asp-citrine-db:5001 + aliases: + - warmup + + aspnet-citrine-amd-relay: + variables: + serverAddress: 10.0.0.106 + cores: 48 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrineload + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrineamd + variables: + databaseServer: 10.0.0.105 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/citrinedb + aliases: + - warmup + + aspnet-perf-lin: + variables: + serverAddress: 10.0.0.102 + cores: 12 + jobs: + db: + endpoints: + - http://asp-perf-db:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-perf-lin:5001 + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - http://asp-perf-load:5001 + aliases: + - warmup + + aspnet-perf-lin-relay: + variables: + serverAddress: 10.0.0.102 + cores: 12 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/perfdb + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/perflin + variables: + databaseServer: 10.0.0.103 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/perfload + aliases: + - warmup + + aspnet-perf-win: + variables: + serverAddress: 10.0.0.110 + cores: 12 + jobs: + db: + endpoints: + - http://asp-perf-load:5001 + aliases: + - downstream + application: + endpoints: + - http://asp-perf-win:5001 + variables: + databaseServer: 10.0.0.104 + load: + endpoints: + - http://asp-perf-db:5001 + aliases: + - warmup + + aspnet-perf-win-relay: + variables: + serverAddress: 10.0.0.110 + cores: 12 + jobs: + db: + endpoints: + - https://aspnetperf.servicebus.windows.net/perfload + aliases: + - downstream + application: + endpoints: + - https://aspnetperf.servicebus.windows.net/perfwin + variables: + databaseServer: 10.0.0.104 + load: + endpoints: + - https://aspnetperf.servicebus.windows.net/perfsb + aliases: + - warmup \ No newline at end of file From a35e57aa2f7749ad0bbc8eb4a97befd50e5dc301 Mon Sep 17 00:00:00 2001 From: Zhaodong Tian Date: Tue, 16 Aug 2022 23:05:23 -0700 Subject: [PATCH 07/12] update targetframework --- .../Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj | 2 +- .../Perf/WCFCorePerfService/WCFCorePerfService.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj index 0e11fb05b66..d23feb18d98 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj @@ -2,7 +2,7 @@ Exe - net5.0;net6.0 + net7.0 diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj index eb08af5d9ca..a3c3830341a 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj @@ -2,7 +2,7 @@ Exe - net5.0;net6.0 + net7.0 From 723e5658d019e5a680a877e2eaf52d0e846219dd Mon Sep 17 00:00:00 2001 From: Zhaodong Tian Date: Tue, 16 Aug 2022 23:59:46 -0700 Subject: [PATCH 08/12] update the yml --- .../tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml index 6f08cc747e5..a45604c30ac 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml +++ b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml @@ -3,7 +3,7 @@ jobs: source: repository: https://github.com/dotnet/wcf.git branchOrCommit: main - project: src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerf/WCFCorePerfClient.csproj + project: src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj isConsoleApp: true waitForExit: true variables: @@ -471,4 +471,4 @@ profiles: endpoints: - https://aspnetperf.servicebus.windows.net/perfsb aliases: - - warmup \ No newline at end of file + - warmup From c7d5bf17a854e04627f2655e908f371f0e1a2a31 Mon Sep 17 00:00:00 2001 From: Zhaodong Tian Date: Mon, 29 Aug 2022 19:16:35 -0700 Subject: [PATCH 09/12] Rename project name --- .../tests/Benchmarks/Perf/WCFCorePerf.sln | 31 -- .../Perf/WCFCorePerfClient/ISayHello.cs | 12 - .../Perf/WCFCorePerfClient/Program.cs | 200 -------- .../WCFCorePerfClient.csproj | 16 - .../Perf/WCFCorePerfService/ISayHello.cs | 12 - .../WCFCorePerfService/MyCustomValidator.cs | 18 - .../Perf/WCFCorePerfService/Program.cs | 126 ----- .../Perf/WCFCorePerfService/SayHello.cs | 61 --- .../WCFCorePerfService.csproj | 15 - .../Perf/benchmarks.wcfcore.Perf.yml | 474 ------------------ 10 files changed, 965 deletions(-) delete mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerf.sln delete mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/ISayHello.cs delete mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/Program.cs delete mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj delete mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/ISayHello.cs delete mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/MyCustomValidator.cs delete mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/Program.cs delete mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/SayHello.cs delete mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj delete mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerf.sln b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerf.sln deleted file mode 100644 index 3d9c7eece2e..00000000000 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerf.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.3.32714.290 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WCFCorePerfService", "WCFCorePerfService\WCFCorePerfService.csproj", "{35B05C6A-9FF0-4A9C-9BBE-E88963416022}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WCFCorePerfClient", "WCFCorePerfClient\WCFCorePerfClient.csproj", "{D9001454-F77C-4053-B4AE-34342351FD49}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {35B05C6A-9FF0-4A9C-9BBE-E88963416022}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {35B05C6A-9FF0-4A9C-9BBE-E88963416022}.Debug|Any CPU.Build.0 = Debug|Any CPU - {35B05C6A-9FF0-4A9C-9BBE-E88963416022}.Release|Any CPU.ActiveCfg = Release|Any CPU - {35B05C6A-9FF0-4A9C-9BBE-E88963416022}.Release|Any CPU.Build.0 = Release|Any CPU - {D9001454-F77C-4053-B4AE-34342351FD49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D9001454-F77C-4053-B4AE-34342351FD49}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D9001454-F77C-4053-B4AE-34342351FD49}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D9001454-F77C-4053-B4AE-34342351FD49}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {BD5D3AEC-A9AB-412C-A41B-A410030B454A} - EndGlobalSection -EndGlobal diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/ISayHello.cs b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/ISayHello.cs deleted file mode 100644 index 65e880231fe..00000000000 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/ISayHello.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.ServiceModel; -using System.Threading.Tasks; - -namespace WCFCorePerfClient -{ - [ServiceContract] - public interface ISayHello - { - [OperationContract] - Task HelloAsync(string name); - } -} diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/Program.cs b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/Program.cs deleted file mode 100644 index 09b7de9cb5d..00000000000 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/Program.cs +++ /dev/null @@ -1,200 +0,0 @@ -using Microsoft.Crank.EventSources; -using System; -using System.Diagnostics; -using System.Security.Cryptography.X509Certificates; -using System.ServiceModel; -using System.ServiceModel.Security; - -namespace WCFCorePerfClient -{ - public class Parameters - { - public const string Binding = "binding"; - public const string ServiceUrl = "serviceurl"; - public const string TransferMode = "transfermode"; - public const string ReportingUrl = "reportingurl"; - public const string PerfMeasurementDuration = "perfmeasurementduration"; - } - - public enum TestBinding { BasicHttp, WSHttp, NetTcp } - - class Program - { - private TestBinding _paramBinding = TestBinding.BasicHttp; - private TimeSpan _paramPerfMeasurementDuration = s_defaultPerfMeasurementDuration; - private string _paramServiceUrl = ""; - private readonly static TimeSpan s_defaultPerfMeasurementDuration = TimeSpan.FromSeconds(10); - private string _paramTransferMode = "Buffered"; - - static void Main(string[] args) - { - Console.WriteLine("WCFCorePerf Client."); - - Program test = new Program(); - - if (test.ProcessRunOptions(args)) - { - var startTime = DateTime.Now; - int request = 0; - - BenchmarksEventSource.Register("wcfcoreperf/channelopen", Operations.Max, Operations.Max, "Channel Open Time (ms)", "Time to Open Channel in ms", "n0"); - BenchmarksEventSource.Register("wcfcoreperf/firstrequest", Operations.Max, Operations.Max, "First Request (ms)", "Time to first request in ms", "n0"); - BenchmarksEventSource.Register("wcfcoreperf/requests", Operations.Max, Operations.Sum, "Requests (" + test._paramPerfMeasurementDuration.TotalMilliseconds + " ms)", "Total number of requests", "n0"); - BenchmarksEventSource.Register("wcfcoreperf/rps/max", Operations.Max, Operations.Sum, "Requests/sec (max)", "Max requests per second", "n0"); - - switch (test._paramBinding) - { - case TestBinding.BasicHttp: - BasicHttpBinding binding = new BasicHttpBinding(); - switch (test._paramTransferMode.ToLower()) - { - case "buffered": - binding.TransferMode = TransferMode.Buffered; - break; - case "streamed": - binding.TransferMode = TransferMode.Streamed; - break; - case "streamedrequest": - binding.TransferMode = TransferMode.StreamedRequest; - break; - case "streamedresponse": - binding.TransferMode = TransferMode.StreamedResponse; - break; - default: - break; - } - - Console.WriteLine($"Testing TransferMode: {binding.TransferMode}"); - ChannelFactory factory = new ChannelFactory(binding, new EndpointAddress(test._paramServiceUrl)); - var stopwatchChannelOpen = new Stopwatch(); - stopwatchChannelOpen.Start(); - factory.Open(); - BenchmarksEventSource.Measure("wcfcoreperf/channelopen", stopwatchChannelOpen.ElapsedMilliseconds); - - var client = factory.CreateChannel(); - var stopwatchFirstReq = new Stopwatch(); - stopwatchFirstReq.Start(); - var result = client.HelloAsync("helloworld").Result; - BenchmarksEventSource.Measure("wcfcoreperf/firstrequest", stopwatchFirstReq.ElapsedMilliseconds); - - while (DateTime.Now <= startTime.Add(test._paramPerfMeasurementDuration)) - { - var rtnResult = client.HelloAsync("helloworld").Result; - request++; - } - - BenchmarksEventSource.Measure("wcfcoreperf/requests", request); - BenchmarksEventSource.Measure("wcfcoreperf/rps/max", request / test._paramPerfMeasurementDuration.TotalSeconds); - break; - case TestBinding.WSHttp: - WSHttpBinding wsHttpBinding = new WSHttpBinding(SecurityMode.TransportWithMessageCredential); - wsHttpBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; - ChannelFactory wsHttpFactory = new ChannelFactory(wsHttpBinding, new EndpointAddress(test._paramServiceUrl)); - wsHttpFactory.Credentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication - { - CertificateValidationMode = X509CertificateValidationMode.None, - RevocationMode = X509RevocationMode.NoCheck - }; - wsHttpFactory.Credentials.UserName.UserName = "abc"; - wsHttpFactory.Credentials.UserName.Password = "[PLACEHOLDER]"; - - var stopwatchWSHttpChannelOpen = new Stopwatch(); - stopwatchWSHttpChannelOpen.Start(); - wsHttpFactory.Open(); - BenchmarksEventSource.Measure("wcfcoreperf/channelopen", stopwatchWSHttpChannelOpen.ElapsedMilliseconds); - - var clientWSHttp = wsHttpFactory.CreateChannel(); - var stopwatchWSHttpFirstReq = new Stopwatch(); - stopwatchWSHttpFirstReq.Start(); - Console.WriteLine(clientWSHttp.HelloAsync("helloworld").Result); - BenchmarksEventSource.Measure("wcfcoreperf/firstrequest", stopwatchWSHttpFirstReq.ElapsedMilliseconds); - - while (DateTime.Now <= startTime.Add(test._paramPerfMeasurementDuration)) - { - var rtnResult = clientWSHttp.HelloAsync("helloworld").Result; - request++; - } - - BenchmarksEventSource.Measure("wcfcoreperf/requests", request); - BenchmarksEventSource.Measure("wcfcoreperf/rps/max", request / test._paramPerfMeasurementDuration.TotalSeconds); - break; - case TestBinding.NetTcp: - NetTcpBinding netTcpBinding = new NetTcpBinding(SecurityMode.None); - ChannelFactory netTcpFactory = new ChannelFactory(netTcpBinding, new EndpointAddress(test._paramServiceUrl)); - - var stopwatchNetTcpChannelOpen = new Stopwatch(); - stopwatchNetTcpChannelOpen.Start(); - netTcpFactory.Open(); - BenchmarksEventSource.Measure("wcfcoreperf/channelopen", stopwatchNetTcpChannelOpen.ElapsedMilliseconds); - - var clientNetTcp = netTcpFactory.CreateChannel(); - var stopwatchNetTcpFirstReq = new Stopwatch(); - stopwatchNetTcpFirstReq.Start(); - var netTcpResult = clientNetTcp.HelloAsync("helloworld").Result; - BenchmarksEventSource.Measure("wcfcoreperf/firstrequest", stopwatchNetTcpFirstReq.ElapsedMilliseconds); - - while (DateTime.Now <= startTime.Add(test._paramPerfMeasurementDuration)) - { - var rtnResult = clientNetTcp.HelloAsync("helloworld").Result; - request++; - } - - BenchmarksEventSource.Measure("wcfcoreperf/requests", request); - BenchmarksEventSource.Measure("wcfcoreperf/rps/max", request / test._paramPerfMeasurementDuration.TotalSeconds); - break; - } - } - } - - private bool ProcessRunOptions(string[] args) - { - foreach (string s in args) - { - Console.WriteLine(s); - string[] p = s.Split(new char[] { ':' }, count: 2); - if (p.Length != 2) - { - continue; - } - - switch (p[0].ToLower()) - { - case Parameters.Binding: - if (!Enum.TryParse(p[1], ignoreCase: true, result: out _paramBinding)) - { - return ReportWrongArgument(s); - } - break; - - case Parameters.PerfMeasurementDuration: - int perfPerfMeasurementDurationSeconds = 0; - if (!Int32.TryParse(p[1], out perfPerfMeasurementDurationSeconds)) - { - return ReportWrongArgument(s); - } - _paramPerfMeasurementDuration = TimeSpan.FromSeconds(perfPerfMeasurementDurationSeconds); - break; - - case Parameters.ServiceUrl: - _paramServiceUrl = p[1]; - break; - - case Parameters.TransferMode: - _paramTransferMode = p[1]; - break; - default: - Console.WriteLine("unknown argument: " + s); - continue; - } - } - - return true; - } - - private bool ReportWrongArgument(string arg) - { - Console.WriteLine("Wrong parameter: " + arg); - return false; - } - } -} diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj deleted file mode 100644 index d23feb18d98..00000000000 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - Exe - net7.0 - - - - - - - - - - - diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/ISayHello.cs b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/ISayHello.cs deleted file mode 100644 index 683a76e1dc3..00000000000 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/ISayHello.cs +++ /dev/null @@ -1,12 +0,0 @@ -using CoreWCF; -using System.Threading.Tasks; - -namespace WCFCorePerfService -{ - [ServiceContract] - public interface ISayHello - { - [OperationContract] - Task HelloAsync(string name); - } -} diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/MyCustomValidator.cs b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/MyCustomValidator.cs deleted file mode 100644 index d1f37c97500..00000000000 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/MyCustomValidator.cs +++ /dev/null @@ -1,18 +0,0 @@ -using CoreWCF.IdentityModel.Selectors; -using System; -using System.Threading.Tasks; - -namespace WCFCorePerfService -{ - public class MyCustomValidator : UserNamePasswordValidator - { - public override ValueTask ValidateAsync(string userName, string password) - { - if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password)) - { - return new ValueTask(Task.CompletedTask); - } - return new ValueTask(Task.FromException(new Exception("username and password cannot be empty"))); - } - } -} diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/Program.cs b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/Program.cs deleted file mode 100644 index de8fb9d14da..00000000000 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/Program.cs +++ /dev/null @@ -1,126 +0,0 @@ -using CoreWCF; -using CoreWCF.Configuration; -using Microsoft.AspNetCore; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; -using System; -using System.Diagnostics; -using System.IO; -using System.Net; - -namespace WCFCorePerfService -{ - public class Program - { - static void Main(string[] args) - { - string filePath = Path.Combine(Environment.CurrentDirectory, "WCFCorePerfService.exe"); - Console.WriteLine(filePath); - string command = $" advfirewall firewall add rule name=\"WCFCorePerfService\" dir=in protocol=any action=allow program=\"{filePath}\" enable=yes"; - ExecuteCommand(command, Environment.CurrentDirectory, TimeSpan.FromSeconds(20)); - Console.WriteLine("Application start."); - - using (var host = CreateWebHostBuilder(args).Build()) - { - host.Start(); - - Console.WriteLine("Service is Ready"); - Console.WriteLine("Press Any Key to Terminate..."); - Console.ReadLine(); - } - - command = $" advfirewall firewall delete rule name=\"WCFCorePerfService\" program=\"{filePath}\""; - ExecuteCommand(command, Environment.CurrentDirectory, TimeSpan.FromSeconds(20)); - Console.WriteLine("Clean up the firewall rule."); - } - - public static IWebHostBuilder CreateWebHostBuilder(string[] args) => - WebHost.CreateDefaultBuilder(args) - .UseKestrel(options => - { - options.ListenLocalhost(8080); - options.Listen(IPAddress.Loopback, 8443, listenOptions => - { - listenOptions.UseHttps(); - } - ); - }) - .UseNetTcp(8808) - .UseStartup(); - - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddServiceModelServices(); - } - - public void Configure(IApplicationBuilder app) - { - WSHttpBinding serverBinding = new WSHttpBinding(SecurityMode.TransportWithMessageCredential); - serverBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; - app.UseServiceModel(builder => - { - builder.AddService(); - builder.AddServiceEndpoint(new BasicHttpBinding(), "/WCFCorePerf/TestService.svc/BasicHttp"); - builder.AddServiceEndpoint(new NetTcpBinding(SecurityMode.None), "/WCFCorePerf/TestService.svc/NetTcp"); - builder.AddServiceEndpoint(serverBinding, "/WCFCorePerf/TestService.svc/WSHttp"); - Action serviceHost = host => ChangeHostBehavior(host); - builder.ConfigureServiceHostBase(serviceHost); - }); - } - - public void ChangeHostBehavior(ServiceHostBase host) - { - var srvCredentials = new CoreWCF.Description.ServiceCredentials(); - srvCredentials.UserNameAuthentication.UserNamePasswordValidationMode - = CoreWCF.Security.UserNamePasswordValidationMode.Custom; - srvCredentials.UserNameAuthentication.CustomUserNamePasswordValidator - = new MyCustomValidator(); - host.Description.Behaviors.Add(srvCredentials); - } - } - - private static int ExecuteCommand(string command, string workingDirectory, TimeSpan timeout) - { - Process process = new Process(); - process.StartInfo.FileName = "netsh"; - process.StartInfo.Arguments = command; - - if (workingDirectory != null) - { - process.StartInfo.WorkingDirectory = workingDirectory; - } - - process.StartInfo.UseShellExecute = false; - process.Start(); - - bool flag; - if (timeout.TotalMilliseconds >= Int32.MaxValue) - { - flag = process.WaitForExit(Int32.MaxValue); - } - else - { - flag = process.WaitForExit((int)timeout.TotalMilliseconds); - } - - if (!flag) - { - process.Kill(); - } - - if (!flag) - { - throw new TimeoutException(string.Format("Command '{0}' was killed by timeout {1}.", new object[] - { - command, - timeout.ToString() - })); - } - - return process.ExitCode; - } - } -} diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/SayHello.cs b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/SayHello.cs deleted file mode 100644 index a37b597c8dc..00000000000 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/SayHello.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Diagnostics; -using System.Threading.Tasks; - -namespace WCFCorePerfService -{ - public class SayHello : ISayHello - { - public Task HelloAsync(string name) - { - return Task.Factory.StartNew(() => { return name; }); - } - - public bool Cleanup(string name) - { - string command = $" advfirewall firewall delete rule name=\"{name}\""; - bool flag = false; - int code = ExecuteCommand(command, Environment.CurrentDirectory, TimeSpan.FromSeconds(20)); - if (code == 0) - flag = true; - - return flag; - } - - private int ExecuteCommand(string command, string workingDirectory, TimeSpan timeout) - { - Process process = new Process(); - process.StartInfo.FileName = "netsh"; - process.StartInfo.Arguments = command; - if (workingDirectory != null) - { - process.StartInfo.WorkingDirectory = workingDirectory; - } - process.StartInfo.UseShellExecute = false; - process.Start(); - bool flag; - if (timeout.TotalMilliseconds >= Int32.MaxValue) - { - flag = process.WaitForExit(Int32.MaxValue); - } - else - { - flag = process.WaitForExit((int)timeout.TotalMilliseconds); - } - if (!flag) - { - process.Kill(); - } - - if (!flag) - { - throw new TimeoutException(string.Format("Command '{0}' was killed by timeout {1}.", new object[] - { - command, - timeout.ToString() - })); - } - return process.ExitCode; - } - } -} diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj deleted file mode 100644 index a3c3830341a..00000000000 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net7.0 - - - - - - - - - - diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml b/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml deleted file mode 100644 index a45604c30ac..00000000000 --- a/src/System.Private.ServiceModel/tests/Benchmarks/Perf/benchmarks.wcfcore.Perf.yml +++ /dev/null @@ -1,474 +0,0 @@ -jobs: - WCFCorePerf: - source: - repository: https://github.com/dotnet/wcf.git - branchOrCommit: main - project: src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfClient/WCFCorePerfClient.csproj - isConsoleApp: true - waitForExit: true - variables: - Duration: 300 - arguments: " binding:{{Binding}} serviceurl:{{Protocol}}://{{serverAddress}}{% if Binding == 'WSHttp' %}:{{serverPort}}{% endif %}/WCFCorePerf/TestService.svc/{{EndpointAddress}} transfermode:{{TransferMode}} perfmeasurementduration:{{Duration}} " - WCFCorePerfService: - source: - repository: https://github.com/dotnet/wcf.git - branchOrCommit: main - project: src/System.Private.ServiceModel/tests/Benchmarks/Perf/WCFCorePerfService/WCFCorePerfService.csproj - isConsoleApp: true - - -scenarios: - BasicHttpWithBuffered: - application: - job: WCFCorePerfService - load: - job: WCFCorePerf - variables: - Protocol: Http - EndpointAddress: BasicHttp - Binding: BasicHttp - TransferMode: Buffered - serverPort: 8080 - BasicHttpWithDefault: - application: - job: WCFCorePerfService - load: - job: WCFCorePerf - variables: - Protocol: Http - EndpointAddress: BasicHttp - Binding: BasicHttp - TransferMode: Default - serverPort: 8080 - WSHttp: - application: - job: WCFCorePerfService - load: - job: WCFCorePerf - variables: - Protocol: Https - EndpointAddress: WSHttp - Binding: WSHttp - serverPort: 8443 - NetTcp: - application: - job: WCFCorePerfService - load: - job: WCFCorePerf - variables: - Protocol: net.tcp - EndpointAddress: NetTcp - Binding: NetTcp - serverPort: 8808 - -profiles: - short: - variables: - warmup: 3 - duration: 7 - - pgo: - jobs: - application: - environmentVariables: - - DOTNET_TieredPGO: 1 - - DOTNET_TC_QuickJitForLoops: 1 - - DOTNET_ReadyToRun: 0 - - local: - variables: - serverAddress: localhost - jobs: - db: - endpoints: - - http://localhost:5010 - aliases: - - downstream - application: - endpoints: - - http://localhost:5010 - variables: - databaseServer: localhost - load: - endpoints: - - http://localhost:5010 - aliases: - - warmup - - aspnet-citrine-lin: - variables: - serverAddress: 10.0.0.102 - cores: 28 - jobs: - db: - endpoints: - - http://asp-citrine-db:5001 - aliases: - - downstream - application: - endpoints: - - http://asp-citrine-lin:5001 - variables: - databaseServer: 10.0.0.103 - load: - endpoints: - - http://asp-citrine-load:5001 - aliases: - - warmup - - aspnet-citrine-lin-relay: - variables: - serverAddress: 10.0.0.102 - cores: 28 - jobs: - db: - endpoints: - - https://aspnetperf.servicebus.windows.net/citrinedb - aliases: - - downstream - application: - endpoints: - - https://aspnetperf.servicebus.windows.net/citrinelin - variables: - databaseServer: 10.0.0.103 - load: - endpoints: - - https://aspnetperf.servicebus.windows.net/citrineload - aliases: - - warmup - - aspnet-citrine-win: - variables: - serverAddress: 10.0.0.104 - cores: 28 - jobs: - db: - endpoints: - - http://asp-citrine-load:5001 - aliases: - - downstream - application: - endpoints: - - http://asp-citrine-win:5001 - variables: - databaseServer: 10.0.0.105 - load: - endpoints: - - http://asp-citrine-db:5001 - aliases: - - warmup - - aspnet-citrine-win-relay: - variables: - serverAddress: 10.0.0.104 - cores: 28 - jobs: - db: - endpoints: - - https://aspnetperf.servicebus.windows.net/citrineload - aliases: - - downstream - application: - endpoints: - - https://aspnetperf.servicebus.windows.net/citrinewin - variables: - databaseServer: 10.0.0.105 - load: - endpoints: - - https://aspnetperf.servicebus.windows.net/citrinedb - aliases: - - warmup - - aspnet-citrine-win2: - variables: - serverAddress: 10.0.0.101 - cores: 28 - jobs: - db: - endpoints: - - http://asp-citrine-db:5001 - aliases: - - downstream - application: - endpoints: - - http://asp-citrine-win2:5001 - variables: - databaseServer: 10.0.0.103 - load: - endpoints: - - http://asp-citrine-amd:5001 - aliases: - - warmup - - aspnet-citrine-win-relay: - variables: - serverAddress: 10.0.0.101 - cores: 28 - jobs: - db: - endpoints: - - https://aspnetperf.servicebus.windows.net/citrinedb - aliases: - - downstream - application: - endpoints: - - https://aspnetperf.servicebus.windows.net/citrinewin2 - variables: - databaseServer: 10.0.0.103 - load: - endpoints: - - https://aspnetperf.servicebus.windows.net/citrineload - aliases: - - warmup - - aspnet-citrine-arm: - variables: - serverAddress: 10.0.0.107 - cores: 32 - jobs: - db: - endpoints: - - http://asp-citrine-db:5001 - aliases: - - downstream - application: - endpoints: - - http://asp-citrine-arm:5001 - variables: - databaseServer: 10.0.0.103 - load: - endpoints: - - http://asp-citrine-load:5001 - aliases: - - warmup - - aspnet-citrine-arm-relay: - variables: - serverAddress: 10.0.0.107 - cores: 32 - jobs: - db: - endpoints: - - https://aspnetperf.servicebus.windows.net/citrinedb - aliases: - - downstream - application: - endpoints: - - https://aspnetperf.servicebus.windows.net/citrinearm - variables: - databaseServer: 10.0.0.103 - load: - endpoints: - - https://aspnetperf.servicebus.windows.net/citrineload - aliases: - - warmup - - aspnet-citrine-ampere: - variables: - serverAddress: 10.0.0.108 - cores: 80 - jobs: - db: - endpoints: - - http://asp-citrine-amd2:5001 - aliases: - - downstream - application: - endpoints: - - http://asp-citrine-ampere:5001 - variables: - databaseServer: 10.0.0.109 - load: - endpoints: - - http://asp-citrine-amd2:5001 - aliases: - - warmup - - aspnet-citrine-arm-lin: - variables: - serverAddress: 10.0.0.108 - cores: 80 - jobs: - db: - endpoints: - - http://asp-citrine-amd2:5001 - aliases: - - downstream - application: - endpoints: - - http://asp-citrine-ampere:5001 - variables: - databaseServer: 10.0.0.109 - load: - endpoints: - - http://asp-citrine-amd2:5001 - aliases: - - warmup - - aspnet-citrine-arm-win: - variables: - serverAddress: 10.0.0.110 - cores: 80 - jobs: - db: - endpoints: - - http://asp-citrine-amd2:5001 - aliases: - - downstream - application: - endpoints: - - http://10.240.177.200:5001 - variables: - databaseServer: 10.0.0.109 - load: - endpoints: - - http://asp-citrine-amd:5001 - aliases: - - warmup - - aspnet-citrine-amd2: - variables: - serverAddress: 10.0.0.109 - cores: 48 - jobs: - db: - endpoints: - - http://asp-citrine-ampere:5001 - aliases: - - downstream - application: - endpoints: - - http://asp-citrine-amd2:5001 - variables: - databaseServer: 10.0.0.108 - load: - endpoints: - - http://asp-citrine-ampere:5001 - aliases: - - warmup - - aspnet-citrine-amd: - variables: - serverAddress: 10.0.0.106 - cores: 48 - jobs: - db: - endpoints: - - http://asp-citrine-load:5001 - aliases: - - downstream - application: - endpoints: - - http://asp-citrine-amd:5001 - variables: - databaseServer: 10.0.0.105 - load: - endpoints: - - http://asp-citrine-db:5001 - aliases: - - warmup - - aspnet-citrine-amd-relay: - variables: - serverAddress: 10.0.0.106 - cores: 48 - jobs: - db: - endpoints: - - https://aspnetperf.servicebus.windows.net/citrineload - aliases: - - downstream - application: - endpoints: - - https://aspnetperf.servicebus.windows.net/citrineamd - variables: - databaseServer: 10.0.0.105 - load: - endpoints: - - https://aspnetperf.servicebus.windows.net/citrinedb - aliases: - - warmup - - aspnet-perf-lin: - variables: - serverAddress: 10.0.0.102 - cores: 12 - jobs: - db: - endpoints: - - http://asp-perf-db:5001 - aliases: - - downstream - application: - endpoints: - - http://asp-perf-lin:5001 - variables: - databaseServer: 10.0.0.103 - load: - endpoints: - - http://asp-perf-load:5001 - aliases: - - warmup - - aspnet-perf-lin-relay: - variables: - serverAddress: 10.0.0.102 - cores: 12 - jobs: - db: - endpoints: - - https://aspnetperf.servicebus.windows.net/perfdb - aliases: - - downstream - application: - endpoints: - - https://aspnetperf.servicebus.windows.net/perflin - variables: - databaseServer: 10.0.0.103 - load: - endpoints: - - https://aspnetperf.servicebus.windows.net/perfload - aliases: - - warmup - - aspnet-perf-win: - variables: - serverAddress: 10.0.0.110 - cores: 12 - jobs: - db: - endpoints: - - http://asp-perf-load:5001 - aliases: - - downstream - application: - endpoints: - - http://asp-perf-win:5001 - variables: - databaseServer: 10.0.0.104 - load: - endpoints: - - http://asp-perf-db:5001 - aliases: - - warmup - - aspnet-perf-win-relay: - variables: - serverAddress: 10.0.0.110 - cores: 12 - jobs: - db: - endpoints: - - https://aspnetperf.servicebus.windows.net/perfload - aliases: - - downstream - application: - endpoints: - - https://aspnetperf.servicebus.windows.net/perfwin - variables: - databaseServer: 10.0.0.104 - load: - endpoints: - - https://aspnetperf.servicebus.windows.net/perfsb - aliases: - - warmup From 02a278e20fad04a3f8d6b047edfa4a350f598968 Mon Sep 17 00:00:00 2001 From: Zhaodong Tian Date: Wed, 26 Oct 2022 22:35:27 -0700 Subject: [PATCH 10/12] Fix issues and add measures for sync and async --- .../CoreWCFPerfService.csproj | 21 +- .../FirewallRulesManager.cs | 184 ++++++++++++++++ .../CoreWCFPerfService/ISayHello.cs | 4 +- .../CoreWCFPerfService/MyCustomValidator.cs | 6 +- .../CoreWCFPerfService/Program.cs | 66 ++---- .../CoreWCFPerfService/SayHello.cs | 53 +---- .../WCFCorePerfClient/ISayHello.cs | 3 + .../WCFCorePerfClient/Program.cs | 196 ++++++++++++------ .../WCFCorePerfClient.csproj | 8 +- 9 files changed, 355 insertions(+), 186 deletions(-) create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/FirewallRulesManager.cs diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/CoreWCFPerfService.csproj b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/CoreWCFPerfService.csproj index a3c3830341a..d23b1251b99 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/CoreWCFPerfService.csproj +++ b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/CoreWCFPerfService.csproj @@ -1,15 +1,24 @@ - + Exe - net7.0 + net7.0 - - - - + + tlbimp + 0 + 1 + 58fbcf7c-e7a9-467c-80b3-fc65e8fcca08 + + + + + + + + diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/FirewallRulesManager.cs b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/FirewallRulesManager.cs new file mode 100644 index 00000000000..9a596a3b00c --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/FirewallRulesManager.cs @@ -0,0 +1,184 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using NetFwTypeLib; + +namespace CoreWCFPerfService +{ + public static class FirewallRulesManager + { + // This prefix is used both to name rules and to discover existing + // rules created by this class, so it must be unique + private static string s_RuleNamePrefix = "WCF perf test rule"; + private static object s_portLock = new object(); + private static bool s_registeredForProcessExit = false; + private static INetFwPolicy2 s_netFwPolicy2; + private static string s_remoteAddresses = "*"; + + private static INetFwPolicy2 NetFwPolicy2 + { + get + { + lock (s_portLock) + { + if (s_netFwPolicy2 == null) + { + Type netFwPolicy2Type = Type.GetTypeFromProgID("HNetCfg.FwPolicy2", false); + s_netFwPolicy2 = (INetFwPolicy2)Activator.CreateInstance(netFwPolicy2Type); + } + } + + return s_netFwPolicy2; + } + } + + private static string RemoteAddresses + { + get + { + return s_remoteAddresses; + } + set + { + s_remoteAddresses = value; + } + } + + private static string RuleNamePrefix { get; set; } + + private static string ApplicationName { get; set; } + + // We listen for ProcessExit so we can delete the firewall rules we added. + private static void RegisterForProcessExit() + { + lock (s_portLock) + { + if (!s_registeredForProcessExit) + { + AppDomain.CurrentDomain.ProcessExit += (s, e) => + { + RemoveAllBridgeFirewallRules(RuleNamePrefix); + }; + s_registeredForProcessExit = true; + } + } + } + + // Searches all existing firewall rules with the given name + public static INetFwRule FindRule(string name, string port) + { + lock (s_portLock) + { + // Match on our special naming pattern and port + HashSet ruleSet = new HashSet(); + foreach (var r in NetFwPolicy2.Rules) + { + INetFwRule rule = (INetFwRule)r; + + if (string.Equals(name, rule.Name, StringComparison.OrdinalIgnoreCase) && + string.Equals(rule.LocalPorts, port, StringComparison.Ordinal)) + { + return rule; + } + } + + return null; + } + } + + private static void AddFirewallRule(string port) + { + lock (s_portLock) + { + // If we add any rules, register to delete them at process exit. + RegisterForProcessExit(); + + // If we already created this rule, we don't create it again. + string ruleName = string.Format("{0} {1}", RuleNamePrefix ?? s_RuleNamePrefix, port); + if (FindRule(ruleName, port) != null) + { + return; + } + + INetFwRules rulesObject = NetFwPolicy2.Rules; + int currentProfiles = NetFwPolicy2.CurrentProfileTypes; + + // Create a Rule Object. + Type netFwRuleType = Type.GetTypeFromProgID("HNetCfg.FWRule", false); + INetFwRule newRule = (INetFwRule)Activator.CreateInstance(netFwRuleType); + + try + { + newRule.Name = ruleName; + newRule.ApplicationName = ApplicationName; + newRule.Description = string.Format("Rule added for WCF perf test use of port {0}", port); + newRule.Protocol = (int)NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP; + newRule.LocalPorts = port; + newRule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN; + newRule.Enabled = true; + newRule.Profiles = currentProfiles; + newRule.Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW; + newRule.RemoteAddresses = RemoteAddresses; + + // Add a new rule + rulesObject.Add(newRule); + + Trace.WriteLine(string.Format("Added firewall rule {0}", newRule.Name), + typeof(FirewallRulesManager).Name); + } + catch (Exception ex) + { + string message = string.Format("Failed to add firewall rule name:{0}, port:{1}, remoteAddresses:{2}{3}{4}", + newRule.Name, port, RemoteAddresses, Environment.NewLine, ex.ToString()); + Console.WriteLine(message); + Trace.TraceWarning(message); + } + } + } + + public static void RemoveAllBridgeFirewallRules(string preName) + { + RuleNamePrefix = preName; + lock (s_portLock) + { + // Capture The specific rules into local list so we + // don't mutate the rule list during enumeration. + HashSet ruleSet = new HashSet(); + foreach (var r in NetFwPolicy2.Rules) + { + INetFwRule rule = (INetFwRule)r; + string ruleName = rule.Name; + if (rule.Name.StartsWith(RuleNamePrefix, StringComparison.Ordinal) && !ruleSet.Contains(rule.Name)) + { + ruleSet.Add(rule.Name); + } + } + + foreach (string ruleName in ruleSet) + { + try + { + NetFwPolicy2.Rules.Remove(ruleName); + Console.WriteLine("Removed firewall rule '{0}'", ruleName); + } + catch (FileNotFoundException fnfe) + { + // This exception can happen when multiple processes + // are cleaning up the rules, and the rule has already + // been removed. + Console.WriteLine("Unable to remove rule '{0}' : {1}", + ruleName, fnfe.Message); + } + } + } + } + + public static void OpenPortInFirewall(string preName, string appName, string port) + { + RuleNamePrefix = preName; + ApplicationName = appName; + AddFirewallRule(port); + } + } +} diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/ISayHello.cs b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/ISayHello.cs index 683a76e1dc3..4c63fddfd66 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/ISayHello.cs +++ b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/ISayHello.cs @@ -1,5 +1,5 @@ -using CoreWCF; -using System.Threading.Tasks; +using System.Threading.Tasks; +using CoreWCF; namespace WCFCorePerfService { diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/MyCustomValidator.cs b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/MyCustomValidator.cs index d1f37c97500..89cc4e87662 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/MyCustomValidator.cs +++ b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/MyCustomValidator.cs @@ -1,6 +1,6 @@ -using CoreWCF.IdentityModel.Selectors; -using System; +using System; using System.Threading.Tasks; +using CoreWCF.IdentityModel.Selectors; namespace WCFCorePerfService { @@ -10,7 +10,7 @@ public override ValueTask ValidateAsync(string userName, string password) { if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password)) { - return new ValueTask(Task.CompletedTask); + return default; } return new ValueTask(Task.FromException(new Exception("username and password cannot be empty"))); } diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/Program.cs b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/Program.cs index de8fb9d14da..3589c62219d 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/Program.cs +++ b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/Program.cs @@ -1,24 +1,26 @@ -using CoreWCF; +using System; +using System.IO; +using System.Net; +using System.Reflection; +using CoreWCF; using CoreWCF.Configuration; +using CoreWCFPerfService; using Microsoft.AspNetCore; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; -using System; -using System.Diagnostics; -using System.IO; -using System.Net; namespace WCFCorePerfService { public class Program { static void Main(string[] args) - { - string filePath = Path.Combine(Environment.CurrentDirectory, "WCFCorePerfService.exe"); + { + string filePath = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "CoreWCFPerfService.exe"); Console.WriteLine(filePath); - string command = $" advfirewall firewall add rule name=\"WCFCorePerfService\" dir=in protocol=any action=allow program=\"{filePath}\" enable=yes"; - ExecuteCommand(command, Environment.CurrentDirectory, TimeSpan.FromSeconds(20)); + + FirewallRulesManager.OpenPortInFirewall("CoreWCFPerfService", filePath, "8080,8443,8088"); + Console.WriteLine("Application start."); using (var host = CreateWebHostBuilder(args).Build()) @@ -29,10 +31,9 @@ static void Main(string[] args) Console.WriteLine("Press Any Key to Terminate..."); Console.ReadLine(); } - - command = $" advfirewall firewall delete rule name=\"WCFCorePerfService\" program=\"{filePath}\""; - ExecuteCommand(command, Environment.CurrentDirectory, TimeSpan.FromSeconds(20)); + Console.WriteLine("Clean up the firewall rule."); + FirewallRulesManager.RemoveAllBridgeFirewallRules("CoreWCFPerfService"); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => @@ -81,46 +82,5 @@ public void ChangeHostBehavior(ServiceHostBase host) host.Description.Behaviors.Add(srvCredentials); } } - - private static int ExecuteCommand(string command, string workingDirectory, TimeSpan timeout) - { - Process process = new Process(); - process.StartInfo.FileName = "netsh"; - process.StartInfo.Arguments = command; - - if (workingDirectory != null) - { - process.StartInfo.WorkingDirectory = workingDirectory; - } - - process.StartInfo.UseShellExecute = false; - process.Start(); - - bool flag; - if (timeout.TotalMilliseconds >= Int32.MaxValue) - { - flag = process.WaitForExit(Int32.MaxValue); - } - else - { - flag = process.WaitForExit((int)timeout.TotalMilliseconds); - } - - if (!flag) - { - process.Kill(); - } - - if (!flag) - { - throw new TimeoutException(string.Format("Command '{0}' was killed by timeout {1}.", new object[] - { - command, - timeout.ToString() - })); - } - - return process.ExitCode; - } } } diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/SayHello.cs b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/SayHello.cs index a37b597c8dc..1795936670c 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/SayHello.cs +++ b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/SayHello.cs @@ -1,6 +1,4 @@ -using System; -using System.Diagnostics; -using System.Threading.Tasks; +using System.Threading.Tasks; namespace WCFCorePerfService { @@ -8,54 +6,7 @@ public class SayHello : ISayHello { public Task HelloAsync(string name) { - return Task.Factory.StartNew(() => { return name; }); - } - - public bool Cleanup(string name) - { - string command = $" advfirewall firewall delete rule name=\"{name}\""; - bool flag = false; - int code = ExecuteCommand(command, Environment.CurrentDirectory, TimeSpan.FromSeconds(20)); - if (code == 0) - flag = true; - - return flag; - } - - private int ExecuteCommand(string command, string workingDirectory, TimeSpan timeout) - { - Process process = new Process(); - process.StartInfo.FileName = "netsh"; - process.StartInfo.Arguments = command; - if (workingDirectory != null) - { - process.StartInfo.WorkingDirectory = workingDirectory; - } - process.StartInfo.UseShellExecute = false; - process.Start(); - bool flag; - if (timeout.TotalMilliseconds >= Int32.MaxValue) - { - flag = process.WaitForExit(Int32.MaxValue); - } - else - { - flag = process.WaitForExit((int)timeout.TotalMilliseconds); - } - if (!flag) - { - process.Kill(); - } - - if (!flag) - { - throw new TimeoutException(string.Format("Command '{0}' was killed by timeout {1}.", new object[] - { - command, - timeout.ToString() - })); - } - return process.ExitCode; + return Task.FromResult(name); } } } diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/ISayHello.cs b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/ISayHello.cs index 65e880231fe..0dc463a15e0 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/ISayHello.cs +++ b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/ISayHello.cs @@ -8,5 +8,8 @@ public interface ISayHello { [OperationContract] Task HelloAsync(string name); + + [OperationContract] + string Hello(string name); } } diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/Program.cs b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/Program.cs index 09b7de9cb5d..d639d164d72 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/Program.cs +++ b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/Program.cs @@ -1,9 +1,11 @@ -using Microsoft.Crank.EventSources; -using System; +using System; using System.Diagnostics; using System.Security.Cryptography.X509Certificates; using System.ServiceModel; +using System.ServiceModel.Channels; using System.ServiceModel.Security; +using System.Threading.Tasks; +using Microsoft.Crank.EventSources; namespace WCFCorePerfClient { @@ -26,7 +28,7 @@ class Program private readonly static TimeSpan s_defaultPerfMeasurementDuration = TimeSpan.FromSeconds(10); private string _paramTransferMode = "Buffered"; - static void Main(string[] args) + static async Task Main(string[] args) { Console.WriteLine("WCFCorePerf Client."); @@ -34,14 +36,18 @@ static void Main(string[] args) if (test.ProcessRunOptions(args)) { - var startTime = DateTime.Now; - int request = 0; + BenchmarksEventSource.Register("wcfcoreperf/channelopensync", Operations.Max, Operations.Max, "Channel Open Sync Time (ms)", "Time to Open Sync Channel in ms", "n0"); + BenchmarksEventSource.Register("wcfcoreperf/firstsyncrequest", Operations.Max, Operations.Max, "First Sync Request (ms)", "Time to first sync request in ms", "n0"); + BenchmarksEventSource.Register("wcfcoreperf/syncrequests", Operations.Max, Operations.Sum, "Sync Requests (" + test._paramPerfMeasurementDuration.TotalMilliseconds + " ms)", "Total number of syncrequests", "n0"); + BenchmarksEventSource.Register("wcfcoreperf/rps/maxsync", Operations.Max, Operations.Sum, "Requests/sec (maxsync)", "Max sync requests per second", "n0"); - BenchmarksEventSource.Register("wcfcoreperf/channelopen", Operations.Max, Operations.Max, "Channel Open Time (ms)", "Time to Open Channel in ms", "n0"); - BenchmarksEventSource.Register("wcfcoreperf/firstrequest", Operations.Max, Operations.Max, "First Request (ms)", "Time to first request in ms", "n0"); - BenchmarksEventSource.Register("wcfcoreperf/requests", Operations.Max, Operations.Sum, "Requests (" + test._paramPerfMeasurementDuration.TotalMilliseconds + " ms)", "Total number of requests", "n0"); - BenchmarksEventSource.Register("wcfcoreperf/rps/max", Operations.Max, Operations.Sum, "Requests/sec (max)", "Max requests per second", "n0"); + BenchmarksEventSource.Register("wcfcoreperf/channelopenasync", Operations.Max, Operations.Max, "Channel Open Async Time (ms)", "Time to Open Async Channel in ms", "n0"); + BenchmarksEventSource.Register("wcfcoreperf/firstasyncrequest", Operations.Max, Operations.Max, "First Async Request (ms)", "Time to first request in ms", "n0"); + BenchmarksEventSource.Register("wcfcoreperf/asyncrequests", Operations.Max, Operations.Sum, "Async Requests (" + test._paramPerfMeasurementDuration.TotalMilliseconds + " ms)", "Total number of async requests", "n0"); + BenchmarksEventSource.Register("wcfcoreperf/rps/maxasync", Operations.Max, Operations.Sum, "Requests/sec (maxasync)", "Max async requests per second", "n0"); + var stopwatch = new Stopwatch(); + stopwatch.Reset(); switch (test._paramBinding) { case TestBinding.BasicHttp: @@ -65,85 +71,141 @@ static void Main(string[] args) } Console.WriteLine($"Testing TransferMode: {binding.TransferMode}"); - ChannelFactory factory = new ChannelFactory(binding, new EndpointAddress(test._paramServiceUrl)); - var stopwatchChannelOpen = new Stopwatch(); - stopwatchChannelOpen.Start(); - factory.Open(); - BenchmarksEventSource.Measure("wcfcoreperf/channelopen", stopwatchChannelOpen.ElapsedMilliseconds); + var factory = await test.RunFirstChannelOpen(test._paramBinding, binding, true, test._paramServiceUrl, stopwatch); + await test.RunFirstChannelOpen(test._paramBinding, binding, false, test._paramServiceUrl, stopwatch); var client = factory.CreateChannel(); - var stopwatchFirstReq = new Stopwatch(); - stopwatchFirstReq.Start(); - var result = client.HelloAsync("helloworld").Result; - BenchmarksEventSource.Measure("wcfcoreperf/firstrequest", stopwatchFirstReq.ElapsedMilliseconds); - while (DateTime.Now <= startTime.Add(test._paramPerfMeasurementDuration)) - { - var rtnResult = client.HelloAsync("helloworld").Result; - request++; - } + await test.RunFirstIteration(client, true, stopwatch); + await test.RunFirstIteration(client, false, stopwatch); + + await test.RunMaxThroughput(client, true, test._paramPerfMeasurementDuration); + await test.RunMaxThroughput(client, false, test._paramPerfMeasurementDuration); - BenchmarksEventSource.Measure("wcfcoreperf/requests", request); - BenchmarksEventSource.Measure("wcfcoreperf/rps/max", request / test._paramPerfMeasurementDuration.TotalSeconds); break; case TestBinding.WSHttp: WSHttpBinding wsHttpBinding = new WSHttpBinding(SecurityMode.TransportWithMessageCredential); wsHttpBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; - ChannelFactory wsHttpFactory = new ChannelFactory(wsHttpBinding, new EndpointAddress(test._paramServiceUrl)); - wsHttpFactory.Credentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication - { - CertificateValidationMode = X509CertificateValidationMode.None, - RevocationMode = X509RevocationMode.NoCheck - }; - wsHttpFactory.Credentials.UserName.UserName = "abc"; - wsHttpFactory.Credentials.UserName.Password = "[PLACEHOLDER]"; - var stopwatchWSHttpChannelOpen = new Stopwatch(); - stopwatchWSHttpChannelOpen.Start(); - wsHttpFactory.Open(); - BenchmarksEventSource.Measure("wcfcoreperf/channelopen", stopwatchWSHttpChannelOpen.ElapsedMilliseconds); + var wsHttpFactory = await test.RunFirstChannelOpen(test._paramBinding, wsHttpBinding, true, test._paramServiceUrl, stopwatch); + await test.RunFirstChannelOpen(test._paramBinding, wsHttpBinding, false, test._paramServiceUrl, stopwatch); var clientWSHttp = wsHttpFactory.CreateChannel(); - var stopwatchWSHttpFirstReq = new Stopwatch(); - stopwatchWSHttpFirstReq.Start(); - Console.WriteLine(clientWSHttp.HelloAsync("helloworld").Result); - BenchmarksEventSource.Measure("wcfcoreperf/firstrequest", stopwatchWSHttpFirstReq.ElapsedMilliseconds); - while (DateTime.Now <= startTime.Add(test._paramPerfMeasurementDuration)) - { - var rtnResult = clientWSHttp.HelloAsync("helloworld").Result; - request++; - } + await test.RunFirstIteration(clientWSHttp, true, stopwatch); + await test.RunFirstIteration(clientWSHttp, false, stopwatch); - BenchmarksEventSource.Measure("wcfcoreperf/requests", request); - BenchmarksEventSource.Measure("wcfcoreperf/rps/max", request / test._paramPerfMeasurementDuration.TotalSeconds); + await test.RunMaxThroughput(clientWSHttp, true, test._paramPerfMeasurementDuration); + await test.RunMaxThroughput(clientWSHttp, false, test._paramPerfMeasurementDuration); break; case TestBinding.NetTcp: NetTcpBinding netTcpBinding = new NetTcpBinding(SecurityMode.None); - ChannelFactory netTcpFactory = new ChannelFactory(netTcpBinding, new EndpointAddress(test._paramServiceUrl)); - - var stopwatchNetTcpChannelOpen = new Stopwatch(); - stopwatchNetTcpChannelOpen.Start(); - netTcpFactory.Open(); - BenchmarksEventSource.Measure("wcfcoreperf/channelopen", stopwatchNetTcpChannelOpen.ElapsedMilliseconds); + netTcpBinding.SendTimeout = TimeSpan.FromSeconds(300); + netTcpBinding.ReceiveTimeout = TimeSpan.FromSeconds(300); + var netTcpFactory = await test.RunFirstChannelOpen(test._paramBinding, netTcpBinding, true, test._paramServiceUrl, stopwatch); + await test.RunFirstChannelOpen(test._paramBinding, netTcpBinding, false, test._paramServiceUrl, stopwatch); var clientNetTcp = netTcpFactory.CreateChannel(); - var stopwatchNetTcpFirstReq = new Stopwatch(); - stopwatchNetTcpFirstReq.Start(); - var netTcpResult = clientNetTcp.HelloAsync("helloworld").Result; - BenchmarksEventSource.Measure("wcfcoreperf/firstrequest", stopwatchNetTcpFirstReq.ElapsedMilliseconds); - while (DateTime.Now <= startTime.Add(test._paramPerfMeasurementDuration)) - { - var rtnResult = clientNetTcp.HelloAsync("helloworld").Result; - request++; - } + await test.RunFirstIteration(clientNetTcp, true, stopwatch); + await test.RunMaxThroughput(clientNetTcp, true, test._paramPerfMeasurementDuration); - BenchmarksEventSource.Measure("wcfcoreperf/requests", request); - BenchmarksEventSource.Measure("wcfcoreperf/rps/max", request / test._paramPerfMeasurementDuration.TotalSeconds); + await test.RunFirstIteration(clientNetTcp, false, stopwatch); + await test.RunMaxThroughput(clientNetTcp, false, test._paramPerfMeasurementDuration); break; } - } + } + } + + private ChannelFactory GetChannelFactory(TestBinding testBinding, Binding binding, string address) + { + ChannelFactory factory = null; + switch (testBinding) + { + case TestBinding.BasicHttp: + case TestBinding.NetTcp: + factory = new ChannelFactory(binding, new EndpointAddress(address)); + break; + case TestBinding.WSHttp: + factory = new ChannelFactory(binding, new EndpointAddress(address)); + factory.Credentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication + { + CertificateValidationMode = X509CertificateValidationMode.None, + RevocationMode = X509RevocationMode.NoCheck + }; + factory.Credentials.UserName.UserName = "abc"; + factory.Credentials.UserName.Password = "[PLACEHOLDER]"; + break; + } + + return factory; + } + + private async Task RunMaxThroughput(ISayHello client, bool sync, TimeSpan time) + { + DateTime iterationStartTime, iterationEndTime, iterationDurationTime; + int request = 0; + iterationStartTime = DateTime.Now; + iterationDurationTime = iterationStartTime.Add(time); + while (DateTime.Now <= iterationDurationTime) + { + if (sync) + { + Console.WriteLine($"Get sync result:{client.Hello("helloworld")}"); + } + else + { + Console.WriteLine($"Get async result:{await client.HelloAsync("helloworld")}"); + } + request++; + } + + iterationEndTime = DateTime.Now; + if (sync) + { + BenchmarksEventSource.Measure("wcfcoreperf/syncrequests", request); + BenchmarksEventSource.Measure("wcfcoreperf/rps/maxsync", request / (iterationEndTime - iterationStartTime).TotalSeconds); + } + else + { + BenchmarksEventSource.Measure("wcfcoreperf/asyncrequests", request); + BenchmarksEventSource.Measure("wcfcoreperf/rps/maxasync", request / (iterationEndTime - iterationStartTime).TotalSeconds); + } + } + + private async Task RunFirstIteration(ISayHello client, bool sync, Stopwatch stopwatch) + { + stopwatch.Restart(); + if (sync) + { + Console.WriteLine($"Get the first sync request: {client.Hello("helloworld")}"); + BenchmarksEventSource.Measure("wcfcoreperf/firstsyncrequest", stopwatch.ElapsedMilliseconds); + } + else + { + Console.WriteLine($"Get the first async request: {await client.HelloAsync("helloworld")}"); + BenchmarksEventSource.Measure("wcfcoreperf/firstasyncrequest", stopwatch.ElapsedMilliseconds); + } + } + + private async Task> RunFirstChannelOpen(TestBinding testbinding, Binding binding, bool sync, string address, Stopwatch stopwatch) + { + stopwatch.Restart(); + ChannelFactory factory = null; + if (sync) + { + factory = GetChannelFactory(testbinding, binding, address); + factory.Open(); + BenchmarksEventSource.Measure("wcfcoreperf/channelopensync", stopwatch.ElapsedMilliseconds); + } + else + { + factory = GetChannelFactory(testbinding, binding, address); + await Task.Factory.FromAsync(factory.BeginOpen, factory.EndClose, null); + BenchmarksEventSource.Measure("wcfcoreperf/channelopenasync", stopwatch.ElapsedMilliseconds); + } + + return factory; } private bool ProcessRunOptions(string[] args) @@ -195,6 +257,6 @@ private bool ReportWrongArgument(string arg) { Console.WriteLine("Wrong parameter: " + arg); return false; - } + } } } diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/WCFCorePerfClient.csproj b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/WCFCorePerfClient.csproj index 19fdc98fb40..5961b9d1a28 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/WCFCorePerfClient.csproj +++ b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/WCFCorePerfClient.csproj @@ -7,10 +7,10 @@ - - - - + + + + From 1da7471741c93fb35cabcb3a8bddd21f2b5e0041 Mon Sep 17 00:00:00 2001 From: Zhaodong Tian Date: Thu, 27 Oct 2022 00:13:43 -0700 Subject: [PATCH 11/12] Add net6.0 --- .../CoreWCFPerfService/CoreWCFPerfService.csproj | 2 +- .../WCFCorePerfClient/WCFCorePerfClient.csproj | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/CoreWCFPerfService.csproj b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/CoreWCFPerfService.csproj index d23b1251b99..a0d6786fe3f 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/CoreWCFPerfService.csproj +++ b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/CoreWCFPerfService/CoreWCFPerfService.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net6.0;net7.0 diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/WCFCorePerfClient.csproj b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/WCFCorePerfClient.csproj index 5961b9d1a28..f887b5e2ccf 100644 --- a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/WCFCorePerfClient.csproj +++ b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/WCFCorePerfClient/WCFCorePerfClient.csproj @@ -1,8 +1,8 @@ - + Exe - net7.0 + net6.0;net7.0 From 3500a2d18d3a25d60ffb7a9cb696d9880014f491 Mon Sep 17 00:00:00 2001 From: Zhaodong Tian Date: Thu, 27 Oct 2022 18:41:59 -0700 Subject: [PATCH 12/12] Add feed in NuGet.config --- .../tests/Benchmarks/PerfUsingCoreWCFService/NuGet.config | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/NuGet.config diff --git a/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/NuGet.config b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/NuGet.config new file mode 100644 index 00000000000..b152cbb2762 --- /dev/null +++ b/src/System.Private.ServiceModel/tests/Benchmarks/PerfUsingCoreWCFService/NuGet.config @@ -0,0 +1,7 @@ + + + + + + +