Hi Bart, On 05/03/2024 00:20, Bart Van Assche wrote: > On 3/4/24 12:16, Christian Loehle wrote: >> Pixel 6 ufs Android 14 (7 runs for because device showed some variance) >> [6605, 6622, 6633, 6652, 6690, 6697, 6754] sugov mainline >> [7141, 7173, 7198, 7220, 7280, 7427, 7452] per-task tracking >> [2390, 2392, 2406, 2437, 2464, 2487, 2813] sugov no iowait boost >> [7812, 7837, 7837, 7851, 7900, 7959, 7980] performance governor > > Variance of performance results for Pixel devices can be reduced greatly > by disabling devfreq scaling, e.g. as follows (this may cause thermal > issues if the system load is high enough): > > for d in $(adb shell echo /sys/class/devfreq/*); do > adb shell "cat $d/available_frequencies | > tr ' ' '\n' | > sort -n | > case $devfreq in > min) head -n1;; > max) tail -n1;; > esac > $d/min_freq" > done > Thanks for the hint! >> Showcasing some different IO scenarios, again all random read, >> median out of 5 runs, all on rk3399 with NVMe. >> e.g. io_uring6x4 means 6 threads with 4 iodepth each, results can be >> obtained using: >> fio --minimal --time_based --name=test --filename=/dev/nvme0n1 --runtime=30 --rw=randread --bs=4k --ioengine=io_uring --iodepth=4 --numjobs=6 --group_reporting | cut -d \; -f 8 > > So buffered I/O was used during this test? Shouldn't direct I/O be used > for this kind of tests (--buffered=0)? Additionally, which I/O scheduler > was configured? I recommend --ioscheduler=none for this kind of tests. Yes I opted for buffered I/O, I guess it's the eternal question if you should benchmark the device/stack (O_DIRECT) or be more realistic to actual use cases (probably). I opted for the latter, but since it's 4K randread on significantly large devices the results don't differ too much. >> - Higher cap is not always beneficial, we might place the task away >> from the CPU where the interrupt handler is running, making it run >> on an unboosted CPU which may have a bigger impact than the difference >> between the CPU's capacity the task moved to. (Of course the boost will >> then be reverted again, but a ping-pong every interval is possible). > > In the above I see "the interrupt handler". Does this mean that the NVMe > controller in the test setup only supports one completion interrupt for > all completion queues instead of one completion interrupt per completion > queue? There are already Android phones and developer boards available > that support the latter, namely the boards equipped with a UFSHCI 4.0 controller. No, both NVMe test setups have one completion interrupt per completion queue, so this caveat doesn't affect them, higher capacity CPU is strictly better. The UFS and both mmc setups (eMMC with CQE and sdcard) only have one completion interrupt (on CPU0 on my setup). The difference between the CPU capacities on the Pixel6 is able to make up for this. The big CPU is still the best to run these single-threaded fio benchmarks on in terms of throughput. FWIW you do gain an additional ~20% (in my specific setup) if you move the ufshcd interrupt to a big CPU, too. Similarly for the mmc. Unfortunately the infrastructure is far from being there for the scheduler to move the interrupt to the same performance domain as the task, which is often optimal both in terms of throughput and in terms of power. I'll go looking for a stable testing platform with UFS as you mentioned, benefits of this patch will of course be greatly increased. Thanks! Best Regards, Christian