linux/Documentation/block
Paolo Valente 24bfd19bb7 block, bfq: update blkio stats outside the scheduler lock
bfq invokes various blkg_*stats_* functions to update the statistics
contained in the special files blkio.bfq.* in the blkio controller
groups, i.e., the I/O accounting related to the proportional-share
policy provided by bfq. The execution of these functions takes a
considerable percentage, about 40%, of the total per-request execution
time of bfq (i.e., of the sum of the execution time of all the bfq
functions that have to be executed to process an I/O request from its
creation to its destruction).  This reduces the request-processing
rate sustainable by bfq noticeably, even on a multicore CPU. In fact,
the bfq functions that invoke blkg_*stats_* functions cannot be
executed in parallel with the rest of the code of bfq, because both
are executed under the same same per-device scheduler lock.

To reduce this slowdown, this commit moves, wherever possible, the
invocation of these functions (more precisely, of the bfq functions
that invoke blkg_*stats_* functions) outside the critical sections
protected by the scheduler lock.

With this change, and with all blkio.bfq.* statistics enabled, the
throughput grows, e.g., from 250 to 310 KIOPS (+25%) on an Intel
i7-4850HQ, in case of 8 threads doing random I/O in parallel on
null_blk, with the latter configured with 0 latency. We obtained the
same or higher throughput boosts, up to +30%, with other processors
(some figures are reported in the documentation). For our tests, we
used the script [1], with which our results can be easily reproduced.

NOTE. This commit still protects the invocation of blkg_*stats_*
functions with the request_queue lock, because the group these
functions are invoked on may otherwise disappear before or while these
functions are executed.  Fortunately, tests without even this lock
show, by difference, that the serialization caused by this lock has a
little impact (at most ~5% of throughput reduction).

[1] https://github.com/Algodev-github/IOSpeed

Tested-by: Lee Tibbert <lee.tibbert@gmail.com>
Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
Signed-off-by: Luca Miccio <lucmiccio@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2017-11-14 20:13:33 -07:00
..
00-INDEX block, bfq: introduce the BFQ-v0 I/O scheduler as an extra scheduler 2017-04-19 08:29:02 -06:00
bfq-iosched.txt block, bfq: update blkio stats outside the scheduler lock 2017-11-14 20:13:33 -07:00
biodoc.txt block: remove __bio_kmap_atomic 2017-11-10 19:53:25 -07:00
biovecs.txt Documentation: update notes in biovecs about arbitrarily sized bios 2015-08-13 12:32:07 -06:00
capability.txt genhd: expose AN to user space 2007-05-23 20:14:11 -07:00
cfq-iosched.txt block: replace REQ_NOIDLE with REQ_IDLE 2016-11-01 09:43:26 -06:00
cmdline-partition.txt block: change config option name for cmdline partition parsing 2013-09-30 14:31:02 -07:00
data-integrity.txt bio-integrity: fold bio_integrity_enabled to bio_integrity_prep 2017-07-03 16:56:24 -06:00
deadline-iosched.txt trivial: Miscellaneous documentation typo fixes 2009-06-12 18:01:47 +02:00
ioprio.txt Update Jens Axboe's email in Documentation/* 2007-10-16 09:59:55 +02:00
kyber-iosched.txt blk-mq: introduce Kyber multiqueue I/O scheduler 2017-04-14 14:06:58 -06:00
null_blk.txt null_blk: add an usage for shared tags in documentation 2017-11-07 09:25:37 -07:00
pr.txt Doc: Fix double words in Documentation 2017-01-26 15:25:41 -07:00
queue-sysfs.txt block: remove the discard_zeroes_data flag 2017-04-08 11:25:38 -06:00
request.txt Update Jens Axboe's email in Documentation/* 2007-10-16 09:59:55 +02:00
stat.txt [PATCH] block/stat.txt 2006-01-08 20:14:01 -08:00
switching-sched.txt Documentation: drop as block elevator reference in switching-sched.txt 2011-11-04 12:01:48 -07:00
writeback_cache_control.txt block, drivers, fs: rename REQ_FLUSH to REQ_PREFLUSH 2016-06-07 13:41:38 -06:00