1*e3723e1fSApple OSS Distributions#!/usr/local/bin/recon 2*e3723e1fSApple OSS Distributionsrequire 'strict' 3*e3723e1fSApple OSS Distributions 4*e3723e1fSApple OSS Distributionslocal benchrun = require 'benchrun' 5*e3723e1fSApple OSS Distributionslocal perfdata = require 'perfdata' 6*e3723e1fSApple OSS Distributionslocal sysctl = require 'sysctl' 7*e3723e1fSApple OSS Distributionslocal csv = require 'csv' 8*e3723e1fSApple OSS Distributions 9*e3723e1fSApple OSS Distributionslocal kDefaultNumWrites = 10000000000 10*e3723e1fSApple OSS Distributions 11*e3723e1fSApple OSS Distributionslocal benchmark = benchrun.new { 12*e3723e1fSApple OSS Distributions name = 'xnu.per_cpu_counter', 13*e3723e1fSApple OSS Distributions version = 1, 14*e3723e1fSApple OSS Distributions arg = arg, 15*e3723e1fSApple OSS Distributions modify_argparser = function(parser) 16*e3723e1fSApple OSS Distributions parser:argument{ 17*e3723e1fSApple OSS Distributions name = 'path', 18*e3723e1fSApple OSS Distributions description = 'Path to benchmark binary' 19*e3723e1fSApple OSS Distributions } 20*e3723e1fSApple OSS Distributions parser:option{ 21*e3723e1fSApple OSS Distributions name = '--cpu-workers', 22*e3723e1fSApple OSS Distributions description = 'Number of cpu workers' 23*e3723e1fSApple OSS Distributions } 24*e3723e1fSApple OSS Distributions parser:flag{ 25*e3723e1fSApple OSS Distributions name = '--through-max-workers', 26*e3723e1fSApple OSS Distributions description = 'Run benchmark for [1..n] cpu workers' 27*e3723e1fSApple OSS Distributions } 28*e3723e1fSApple OSS Distributions parser:flag{ 29*e3723e1fSApple OSS Distributions name = '--through-max-workers-fast', 30*e3723e1fSApple OSS Distributions description = 'Run benchmark for [1..2] and each power of four value in [4..n] cpu workers' 31*e3723e1fSApple OSS Distributions } 32*e3723e1fSApple OSS Distributions parser:option { 33*e3723e1fSApple OSS Distributions name = "--num-writes", 34*e3723e1fSApple OSS Distributions description = "number of writes", 35*e3723e1fSApple OSS Distributions default = kDefaultNumWrites 36*e3723e1fSApple OSS Distributions } 37*e3723e1fSApple OSS Distributions parser:option{ 38*e3723e1fSApple OSS Distributions name = '--variant', 39*e3723e1fSApple OSS Distributions description = 'Which benchmark variant to run (scalable, atomic, or racy)', 40*e3723e1fSApple OSS Distributions default = 'scalable', 41*e3723e1fSApple OSS Distributions choices = {"scalable", "atomic", "racy"} 42*e3723e1fSApple OSS Distributions } 43*e3723e1fSApple OSS Distributions end 44*e3723e1fSApple OSS Distributions} 45*e3723e1fSApple OSS Distributions 46*e3723e1fSApple OSS Distributionsassert(benchmark.opt.path, "No path supplied for fault throughput binary") 47*e3723e1fSApple OSS Distributions 48*e3723e1fSApple OSS Distributionslocal ncpus, err = sysctl('hw.logicalcpu_max') 49*e3723e1fSApple OSS Distributionsassert(ncpus > 0, 'invalid number of logical cpus') 50*e3723e1fSApple OSS Distributionslocal cpu_workers = tonumber(benchmark.opt.cpu_workers) or ncpus 51*e3723e1fSApple OSS Distributions 52*e3723e1fSApple OSS Distributionslocal writes_per_second = perfdata.unit.custom('writes/sec') 53*e3723e1fSApple OSS Distributionslocal tests = {} 54*e3723e1fSApple OSS Distributions 55*e3723e1fSApple OSS Distributionsfunction QueueTest(num_cores) 56*e3723e1fSApple OSS Distributions table.insert(tests, { 57*e3723e1fSApple OSS Distributions path = benchmark.opt.path, 58*e3723e1fSApple OSS Distributions num_cores = num_cores, 59*e3723e1fSApple OSS Distributions }) 60*e3723e1fSApple OSS Distributionsend 61*e3723e1fSApple OSS Distributions 62*e3723e1fSApple OSS Distributionsif benchmark.opt.through_max_workers then 63*e3723e1fSApple OSS Distributions for i = 1, cpu_workers do 64*e3723e1fSApple OSS Distributions QueueTest(i) 65*e3723e1fSApple OSS Distributions end 66*e3723e1fSApple OSS Distributionselseif benchmark.opt.through_max_workers_fast then 67*e3723e1fSApple OSS Distributions local i = 1 68*e3723e1fSApple OSS Distributions while i <= cpu_workers do 69*e3723e1fSApple OSS Distributions QueueTest(i) 70*e3723e1fSApple OSS Distributions -- Always do a run with two threads to see what the first part of 71*e3723e1fSApple OSS Distributions -- the scaling curve looks like 72*e3723e1fSApple OSS Distributions -- (and to measure perf on dual core systems). 73*e3723e1fSApple OSS Distributions if i == 1 and cpu_workers >= 2 then 74*e3723e1fSApple OSS Distributions QueueTest(i + 1) 75*e3723e1fSApple OSS Distributions end 76*e3723e1fSApple OSS Distributions i = i * 4 77*e3723e1fSApple OSS Distributions end 78*e3723e1fSApple OSS Distributionselse 79*e3723e1fSApple OSS Distributions QueueTest(cpu_workers) 80*e3723e1fSApple OSS Distributionsend 81*e3723e1fSApple OSS Distributions 82*e3723e1fSApple OSS Distributionsfor _, test in ipairs(tests) do 83*e3723e1fSApple OSS Distributions local args = {test.path, benchmark.opt.variant, benchmark.opt.num_writes, test.num_cores, 84*e3723e1fSApple OSS Distributions echo = true} 85*e3723e1fSApple OSS Distributions for out in benchmark:run(args) do 86*e3723e1fSApple OSS Distributions local result = out:match("-----Results-----\n(.*)") 87*e3723e1fSApple OSS Distributions benchmark:assert(result, "Unable to find result data in output") 88*e3723e1fSApple OSS Distributions local data = csv.openstring(result, {header = true}) 89*e3723e1fSApple OSS Distributions for field in data:lines() do 90*e3723e1fSApple OSS Distributions for k, v in pairs(field) do 91*e3723e1fSApple OSS Distributions local unit = writes_per_second 92*e3723e1fSApple OSS Distributions local larger_better = true 93*e3723e1fSApple OSS Distributions if k == "loss" then 94*e3723e1fSApple OSS Distributions unit = percentage 95*e3723e1fSApple OSS Distributions larger_better = false 96*e3723e1fSApple OSS Distributions end 97*e3723e1fSApple OSS Distributions benchmark.writer:add_value(k, unit, tonumber(v), { 98*e3723e1fSApple OSS Distributions [perfdata.larger_better] = larger_better, 99*e3723e1fSApple OSS Distributions threads = test.num_cores, 100*e3723e1fSApple OSS Distributions variant = benchmark.opt.variant 101*e3723e1fSApple OSS Distributions }) 102*e3723e1fSApple OSS Distributions end 103*e3723e1fSApple OSS Distributions end 104*e3723e1fSApple OSS Distributions end 105*e3723e1fSApple OSS Distributionsend 106*e3723e1fSApple OSS Distributions 107*e3723e1fSApple OSS Distributionsbenchmark:finish() 108