В планировщике ввода/вывода CFQ (подробнее о планировщиках ввода/вывода можно почитать тут), который используется по умолчанию, начиная с ядра версии 2.6.18 (кстати, в последнем издании Understanding the Linux Kernel описано ядро 2.6.11, и там в соответствующей главе пишут про упреждающий конвейер - Anticipatory) есть интересная возможность вручную присваивать приоритет ввода/вывода конкретному процессу. На практике эти манипуляции осуществляются при помощи утилиты ionice.
Можно задать три класса ввода/вывода:
Можно задать три класса ввода/вывода:
3. Idle - получает доступ к диску только тогда, когда другие процессы не требуют ввода/вывода. При "нормальной" работе системы такой процесс не должен испытывать проблем с производительностью.
2. Best effort - класс "по умолчанию". Для вычисления приоритета ввода/вывода используется соответствующее значение nice планировщика ЦП для этого процесса. Таким образом, при помощи команд nice и renice вы, помимо косвенного изменения приоритета процесса в планировщике ЦП, косвенно же влияете на планировщик ввода/вывода.
1. Real time - процессы с этим классом имеют приоритетный доступ к жесткому диску вне зависимости от того, что происходит в системе. Вместе с классом 1 как и с классом 2 можно передать и параметр-приоритет (0-7).
2. Best effort - класс "по умолчанию". Для вычисления приоритета ввода/вывода используется соответствующее значение nice планировщика ЦП для этого процесса. Таким образом, при помощи команд nice и renice вы, помимо косвенного изменения приоритета процесса в планировщике ЦП, косвенно же влияете на планировщик ввода/вывода.
1. Real time - процессы с этим классом имеют приоритетный доступ к жесткому диску вне зависимости от того, что происходит в системе. Вместе с классом 1 как и с классом 2 можно передать и параметр-приоритет (0-7).
Первое, что приходит в голову глядя на классы - запуск некоторых задач в cron с пониженным приоритетом ionice -c3. Приоритет наследуется от родительского процесса, таким образом, все, что вы напишете после
#!/bin/bash
ionice -c3 -p$$
будет работать с приоритетом ввода/вывода Idle. Видимо, наилучшего прироста производительности можно добиться экспериментируя с ionice, когда вы вынуждены запускать одновременно несколько процессов с разными требованиями к дисковой подсистеме.
Подробнее:
- man-страница ionice(1)
- /usr/share/doc/kernel-doc-*/Documentation/block/ioprio.txt
Хотя не существует однозначного ответа на вопрос "Какой планировщик лучше?", и каждый раз необходимо тестировать конкретное приложение/систему, в общем случае ionice и конвейер CFQ не стоит применять для работы с /dev/xvdX в виртуальных машинах, где рекомендуется использовать планировщик NOOP, предоставив заботиться о планировании операций ввода/вывода Dom0. Для этого нужно добавить elevator=noop в строку параметров ядра grub:
title Red Hat Enterprise Linux Server (2.6.18-53.el5xen)
root (hd0,0)
kernel /vmlinuz-2.6.18-53.el5xen ro root=/dev/vol0/root rhgb quiet elevator=noop
initrd /initrd-2.6.18-53.el5xen.img
В итоге:
[root@vm02 ~]# dmesg | grep schedule
io scheduler noop registered (default)
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered
Впрочем, если вы помимо виртуальных дисков работаете с внешним хранилищем, где оптимальнее использовать планировщик "по умолчанию", то можно обойтись и /etc/rc.d/rc.local, меняя планировщик на уровне устройства:
echo noop > /sys/block/xvdX/queue/scheduler
Комментариев нет:
Отправить комментарий