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.
13 PerformanceTuner(device
, log
=log
, timeout
=timeout
).tune_performance()
16 class PerformanceTuner
:
17 def __init__(self
, device
, log
=None, timeout
=None):
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
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
)]),
45 self
.log
.info("successfully set {} to {}".format(file_name
, value
))
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
):
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
]))
76 self
.log
.warning(" ".join(["failed to terminate:", service
]))
78 def set_virtual_memory_parameters(self
):
79 self
.log
.info("setting virtual memory parameters")
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")
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
102 "CPU for device with ro.product.model '{}' unknown, not scaling_governor".format(
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")
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",
122 device_name
= self
.device
.shell_output(
123 "getprop ro.product.model", timeout
=self
.timeout
127 "GPU for device with ro.product.model '{}' unknown, not setting devfreq".format(
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")
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
)