1*8d741a5dSApple OSS Distributions#!/usr/local/bin/recon 2*8d741a5dSApple OSS Distributions 3*8d741a5dSApple OSS Distributionslocal benchrun = require 'benchrun' 4*8d741a5dSApple OSS Distributionslocal perfdata = require 'perfdata' 5*8d741a5dSApple OSS Distributionslocal csv = require 'csv' 6*8d741a5dSApple OSS Distributionslocal sysctl = require 'sysctl' 7*8d741a5dSApple OSS Distributions 8*8d741a5dSApple OSS Distributionsrequire 'strict' 9*8d741a5dSApple OSS Distributions 10*8d741a5dSApple OSS Distributionslocal kDefaultDuration = 15 11*8d741a5dSApple OSS Distributions 12*8d741a5dSApple OSS Distributionslocal benchmark = benchrun.new { 13*8d741a5dSApple OSS Distributions name = 'xnu.perf_compressor', 14*8d741a5dSApple OSS Distributions version = 1, 15*8d741a5dSApple OSS Distributions arg = arg, 16*8d741a5dSApple OSS Distributions modify_argparser = function(parser) 17*8d741a5dSApple OSS Distributions parser:argument { 18*8d741a5dSApple OSS Distributions name = 'path', 19*8d741a5dSApple OSS Distributions description = 'Path to perf_compressor binary' 20*8d741a5dSApple OSS Distributions } 21*8d741a5dSApple OSS Distributions parser:option{ 22*8d741a5dSApple OSS Distributions name = '--duration', 23*8d741a5dSApple OSS Distributions description = 'How long, in seconds, to run each iteration', 24*8d741a5dSApple OSS Distributions default = kDefaultDuration 25*8d741a5dSApple OSS Distributions } 26*8d741a5dSApple OSS Distributions parser:option{ 27*8d741a5dSApple OSS Distributions name = '--variant', 28*8d741a5dSApple OSS Distributions description = 'Which benchmark variant to run', 29*8d741a5dSApple OSS Distributions default = 'compress-and-decompress', 30*8d741a5dSApple OSS Distributions choices = {'compress', 'compress-and-decompress'} 31*8d741a5dSApple OSS Distributions } 32*8d741a5dSApple OSS Distributions parser:option{ 33*8d741a5dSApple OSS Distributions name = '--buffer-size', 34*8d741a5dSApple OSS Distributions description = 'MB size of buffer to send to compressor', 35*8d741a5dSApple OSS Distributions default = 100 36*8d741a5dSApple OSS Distributions } 37*8d741a5dSApple OSS Distributions parser:option{ 38*8d741a5dSApple OSS Distributions name = '--data-type', 39*8d741a5dSApple OSS Distributions description = 'Fill the buffer with random, zero, or typical data', 40*8d741a5dSApple OSS Distributions default = 'typical', 41*8d741a5dSApple OSS Distributions choices = {'typical', 'random', 'zero'} 42*8d741a5dSApple OSS Distributions } 43*8d741a5dSApple OSS Distributions parser:flag { 44*8d741a5dSApple OSS Distributions name = '--verbose', 45*8d741a5dSApple OSS Distributions description = 'Print benchmark progress', 46*8d741a5dSApple OSS Distributions } 47*8d741a5dSApple OSS Distributions end 48*8d741a5dSApple OSS Distributions} 49*8d741a5dSApple OSS Distributionslocal is_development_kernel, err = sysctl("kern.development") 50*8d741a5dSApple OSS Distributionsbenchmark:assert(err == nil, "Unable to check for development kernel") 51*8d741a5dSApple OSS Distributionsif is_development_kernel == 0 then 52*8d741a5dSApple OSS Distributions print "Skipping benchmark on non-development kernel." 53*8d741a5dSApple OSS Distributions os.exit(0) 54*8d741a5dSApple OSS Distributionsend 55*8d741a5dSApple OSS Distributionslocal hw_page_size, err = sysctl("hw.pagesize") 56*8d741a5dSApple OSS Distributionsbenchmark:assert(err == nil, "Unable to check hw page size") 57*8d741a5dSApple OSS Distributionslocal vm_page_size, err = sysctl("vm.pagesize") 58*8d741a5dSApple OSS Distributionsbenchmark:assert(err == nil, "Unable to check vm page size") 59*8d741a5dSApple OSS Distributionslocal product_name = benchmark:spawn{'/usr/bin/sw_vers', '-productName'} 60*8d741a5dSApple OSS Distributionsif hw_page_size ~= vm_page_size then 61*8d741a5dSApple OSS Distributions benchmark:print "Skipping benchmark on this platform because benchmark process has a different page size than the kernel" 62*8d741a5dSApple OSS Distributions os.exit(0) 63*8d741a5dSApple OSS Distributionselseif string.find(product_name, "Watch OS") or string.find(product_name, "TVOS") then 64*8d741a5dSApple OSS Distributions -- rdar://103802544: Temporarily disable test for watchOS and tvOS 65*8d741a5dSApple OSS Distributions benchmark:print "Skipping benchmark on this platform as a temporary workaround to avoid device panics" 66*8d741a5dSApple OSS Distributions os.exit(0) 67*8d741a5dSApple OSS Distributionsend 68*8d741a5dSApple OSS Distributions 69*8d741a5dSApple OSS Distributionsargs = {benchmark.opt.path, benchmark.opt.variant, benchmark.opt.data_type, benchmark.opt.duration, benchmark.opt.buffer_size} 70*8d741a5dSApple OSS Distributionsif benchmark.opt.verbose then 71*8d741a5dSApple OSS Distributions table.insert(args, 2, "-v") 72*8d741a5dSApple OSS Distributions args["echo"] = true 73*8d741a5dSApple OSS Distributionsend 74*8d741a5dSApple OSS Distributionsfor out in benchmark:run(args) do 75*8d741a5dSApple OSS Distributions local result = out:match("-----Results-----\n(.*)") 76*8d741a5dSApple OSS Distributions benchmark:assert(result, "Unable to find result data in output") 77*8d741a5dSApple OSS Distributions local data = csv.openstring(result, {header = true}) 78*8d741a5dSApple OSS Distributions for field in data:lines() do 79*8d741a5dSApple OSS Distributions for k, v in pairs(field) do 80*8d741a5dSApple OSS Distributions unit = perfdata.unit.bytes_per_second 81*8d741a5dSApple OSS Distributions if k == "Compression Ratio" then 82*8d741a5dSApple OSS Distributions unit = perfdata.unit.custom("uncompressed / compressed") 83*8d741a5dSApple OSS Distributions end 84*8d741a5dSApple OSS Distributions benchmark.writer:add_value(k, unit, tonumber(v), { 85*8d741a5dSApple OSS Distributions data_type = benchmark.opt.data_type, 86*8d741a5dSApple OSS Distributions buffer_size = benchmark.opt.buffer_size, 87*8d741a5dSApple OSS Distributions [perfdata.larger_better] = true 88*8d741a5dSApple OSS Distributions }) 89*8d741a5dSApple OSS Distributions end 90*8d741a5dSApple OSS Distributions end 91*8d741a5dSApple OSS Distributionsend 92*8d741a5dSApple OSS Distributions 93*8d741a5dSApple OSS Distributionsbenchmark:finish() 94