internal static void Start(CrankArguments arguments) { ControllerHub.Arguments = arguments; PerformanceCounters = new PerformanceCounters(new Uri(arguments.Url).Host, arguments.SignalRInstance); ThreadPool.QueueUserWorkItem(_ => Run()); }
private static void Record(CrankArguments arguments) { var maxConnections = 0; foreach (var sample in _samples) { // metric simplified for reporting to reflect the counter name and machine where it was sampled var key = String.Format("{0} ({1})", sample.Key.CounterName, ExpandMachineName(sample.Key.MachineName)); var samples = sample.Value; var values = new long[samples.Count - 1]; for (int i = 0; i < values.Length; i++) { values[i] = (long)Math.Round(CounterSample.Calculate(samples[i], samples[i + 1])); Mark(arguments, (ulong)values[i], key); } if (key.StartsWith("Connections Connected")) { maxConnections = (int)Math.Max(maxConnections, values.Max()); } RecordAggregates(key, values); } Console.WriteLine("Max Connections Connected: " + maxConnections); }
private static void SampleConnections(CrankArguments arguments, ConcurrentBag <Connection> connections, TimeSpan elapsed) { var connecting = connections.Count(c => c.State == ConnectionState.Connecting); var connected = connections.Count(c => c.State == ConnectionState.Connected); var reconnecting = connections.Count(c => c.State == ConnectionState.Reconnecting); var disconnected = connections.Count(c => c.State == ConnectionState.Disconnected); Mark(arguments, (ulong)connecting, "Connections Connecting"); Mark(arguments, (ulong)connected, "Connections Connected"); Mark(arguments, (ulong)reconnecting, "Connections Reconnecting"); Mark(arguments, (ulong)disconnected, "Connections Disconnected"); var transportState = ""; if (connections.First().Transport.GetType() == typeof(AutoTransport)) { transportState = String.Format(", Transport={0}ws|{1}ss|{2}lp", connections.Count(c => c.Transport.Name.Equals("webSockets", StringComparison.InvariantCultureIgnoreCase)), connections.Count(c => c.Transport.Name.Equals("serverSentEvents", StringComparison.InvariantCultureIgnoreCase)), connections.Count(c => c.Transport.Name.Equals("longPolling", StringComparison.InvariantCultureIgnoreCase))); } Console.WriteLine(String.Format("[{0}] Connections: {1}/{2}, State={3}|{4}c|{5}r|{6}d", elapsed, connections.Count(), arguments.NumClients, connecting, connected, reconnecting, disconnected) + transportState); }
private static void SampleCounters(CrankArguments arguments, ConcurrentBag <Connection> connections, TimeSpan elapsedd) { if (_counters == null) { InitializeCounters(arguments); } else { Parallel.ForEach(_counters, c => _samples[c].Add(c.NextSample())); } }
public static void Main() { Arguments = CrankArguments.Parse(); ThreadPool.SetMinThreads(Arguments.Connections, 2); TaskScheduler.UnobservedTaskException += OnUnobservedTaskException; if (Arguments.IsController) { ControllerHub.Start(Arguments); } Run().Wait(); }
public static CrankArguments Parse() { CrankArguments args = null; try { args = CommandLine.Parse <CrankArguments>(); } catch (CommandLineException e) { Console.WriteLine(e.ArgumentHelp.Message); Console.WriteLine(e.ArgumentHelp.GetHelpText(Console.BufferWidth)); Environment.Exit(1); } return(args); }
private static void Sample(CrankArguments arguments, ConcurrentBag<Connection> connections, TimeSpan elapsed) { if (connections.Count == 0) { return; } _batchLock.Wait(); try { SampleConnections(arguments, connections, elapsed); SampleCounters(arguments, connections, elapsed); } finally { _batchLock.Release(); } }
private static void Sample(CrankArguments arguments, ConcurrentBag <Connection> connections, TimeSpan elapsed) { if (connections.Count == 0) { return; } _batchLock.Wait(); try { SampleConnections(arguments, connections, elapsed); SampleCounters(arguments, connections, elapsed); } finally { _batchLock.Release(); } }
private static void InitializeCounters(CrankArguments arguments) { _counters = new List <PerformanceCounter>(); _samples = new Dictionary <PerformanceCounter, List <CounterSample> >(); try { // Each line specifies a counter in the format: 'machine\category\counter(instance)' // When machine is set to 'server' the hostname portion of the URL will be used var server = new Uri(arguments.Url).Host; foreach (var line in File.ReadAllLines("Counters.txt")) { var parts = line.Split('\\'); if (parts.Length == 3) { var machine = parts[0].Trim(); var category = parts[1].Trim(); var name = parts[2].Trim(); var instance = ""; var i = name.IndexOf('('); if (i > 0) { instance = name.Substring(i + 1, name.Length - i - 2); name = name.Substring(0, i); } LoadCounter(category, name, instance, machine.Equals("server", StringComparison.InvariantCultureIgnoreCase) ? server : machine); } } } catch (Exception e) { Console.WriteLine("Failed to load counters: {0}", e); } }
private static void Mark(CrankArguments arguments, ulong value, string metric) { #if PERFRUN Microsoft.VisualStudio.Diagnostics.Measurement.MeasurementBlock.Mark(value, String.Format("{0}-{1};{2}", arguments.Transport, arguments.NumClients, metric)); #endif }
private static void SampleCounters(CrankArguments arguments, ConcurrentBag<Connection> connections, TimeSpan elapsedd) { if (_counters == null) { InitializeCounters(arguments); } else { Parallel.ForEach(_counters, c => _samples[c].Add(c.NextSample())); } }
private static void InitializeCounters(CrankArguments arguments) { _counters = new List<PerformanceCounter>(); _samples = new Dictionary<PerformanceCounter, List<CounterSample>>(); try { // Each line specifies a counter in the format: 'machine\category\counter(instance)' // When machine is set to 'server' the hostname portion of the URL will be used var server = new Uri(arguments.Url).Host; foreach (var line in File.ReadAllLines("Counters.txt")) { var parts = line.Split('\\'); if (parts.Length == 3) { var machine = parts[0].Trim(); var category = parts[1].Trim(); var name = parts[2].Trim(); var instance = ""; var i = name.IndexOf('('); if (i > 0) { instance = name.Substring(i + 1, name.Length - i - 2); name = name.Substring(0, i); } LoadCounter(category, name, instance, machine.Equals("server", StringComparison.InvariantCultureIgnoreCase) ? server : machine); } } } catch (Exception e) { Console.WriteLine("Failed to load counters: {0}", e); } }
private static void SampleConnections(CrankArguments arguments, ConcurrentBag<Connection> connections, TimeSpan elapsed) { var connecting = connections.Count(c => c.State == ConnectionState.Connecting); var connected = connections.Count(c => c.State == ConnectionState.Connected); var reconnecting = connections.Count(c => c.State == ConnectionState.Reconnecting); var disconnected = connections.Count(c => c.State == ConnectionState.Disconnected); Mark(arguments, (ulong)connecting, "Connections Connecting"); Mark(arguments, (ulong)connected, "Connections Connected"); Mark(arguments, (ulong)reconnecting, "Connections Reconnecting"); Mark(arguments, (ulong)disconnected, "Connections Disconnected"); var transportState = ""; if (connections.First().Transport.GetType() == typeof(AutoTransport)) { transportState = String.Format(", Transport={0}ws|{1}ss|{2}lp", connections.Count(c => c.Transport.Name.Equals("webSockets", StringComparison.InvariantCultureIgnoreCase)), connections.Count(c => c.Transport.Name.Equals("serverSentEvents", StringComparison.InvariantCultureIgnoreCase)), connections.Count(c => c.Transport.Name.Equals("longPolling", StringComparison.InvariantCultureIgnoreCase))); } Console.WriteLine(String.Format("[{0}] Connections: {1}/{2}, State={3}|{4}c|{5}r|{6}d", elapsed, connections.Count(), arguments.NumClients, connecting, connected, reconnecting, disconnected) + transportState); }