static async Task TestGet() { var sw = Stopwatch.StartNew(); var pgq = new AggPgqClient(pgqList.Select(ep => new PgqClient(ep)).ToArray()); var lens = new List <TimeSpan>(); var z = 0; var empty = 0; var rps = new RpsMeter(); var requestCount = 0; while (go_on) { while (z > totalRps) { await Task.Delay(1); } //while (rps.GetRps() > totalRps) await Task.Delay(1); Interlocked.Increment(ref z); var(queueName, partition, selector) = generateQueue(); var start = DateTime.Now; //rps.Hit(); requestCount++; _ = pgq.Get(queueName, partition, selector).ContinueWith(async t => { var mid = t.Result; if (mid != Guid.Empty) { await pgq.Ack(mid); } else { Interlocked.Increment(ref empty); } Interlocked.Decrement(ref z); lens.Add(DateTime.Now - start); }); } sw.Stop(); while (z > 0) { await Task.Delay(1); } lens.Sort(); lock (Console.Out) { Console.WriteLine($"GET: NUM: {requestCount}"); Console.WriteLine($"GET: RPS: {(int)(requestCount / sw.Elapsed.TotalSeconds)}"); Console.WriteLine($"GET: LAT AVG: {lens.Select(ts => ts.TotalMilliseconds).Average():#}"); Console.WriteLine($"GET: LAT 95%: {lens[(int)(lens.Count * 0.95)].TotalMilliseconds:#}"); Console.WriteLine($"GET: EMPTY: {empty}"); } }
static async Task Main(string[] args) { var cubePods = new List <string>(); if (KubernetesClientConfiguration.IsInCluster()) { var config = KubernetesClientConfiguration.BuildDefaultConfig(); var client = new Kubernetes(config); pgqList = client.ListNamespacedPod("pgq").Items .Where(i => i.Metadata.Name.StartsWith("pgq-")) .OrderBy(i => i.Metadata.Name) .Select(i => new IPEndPoint(IPAddress.Parse(i.Status.PodIP), 88)) .ToArray(); } var pgqs = Environment.GetEnvironmentVariable("H2R_PGQ_LIST"); if (!string.IsNullOrWhiteSpace(pgqs)) { pgqList = pgqs .Split(',', ';', ' ', '\r', '\n', '\t') .Where(c => !string.IsNullOrWhiteSpace(c)) .Select(c => { var parts = c.Split(':'); var host = parts[0]; Console.WriteLine(host); return(new IPEndPoint(Dns.GetHostAddresses(host)[0], int.Parse(parts[1]))); }) .ToArray(); } foreach (var ep in pgqList) { Console.WriteLine("connecting to " + ep); } var bGet = true; var bPut = true; if (args.Length > 0) { bGet = args[0].Contains("get"); bPut = args[0].Contains("put"); } if (args.Length > 1) { totalRps = int.Parse(args[1]); } Console.Write("warming up... "); var pgq = new AggPgqClient(pgqList.Select(ep => new PgqClient(ep)).ToArray()); await pgq.Warmup(); Console.WriteLine("started!"); var t = new List <Task>(); if (bGet) { t.Add(TestGet()); } if (bPut) { t.Add(TestPut()); } Console.ReadLine(); go_on = false; await Task.WhenAll(t); }