#general
echo 0 > /sys/block/mmcblk0/queue/rotational; #done
echo 1 > /sys/block/mmcblk0/queue/rq_affinity; #done
echo 0 > /sys/block/mmcblk0/queue/iostats; #disable iostats to reduce overhead - idea by kodos96
echo 256 > /sys/block/mmcblk0/queue/read_ahead_kb; # Optimize for readahead
echo 0 > /sys/block/mmcblk0/queue/nomerges; #merges are good echo 2048 > /sys/block/mmcblk0/queue/nr_requests;echo 1024 > /sys/block/mmcblk0/queue/nr_requests; # for starters: keep it sane
echo 512 > /sys/block/mmcblk0/queue/nr_requests;
echo 128 > /sys/block/mmcblk0/queue/nr_requests; #default
#deadline
echo 4 > /sys/block/mmcblk0/queue/iosched/fifo_batch;
echo 4 > /sys/block/mmcblk0/queue/iosched/writes_starved;
#cfq
echo 16 > /sys/block/mmcblk0/queue/iosched/quantum;
echo 8 > /sys/block/mmcblk0/queue/iosched/quantum; #default
echo 1000000000 > /sys/block/mmcblk0/queue/iosched/back_seek_max;
echo 0 > /sys/block/mmcblk0/queue/iosched/back_seek_max;
echo 16384 > /sys/block/mmcblk0/queue/iosched/back_seek_max; #default
echo 1 > /sys/block/mmcblk0/queue/iosched/back_seek_penalty; #removed the penalty for back-seeks
echo 2 > /sys/block/mmcblk0/queue/iosched/back_seek_penalty; #default
echo 3 > /sys/block/mmcblk0/queue/iosched/slice_idle; #Lowered the idle wait
echo 1 > /sys/block/mmcblk0/queue/iosched/slice_idle;
echo 0 > /sys/block/mmcblk0/queue/iosched/slice_idle;
echo 7 > /sys/block/mmcblk0/queue/iosched/slice_idle; #default
echo 1 > /sys/block/mmcblk0/queue/iosched/low_latency; #default, low latency mode of cfq
# cfq tweaks
echo 64 > /sys/block/mmcblk0/queue/iosched/quantum;
echo 120 > /sys/block/mmcblk0/queue/iosched/fifo_expire_sync;
echo 250 > /sys/block/mmcblk0/queue/iosched/fifo_expire_async;
echo 1000000000 > /sys/block/mmcblk0/queue/iosched/back_seek_max;
echo 1 > /sys/block/mmcblk0/queue/iosched/back_seek_penalty;
echo 93 > /sys/block/mmcblk0/queue/iosched/slice_sync;
echo 39 > /sys/block/mmcblk0/queue/iosched/slice_async;
echo 16 > /sys/block/mmcblk0/queue/iosched/slice_async_rq;
echo 0 > /sys/block/mmcblk0/queue/iosched/slice_idle;
echo 10 > /sys/block/mmcblk0/queue/iosched/group_idle;
echo 1 > /sys/block/mmcblk0/queue/iosched/low_latency;
echo 1024 > /sys/block/mmcblk0/queue/nr_requests;
echo 512 > /sys/block/mmcblk0/queue/read_ahead_kb;
echo 2 > /sys/block/mmcblk0/queue/rq_affinity;
echo 1 > /sys/block/mmcblk0/queue/nomerges;
echo 0 > /sys/block/mmcblk0/queue/iostats;
# cfq tweaks
echo 64 > /sys/block/mmcblk0/queue/iosched/quantum;
echo 120 > /sys/block/mmcblk0/queue/iosched/fifo_expire_sync;
echo 250 > /sys/block/mmcblk0/queue/iosched/fifo_expire_async;
echo 1000000000 > /sys/block/mmcblk0/queue/iosched/back_seek_max;
echo 1 > /sys/block/mmcblk0/queue/iosched/back_seek_penalty;
echo 93 > /sys/block/mmcblk0/queue/iosched/slice_sync;
echo 39 > /sys/block/mmcblk0/queue/iosched/slice_async;
echo 2 > /sys/block/mmcblk0/queue/iosched/slice_async_rq;
Anyway, I agree. We should start from defaults again and examine each of the logical ideas I had for the tunables so far.
I lowered my max and played around with nr_requests and a few other things. Whar I got from it was nr_requests should either be 1024 or maybe 4096, but I'm leaning toward 1024 still, and that back_seek_max actually performs better at 1000000000 than 0 or 16384 or 2147483647 or even 1073741824. Simpler calculations perhaps?
So right now I'm at 8 / 125 / 250 / 1000000000 / 1 / 93 / 39 / 2 / 7 / 0 / 1
12582912 for bsm ties up all the easy ones, so now on to phase two to see if there's anything we can improve with the sync and async values. :)
I actually just did that with slice_sync/async and there's definitely something to be found in this one.
Ballpark halved both values to slice_sync = 54 and slice_async = 23 and saw about a 3% improvement in I/O. More importantly though, it was damn consistent with it, and the low values for both read/write were consistently better than the low values using the previous settings.
I don't have time now to push this any further, so I'm going to run it for the rest of the day with these settings to see how it feels in use, then take a look at it again later to see if there's a sweeter point than just "halve it and see" :p
Edit:
Oh, and I found this on IO Schedulers - has info on Deadline, Anticipatory and CFQ - some interesting reading that's actually 99% plain english if people want to check it out.
https://www.dropbox.com/s/g0ua5u3wx2x6vqs/IO%20Schedulers.pdf
What about other non-kernel set variables?