xref: /xnu-11215.1.10/tests/vm/perf_compressor.lua (revision 8d741a5de7ff4191bf97d57b9f54c2f6d4a15585)
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