Пример #1
0
        internal static void Start(CrankArguments arguments)
        {
            ControllerHub.Arguments = arguments;
            PerformanceCounters     = new PerformanceCounters(new Uri(arguments.Url).Host, arguments.SignalRInstance);

            ThreadPool.QueueUserWorkItem(_ => Run());
        }
Пример #2
0
        internal static void Start(CrankArguments arguments)
        {
            ControllerHub.Arguments = arguments;
            PerformanceCounters = new PerformanceCounters(new Uri(arguments.Url).Host, arguments.SignalRInstance);

            ThreadPool.QueueUserWorkItem(_ => Run());
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
 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()));
     }
 }
Пример #6
0
        public static void Main()
        {
            Arguments = CrankArguments.Parse();

            ThreadPool.SetMinThreads(Arguments.Connections, 2);
            TaskScheduler.UnobservedTaskException += OnUnobservedTaskException;

            if (Arguments.IsController)
            {
                ControllerHub.Start(Arguments);
            }

            Run().Wait();
        }
Пример #7
0
        public static void Main()
        {
            Arguments = CrankArguments.Parse();

            ThreadPool.SetMinThreads(Arguments.Connections, 2);
            TaskScheduler.UnobservedTaskException += OnUnobservedTaskException;

            if (Arguments.IsController)
            {
                ControllerHub.Start(Arguments);
            }

            Run().Wait();
        }
Пример #8
0
        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);
        }
Пример #9
0
        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();
            }
        }
Пример #10
0
        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();
            }
        }
Пример #11
0
        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);
            }
        }
Пример #12
0
        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
        }
Пример #13
0
        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);
        }
Пример #14
0
 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()));
     }
 }
Пример #15
0
        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);
            }
        }
Пример #16
0
        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);
        }
Пример #17
0
        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
        }