no bug - Bumping Firefox l10n changesets r=release a=l10n-bump DONTBUILD CLOSED TREE
[gecko.git] / python / mozperftest / mozperftest / system / android_perf_tuner.py
blobe33d98b5d0818495bcaa2a86d051ebfc34d0376f
1 # This Source Code Form is subject to the terms of the Mozilla Public
2 # License, v. 2.0. If a copy of the MPL was not distributed with this file,
3 # You can obtain one at http://mozilla.org/MPL/2.0/.
6 def tune_performance(device, log=None, timeout=None):
7 """Set various performance-oriented parameters, to reduce jitter.
9 This includes some device-specific kernel tweaks.
11 For more information, see https://bugzilla.mozilla.org/show_bug.cgi?id=1547135.
12 """
13 PerformanceTuner(device, log=log, timeout=timeout).tune_performance()
16 class PerformanceTuner:
17 def __init__(self, device, log=None, timeout=None):
18 self.device = device
19 self.log = log is not None and log or self.device._logger
20 self.timeout = timeout
22 def tune_performance(self):
23 self.log.info("tuning android device performance")
24 self.set_svc_power_stayon()
25 if self.device.is_rooted:
26 device_name = self.device.shell_output(
27 "getprop ro.product.model", timeout=self.timeout
29 # all commands require root shell from here on
30 self.set_scheduler()
31 self.set_virtual_memory_parameters()
32 self.turn_off_services()
33 self.set_cpu_performance_parameters(device_name)
34 self.set_gpu_performance_parameters(device_name)
35 self.set_kernel_performance_parameters()
36 self.device.clear_logcat(timeout=self.timeout)
37 self.log.info("android device performance tuning complete")
39 def _set_value_and_check_exitcode(self, file_name, value):
40 self.log.info("setting {} to {}".format(file_name, value))
41 if self.device.shell_bool(
42 " ".join(["echo", str(value), ">", str(file_name)]),
43 timeout=self.timeout,
45 self.log.info("successfully set {} to {}".format(file_name, value))
46 else:
47 self.log.warning("command failed")
49 def set_svc_power_stayon(self):
50 self.log.info("set device to stay awake on usb")
51 self.device.shell_bool("svc power stayon usb", timeout=self.timeout)
53 def set_scheduler(self):
54 self.log.info("setting scheduler to noop")
55 scheduler_location = "/sys/block/sda/queue/scheduler"
57 self._set_value_and_check_exitcode(scheduler_location, "noop")
59 def turn_off_services(self):
60 services = [
61 "mpdecision",
62 "thermal-engine",
63 "thermald",
65 for service in services:
66 self.log.info(" ".join(["turning off service:", service]))
67 self.device.shell_bool(" ".join(["stop", service]), timeout=self.timeout)
69 services_list_output = self.device.shell_output(
70 "service list", timeout=self.timeout
72 for service in services:
73 if service not in services_list_output:
74 self.log.info(" ".join(["successfully terminated:", service]))
75 else:
76 self.log.warning(" ".join(["failed to terminate:", service]))
78 def set_virtual_memory_parameters(self):
79 self.log.info("setting virtual memory parameters")
80 commands = {
81 "/proc/sys/vm/swappiness": 0,
82 "/proc/sys/vm/dirty_ratio": 85,
83 "/proc/sys/vm/dirty_background_ratio": 70,
86 for key, value in commands.items():
87 self._set_value_and_check_exitcode(key, value)
89 def set_cpu_performance_parameters(self, device_name=None):
90 self.log.info("setting cpu performance parameters")
91 commands = {}
93 # Samsung A51 perf tuning: Bug 1876543
94 # Pixel 6 perf tuning: Bug 1876545
95 # Samsung S21 perf tuning: Bug 1876546
96 if device_name is not None:
97 device_name = self.device.shell_output(
98 "getprop ro.product.model", timeout=self.timeout
101 self.log.info(
102 "CPU for device with ro.product.model '{}' unknown, not scaling_governor".format(
103 device_name
107 for key, value in commands.items():
108 self._set_value_and_check_exitcode(key, value)
110 def set_gpu_performance_parameters(self, device_name=None):
111 self.log.info("setting gpu performance parameters")
112 commands = {
113 "/sys/class/kgsl/kgsl-3d0/bus_split": "0",
114 "/sys/class/kgsl/kgsl-3d0/force_bus_on": "1",
115 "/sys/class/kgsl/kgsl-3d0/force_rail_on": "1",
116 "/sys/class/kgsl/kgsl-3d0/force_clk_on": "1",
117 "/sys/class/kgsl/kgsl-3d0/force_no_nap": "1",
118 "/sys/class/kgsl/kgsl-3d0/idle_timer": "1000000",
121 if not device_name:
122 device_name = self.device.shell_output(
123 "getprop ro.product.model", timeout=self.timeout
126 self.log.info(
127 "GPU for device with ro.product.model '{}' unknown, not setting devfreq".format(
128 device_name
132 for key, value in commands.items():
133 self._set_value_and_check_exitcode(key, value)
135 def set_kernel_performance_parameters(self):
136 self.log.info("setting kernel performance parameters")
137 commands = {
138 "/sys/kernel/debug/msm-bus-dbg/shell-client/update_request": "1",
139 "/sys/kernel/debug/msm-bus-dbg/shell-client/mas": "1",
140 "/sys/kernel/debug/msm-bus-dbg/shell-client/ab": "0",
141 "/sys/kernel/debug/msm-bus-dbg/shell-client/slv": "512",
143 for key, value in commands.items():
144 self._set_value_and_check_exitcode(key, value)