From b416f2252e1a30a2f4f6a08b27c9f82e4a824d3b Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Thu, 28 Feb 2019 15:36:48 -0800 Subject: [PATCH 1/2] adb: add benchmarks for sink/source. Test: ./benchmark_device.py Change-Id: Ib9e911574be3afa94efcfd9bc5be0a5cf7b9e2c0 --- adb/benchmark_device.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/adb/benchmark_device.py b/adb/benchmark_device.py index e56ef5a55..4d0cf49a0 100755 --- a/adb/benchmark_device.py +++ b/adb/benchmark_device.py @@ -17,6 +17,8 @@ import os import statistics +import subprocess +import tempfile import time import adb @@ -56,6 +58,41 @@ def analyze(name, speeds): msg = "%s: %d runs: median %.2f MiB/s, mean %.2f MiB/s, stddev: %.2f MiB/s" print(msg % (name, len(speeds), median, mean, stddev)) +def benchmark_sink(device=None, size_mb=100): + if device == None: + device = adb.get_device() + + speeds = list() + cmd = device.adb_cmd + ["raw", "sink:%d" % (size_mb * 1024 * 1024)] + + with tempfile.TemporaryFile() as tmpfile: + tmpfile.truncate(size_mb * 1024 * 1024) + + for _ in range(0, 10): + tmpfile.seek(0) + begin = time.time() + subprocess.check_call(cmd, stdin=tmpfile) + end = time.time() + speeds.append(size_mb / float(end - begin)) + + analyze("sink %dMiB" % size_mb, speeds) + +def benchmark_source(device=None, size_mb=100): + if device == None: + device = adb.get_device() + + speeds = list() + cmd = device.adb_cmd + ["raw", "source:%d" % (size_mb * 1024 * 1024)] + + with open(os.devnull, 'w') as devnull: + for _ in range(0, 10): + begin = time.time() + subprocess.check_call(cmd, stdout=devnull) + end = time.time() + speeds.append(size_mb / float(end - begin)) + + analyze("source %dMiB" % size_mb, speeds) + def benchmark_push(device=None, file_size_mb=100): if device == None: device = adb.get_device() @@ -110,6 +147,8 @@ def benchmark_shell(device=None, file_size_mb=100): def main(): device = adb.get_device() unlock(device) + benchmark_sink(device) + benchmark_source(device) benchmark_push(device) benchmark_pull(device) From 5841a96afcca45380af5233f335f6df2bdecfc64 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Thu, 28 Feb 2019 15:44:05 -0800 Subject: [PATCH 2/2] adbd: tune USB read/write sizes and queue depths. Reduce the operation sizes to sizes that are small enough that the kernel will run the OOM killer to try to make them succeed. Compensate for the smaller operation sizes by increasing the queue depth. Bug: http://b/126582877 Test: benchmark_device.py Change-Id: I4d351f56c8f83fea882614238cc3fec8ba1e9bf9 --- adb/daemon/usb.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/adb/daemon/usb.cpp b/adb/daemon/usb.cpp index 83ff221cc..ff618b050 100644 --- a/adb/daemon/usb.cpp +++ b/adb/daemon/usb.cpp @@ -57,11 +57,11 @@ using android::base::StringPrintf; // We can't find out whether we have support for AIO on ffs endpoints until we submit a read. static std::optional gFfsAioSupported; -static constexpr size_t kUsbReadQueueDepth = 16; -static constexpr size_t kUsbReadSize = 16384; +static constexpr size_t kUsbReadQueueDepth = 32; +static constexpr size_t kUsbReadSize = 8 * PAGE_SIZE; -static constexpr size_t kUsbWriteQueueDepth = 16; -static constexpr size_t kUsbWriteSize = 16 * PAGE_SIZE; +static constexpr size_t kUsbWriteQueueDepth = 32; +static constexpr size_t kUsbWriteSize = 8 * PAGE_SIZE; static const char* to_string(enum usb_functionfs_event_type type) { switch (type) {