ИМЯ
ioprio_get, ioprio_set - получает/устанавливает класс и приоритет планирования ввода-выводаLIBRARY
Standard C library ( libc, -lc)СИНТАКСИС
#include <linux/ioprio.h> /* определения констант IOPRIO_* */ #include <sys/syscall.h> /* определения констант SYS_* */ #include <unistd.h>
int syscall(SYS_ioprio_get, int which, int who); int syscall(SYS_ioprio_set, int which, int who, int ioprio);Note: glibc provides no wrappers for these system calls, necessitating the use of syscall(2).
ОПИСАНИЕ
Системные вызовы ioprio_get() и ioprio_set() получают и устанавливают класс и приоритет планирования ввода-вывода одной или более нитей. В аргументах which и who указывается нить(и), над которой выполняются системные вызовы. В аргументе which указывается как будет рассматриваться who; он может иметь одно из следующих значений:- IOPRIO_WHO_PROCESS
- Значением who является идентификатор процесса или нити, определяющий один процесс или нить. Если who равно 0, то операции выполняются над вызвавшей нитью.
- IOPRIO_WHO_PGRP
- Значением who является идентификатор группы, определяющий всех членов группы процесса. Если who равно 0, то операции выполняются над группой процессов, членом которой является вызвавший.
- IOPRIO_WHO_USER
- Значением who является идентификатор пользователя, определяющий все процессы, которые имеют этот реальный идентификатор.
- IOPRIO_PRIO_VALUE(class, data)
- Объединяет заданный класс планирования class и приоритет ( data) в значение ioprio, которое возвращается как результат макроса.
- IOPRIO_PRIO_CLASS(mask)
- Из указанной маски mask (значение ioprio) возвращает значение класса ввода-вывода, то есть одно из значений: IOPRIO_CLASS_RT, IOPRIO_CLASS_BE или IOPRIO_CLASS_IDLE.
- IOPRIO_PRIO_DATA(mask)
- Из указанной маски mask (значение ioprio) возвращает значение приоритета ( data).
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении ioprio_get() возвращается значение ioprio процесса с самым высоким приоритетом ввода-вывода из всех процессов, подходящих под критерий, указанный в which и who. При ошибке возвращается -1, а в errno содержится код ошибки. При успешном выполнении ioprio_set() возвращается 0. При ошибке возвращается -1, а в errno содержится код ошибки.ОШИБКИ
- EINVAL
- Неправильное значение which или ioprio. Обратитесь к разделу ЗАМЕЧАНИЯ, в нём приведены доступные классы планировщика и уровни приоритета ioprio.
- EPERM
- У вызывающего процесса нет прав, необходимых для назначения данного ioprio указанному процессу(ам). Более подробную информацию о необходимых правах ioprio_set() можно найти в разделе ЗАМЕЧАНИЯ.
- ESRCH
- Не найдено процессов, которые бы соответствовали заданным в which и who критериям.
ВЕРСИИ
Данные системные вызовы появились в Linux начиная с ядра версии 2.6.13.СТАНДАРТЫ
Данные системные вызовы есть только в Linux.ЗАМЕЧАНИЯ
Два или более процесса или нити могут использовать общий контекст ввода-вывода. Это может происходить в случае, если вызывается clone(2) с флагом CLONE_IO. Однако по умолчанию разные нити процесса не будут использовать общий контекст ввода-вывода. Это означает, что если вы хотите изменить приоритет ввода-вывода всех нитей процесса, то вам может потребоваться вызвать ioprio_set() для каждой нити. Идентификатор нити, требуемый для этой операции, можно получить с помощью gettid(2) или clone(2). Данные системные вызовы действительно работают только, если используется планировщик ввода-вывода, поддерживающий приоритеты ввода-вывода. В ядре 2.6.17 такой планировщик только один: Completely Fair Queuing (CFQ). If no I/O scheduler has been set for a thread, then by default the I/O priority will follow the CPU nice value ( setpriority(2)). Before Linux 2.6.24, once an I/O priority had been set using ioprio_set(), there was no way to reset the I/O scheduling behavior to the default. Since Linux 2.6.24, specifying ioprio as 0 can be used to reset to the default I/O scheduling behavior.Выбор планировщика ввода-вывода
Планировщики ввода-вывода устанавливаются в каждом устройстве через специальный файл /sys/block/<устройство>/queue/scheduler. Используемый в данный момент планировщик ввода-вывода можно посмотреть через файловую систему /sys. Например, следующая команда покажет список всех планировщиков, загруженных в ядро:$ cat /sys/block/sda/queue/scheduler noop anticipatory deadline [cfq]
Планировщик, работающий на устройстве (в примере sda), указан в скобках. Замена планировщика выполняется с помощью записи имени нового планировщика в этот файл. Например, следующая команда установит планировщик cfq для устройства sda:
$ su Password: # echo cfq > /sys/block/sda/queue/scheduler
Планировщик ввода-вывода с полностью справедливой очерёдностью (CFQ)
Начиная с версии 3 (т. н. CFQ Time Sliced) в CFQ реализованы уровни уступчивости ввода-вывода, подобно используемым в планировщике ЦП. Эти уровни уступчивости сгруппированы в три класса планирования, в каждом содержится один и более уровней приоритета:- IOPRIO_CLASS_RT (1)
- Класс ввода-вывода реального времени. Данному классу планирования назначен самый высокий приоритет по сравнению с другими: процессам с этим классом всегда предоставляется первоочередной доступ к диску. Поэтому данный класс следует использовать с осторожностью: одним процессом ввода-вывода реального времени можно затормозить все остальные. В классе реального времени есть 8 уровней данных класса (приоритетов), которые уточняют сколько времени нужно процессу для работы с диском для каждого сервиса. Самый высокий уровень приоритета реального времени имеет значение 0; самый низкий — 7. В будущем это может измениться и можно будет непосредственно задавать желаемую скорость обмена данными с диском.
- IOPRIO_CLASS_BE (2)
- Класс лучшего из возможного (best-effort) планирования, устанавливается по умолчанию для всех процессов, которым не назначен определённый приоритет ввода-вывода. Данными класса (приоритет) определяется пропускная способность ввода-вывода процесса. Уровни приоритета данного класса аналогичны значениям nice для ЦП (см. getpriority(2)). Уровень приоритета определяет первоочерёдность относительно других процессов с классом лучшего из возможного планирования. Уровни приоритета находятся в диапазоне от 0 (самый высший) до 7 (самый низший).
- IOPRIO_CLASS_IDLE (3)
- Класс свободного (idle) планирования. Процессы, работающие с этим уровнем, получат время для ввода-вывода только когда нет обмена с диском процессов с другими классами. Свободный класс не имеет данных класса. Обратите внимание, что процесс с этим классом приоритета может испытывать нехватку ресурсов, если процессы с более высокими приоритетами постоянно обращаются к диску.
Необходимые права для установки приоритетов ввода-вывода
Право на изменение приоритета процесса зависит от двух условий:- Владелец процесса
- Непривилегированный процесс может установить приоритет ввода-вывода только для процесса, чей реальный идентификатор совпадает с реальным или эффективным идентификатором вызывающего процесса. Процесс с мандатом CAP_SYS_NICE может изменять приоритет любого процесса.
- Требуемый приоритет
- Attempts to set very high priorities (IOPRIO_CLASS_RT) require the CAP_SYS_ADMIN capability. Up to Linux 2.6.24 also required CAP_SYS_ADMIN to set a very low priority ( IOPRIO_CLASS_IDLE), but since Linux 2.6.25, this is no longer required.
ДЕФЕКТЫ
glibc does not yet provide a suitable header file defining the function prototypes and macros described on this page. Suitable definitions can be found in linux/ioprio.h.СМ. ТАКЖЕ
ionice(1), getpriority(2), open(2), capabilities(7), cgroups(7) Файл Documentation/block/ioprio.txt в дереве исходного кода ядра LinuxПЕРЕВОД
Русский перевод этой страницы руководства был сделан Azamat Hackimov <[email protected]>, Dmitriy S. Seregin <[email protected]>, Yuri Kozlov <[email protected]> и Иван Павлов <[email protected]> Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на [email protected]5 февраля 2023 г. | Linux man-pages 6.03 |