{
  "slug": "linux-blk-mq-iosched",
  "title": "Linux names 4 blk-mq schedulers; I/O priority lists 8 RT levels for bfq and mq-deadline",
  "kind": "dataset",
  "summary": "Linux switching-sched names 4 per-device blk-mq schedulers: mq-deadline, none, bfq, and kyber. I/O priority is named for bfq and mq-deadline, with 3 classes, 8 RT class-data levels, and best-effort levels 0 (highest) through 7 (lowest); none and kyber are not named. Kyber has 2 tunables, read and synchronous-write targets in nanoseconds, which are throttle targets rather than a measured latency. The none scheduler does not reorder, and completion order is not guaranteed. No throughput was measured.",
  "published": "2026-10-12",
  "updated": "2026-10-12",
  "accessed": "2026-10-12",
  "evidenceType": "kernel-documentation",
  "license": "Small derived table. The CSV and this JSON metadata are CC0-1.0. They are not a Linux kernel dump. The opened file block/mq-deadline.c begins with SPDX-License-Identifier: GPL-2.0 and prints Copyright (C) 2016 Jens Axboe. The opened kyber-iosched.rst, switching-sched.rst, and deadline-iosched.rst.txt files contain no SPDX-License-Identifier line, and the opened blk-mq and ioprio HTML pages do not show one, so GPL-2.0 is not read off those documents. COPYING at the kernel tree root states SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note and GNU General Public License version 2 only. Canonical full dumps, linked and not mirrored: mainline 7.3-rc7 (2026-10-12) https://git.kernel.org/torvalds/t/linux-7.3-rc7.tar.gz and stable 7.2.10 (2026-10-11) https://cdn.kernel.org/pub/linux/kernel/v7.x/linux-7.2.10.tar.xz.",
  "licenseUrl": "https://creativecommons.org/publicdomain/zero/1.0/",
  "sourceUrl": "https://www.kernel.org/doc/html/latest/block/blk-mq.html",
  "rowCount": 8,
  "method": "Rows are printed counts and levels from Linux kernel documentation and from block/mq-deadline.c, opened on 2026-10-12. They are not a trace of devices. switching-sched names four schedulers that can be written to /sys/block/DEV/queue/scheduler, and it shows the active name in brackets. The example cat line is for one device (sda). blk-mq.html says none places requests on whatever software queue the process is running on, without any reordering. The same page says neither the block layer nor the device protocols guarantee the order of completion of requests, and that higher layers such as the filesystem must handle that. That completion sentence is about the block layer, so this record uses it for none, mq-deadline, and kyber alike. It is not a measured completion order.\n\nioprio.html says I/O-priority support is scheduler dependent and currently supported by bfq and mq-deadline. It names three classes, 8 RT class-data levels, and best-effort levels from 0 (highest) to 7 (lowest). none and kyber are not named. Kyber's only two tunables, read_lat_nsec and write_lat_nsec, are target latencies in nanoseconds. Kyber throttles requests in order to meet those targets. The opened kyber text prints no default number. Those targets are not a measured latency. The deadline tunables page defines read_expire as the current time plus read_expire in milliseconds, a start-service target, and defines write_expire the same way for writes. Requests are grouped into batches of one data direction and serviced in increasing sector order. Reads are preferred until writes_starved, whose unit is a number of dispatches, says to dispatch some writes. A fifo_batch value of 1 is the documented first-come first-served case, not a default in this table. Setting front_merges to 0 disables front-merge lookup. block/mq-deadline.c begins with SPDX-License-Identifier: GPL-2.0, sets elevator_name to mq-deadline and elevator_alias to deadline, points at Documentation/block/deadline-iosched.rst, maps IOPRIO_CLASS_RT, IOPRIO_CLASS_BE, and IOPRIO_CLASS_IDLE, and dispatches in priority order while higher-priority requests are pending. Expire defaults and sbitmap magnitudes from that file are not columns.\n\nNamed fault: treating the bracketed scheduler name, or none's lack of reordering, as a completion-order guarantee. The signal is the bracket in /sys/block/DEV/queue/scheduler and the blk-mq sentence that none does not reorder onto the running process's software queue. The miss is the same page's statement that neither the block layer nor the device protocols guarantee completion order. Named fault: reading read_lat_nsec or write_lat_nsec as achieved latency. The signal is Kyber's two nanosecond throttle targets. The miss is that the opened text has no default and no measured latency. Named fault: applying I/O priority to every scheduler, or stopping at ioprio_set(2), which still says that as at kernel 2.6.17 the only such scheduler is CFQ. The signal is ioprio.html, which names bfq and mq-deadline, 8 RT levels, and best-effort levels 0 through 7. The miss is that none and kyber are not named, and the man page is not a cell in this table. Named fault: reading the four-name cat line as a fleet, a default, or a measured throughput. The signal is one example device. The miss is that bfq is named there and in the I/O-priority rows, while this table does not transcribe bfq's algorithm, and the phrase about improving throughput is not a measured rate.",
  "limits": [
    "Population is not applicable. This is not a sample of drives, hosts, or kernels. Sample size is not applicable. There is no observation date range. The scheduler pages were opened on 2026-10-12. On that date kernel.org listed mainline 7.3-rc7 (2026-10-12) and stable 7.2.10 (2026-10-11). Those are release labels, not a test window.",
    "The switching-sched cat line is an example for the device name sda. It is not a default scheduler, not a population, and not a date range. The sentence that selecting a scheduler can improve throughput is not a measured throughput. No IOPS, MB/s, or latency sample is in this table. The opened scheduler pages do not state a test machine or a drive model.",
    "bfq is one of the four names and is named for I/O priority. This table does not describe bfq's algorithm. Narrating behavior for only none, mq-deadline, and kyber drops bfq.",
    "none places requests on the software queue the process is running on without any reordering. That is not a completion-order guarantee. The completion sentence is about the block layer and the device protocols, and this record repeats it for none, mq-deadline, and kyber. It was not measured under each scheduler.",
    "Kyber read_lat_nsec and write_lat_nsec are target latencies in nanoseconds. The opened kyber page and rst print no default number and no achieved latency. A throttle target is not a measured latency.",
    "read_expire and write_expire are start-service targets in milliseconds. writes_starved is a number of dispatches. This table does not include compiled expire defaults from mq-deadline.c and does not include an sbitmap magnitude. The deadline page signature is Nov 11 2002, Jens Axboe. The ioprio page signature is March 11 2005, Jens Axboe. Those lines stay on those pages. They are not an observation period. The mq-deadline.c copyright line stays on that file.",
    "ioprio_set(2) still says that as at kernel 2.6.17 the only I/O-priority scheduler is CFQ, and its example cat line is noop anticipatory deadline [cfq]. That page is not the source of any quantity cell. The kernel ioprio page is. Vendor tuning guides are not cells."
  ],
  "columns": [
    {
      "name": "fact",
      "type": "string",
      "description": "Identifier of one documented quantity. Not a device-sample id."
    },
    {
      "name": "applies_to",
      "type": "string",
      "description": "Scheduler names the quantity applies to, separated by semicolons. bfq is included where switching-sched or ioprio names it. none and kyber are not given I/O-priority quantities."
    },
    {
      "name": "quantity",
      "type": "integer",
      "description": "Number printed on the cited page, or the count of names that page lists. Not a measured throughput, not an expire default, and not an sbitmap size. Best-effort quantities are priority-level indexes."
    },
    {
      "name": "unit",
      "type": "string",
      "description": "Unit of quantity. Kyber's row counts throttle targets whose printed latency unit is nanoseconds."
    },
    {
      "name": "citation_id",
      "type": "string",
      "description": "Id of the citation in this file. The note applies only to this row."
    },
    {
      "name": "note",
      "type": "string",
      "description": "Scope of the quantity. Present only for facts that are rows in this table. The io_nice formula is quoted and not evaluated."
    }
  ],
  "downloadPath": "/data/datasets/linux-blk-mq-iosched.csv",
  "citations": [
    {
      "id": "switching-sched",
      "title": "Switching Scheduler",
      "url": "https://www.kernel.org/doc/Documentation/block/switching-sched.rst",
      "accessed": "2026-10-12"
    },
    {
      "id": "blk-mq",
      "title": "Multi-Queue Block IO Queueing Mechanism (blk-mq)",
      "url": "https://www.kernel.org/doc/html/latest/block/blk-mq.html",
      "accessed": "2026-10-12"
    },
    {
      "id": "ioprio",
      "title": "Block io priorities",
      "url": "https://www.kernel.org/doc/html/latest/block/ioprio.html",
      "accessed": "2026-10-12"
    },
    {
      "id": "kyber-iosched",
      "title": "Kyber I/O scheduler tunables",
      "url": "https://www.kernel.org/doc/html/latest/block/kyber-iosched.html",
      "accessed": "2026-10-12"
    },
    {
      "id": "kyber-rst",
      "title": "Kyber I/O scheduler tunables (kyber-iosched.rst)",
      "url": "https://www.kernel.org/doc/html/latest/_sources/block/kyber-iosched.rst.txt",
      "accessed": "2026-10-12"
    },
    {
      "id": "deadline-iosched",
      "title": "Deadline IO scheduler tunables",
      "url": "https://www.kernel.org/doc/html/latest/block/deadline-iosched.html",
      "accessed": "2026-10-12"
    },
    {
      "id": "deadline-rst",
      "title": "Deadline IO scheduler tunables (deadline-iosched.rst.txt)",
      "url": "https://www.kernel.org/doc/html/latest/_sources/block/deadline-iosched.rst.txt",
      "accessed": "2026-10-12"
    },
    {
      "id": "mq-deadline-c",
      "title": "MQ Deadline I/O scheduler (block/mq-deadline.c)",
      "url": "https://raw.githubusercontent.com/torvalds/linux/master/block/mq-deadline.c",
      "accessed": "2026-10-12"
    },
    {
      "id": "kernel-archives",
      "title": "The Linux Kernel Archives",
      "url": "https://www.kernel.org/",
      "accessed": "2026-10-12"
    },
    {
      "id": "copying",
      "title": "Linux kernel COPYING",
      "url": "https://raw.githubusercontent.com/torvalds/linux/master/COPYING",
      "accessed": "2026-10-12"
    },
    {
      "id": "ioprio-set-man",
      "title": "ioprio_set(2) Linux manual page",
      "url": "https://man7.org/linux/man-pages/man2/ioprio_set.2.html",
      "accessed": "2026-10-12"
    }
  ]
}
