Ну... это блог, что ещё ожидать от блога?

среда, 13 октября 2010 г.

Энергосберегающая работа дисков в OS Linux

Окт 11 2010 Linux 2.6.35

Долго и много гуглив, не один день пытаясь сообразить как решить проблемму постоянной активности диска в ОС Linux c ФС Ext4, я найдя в гугле ещё одну веб-подшивку почтовой рассылки про Linux в который как мне показалось были в основном ответы на этот вопрос, грамотных людей, специалистов, я найдя сейчас ответ самостоятельно - разочаровался как в этих "специалистах" так и в этом всемогущем гугле.

Я переживаю сейчас шок разочарования в англоязычном гугле - до этого было нормально что где-то там в просторах англоязычного комьпьютерного мира всегда где-то есть, далеко или близко, ответ на любой проблемный вопрос про компьютеры - теперь это не так. Впрочем, нужно было с самого начала до конца прочитать Documentation/laptops/laptop-mode.txt, там всё написано. Кстати у меня при моих настройках, установка в echo 5 > proc/sys/vm/laptop_mode делает диск активным, хммм... хотя должно быть наоборот.

На самом деле информацию я нашёл где она и была всё это время, в:

[KERNEL_TREE]/Documentation/filesystems/ext4.txt
[KERNEL_TREE]/Documentation/sysctl/vm.txt
[KERNEL_TREE]/Documentation/laptops/laptop-mode.txt

Теперь диск в моём ноутбуке не будет так много перегреваться до обычных 42-48 градусов цельсия. Теперь он будет перегреваться до 38 градусов. Т.е. проще говоря если у вас ноутбук и ФС на диске Ext4 и у вас всё не получается отправить диск в режим готовности аkа standby такими командами как:

hdparm -y /dev/sda или hdparm -S 3 /dev/sda

и после перехода в режим готовности диск почти сразу снова раскручивается хотя вы и разобрались уже с Advanced Power Managment диска командой:

hdparm -B 100 /dev/sda

то, вам конечно захотелось разобраться в чём тут дело и вы полезли в гугл за ответом а оказались здесь, то вы можете быть уверены что ваши проблеммы в прошлом. Надёюсь что и мои там. Да, и везде где фигурирует /dev/sda[5] имеется в виду мой диск, ваш может соответствовать другому файлу устройства и другому номера раздела.


Для начала ответы на ЧАВО которы я сам задавал гуглу:

В: Как узнать какой процесс работает с диском?
О: # echo 1 > /proc/sys/vm/block_dump
# cat /proc/kmsg

В: Как снизить количество обращений к диску?
О: # echo 10 > /proc/sys/vm/swappiness
# echo 100000 > /proc/sys/vm/dirty_expire_centisecs
# echo 100000 > /proc/sys/vm/dirty_writeback_centisecs

Как я понял это (100000) значит что секунда здесь равна 100 единицам а моё значение это 1000 секунд. А swappiness==10 вроде бы это значит что запись в раздел подкачки начнётся при 10% оставшейся свободной ОЗУ.

В: Как узнать текущий режим питания диска?
О: # while [ 0 ] ; do hdparm -C /dev/sda ; sleep 3 ; done

ИЛИ

#!/bin/ash
wt=3
at=0
st=0
it=0
printt=10

app="/sbin/hdparm"
disk="/dev/sda"
key="-C"
command="$app $key $disk"

while [ 0 ] ; do
$command | grep "standby" 1>/dev/null 2>/dev/null
if [ $? -eq 0 ] ; then
let "st=st+wt"
else
let "it=it+wt"
fi
sleep $wt
let "at=at+wt"
dirty=`cat /proc/meminfo | awk '/Dirty:/{print($2)}'`
if [ $at -gt $printt ] ; then
echo "All time: $at Stby time: $st Act time: $it Dirty: $dirty kB"
fi

done


В: Что такое грязная (dirty) память?
О: Грязная значит "возможно её необходимо записать на диск или в своп".
Нужно больше действий что бы высвободить эту память. Примерами могут
быть файлы которые ещё не были записаны. Они не записываются в память
слишком скоро в порядке уменьшения ввода/вывода (этот пассаж часть
перевода, там так и написано). Для примера, если вы пишите логи,
может быть лучше до того как вы закончите лог, до отправки его на
диск (тоже самое).


Выдержки из Documentation/sysctl/vm.txt

/proc/sys/vm/dirty_background_bytes (прим. значение: 0)

Содержит количество "грязной" памяти при котором фоновый демон обратной записи pdflush начнёт обратную запись.

Если dirty_background_bytes указан, то dirty_background_ratio становится функцией к этому значению т.е. (dirty_background_bytes / размер "загрязняемой" системной памяти).

/proc/sys/vm/dirty_background_ratio (прим. значение: 10)

Содержит, в виде процента от совокупной системной памяти, число страниц памяти, при котором демон обратной записи pdflush начнёт запись "грязных" данных.

/proc/sys/vm/dirty_bytes (прим. значение: 0; также, установка в 9000 запускает диск)

Содержит количество "грязной" памяти при котором процесс генерирующий дисковую запись самостоятельно начнёт обратную запись.

Если dirty_bytes установлено, dirty_ratio становится функцией к этому значению (dirty_bytes / размер "загрязняемой" системной памяти).

Прим: минимальное допустимое значения для dirty_bytes это две страницы (в байтах (октетах)); любое значение меньшее чем этот лимит, будет проигнорировано и будет востановлена прежняя конфигурация.

/proc/sys/vm/dirty_ratio (значение: 0; также, установка в 50, диск не запускает)

Содержит, в виде процента от общей системной памяти, число страниц при котором процесс который генерирует дисковую запись самостоятельно начнёт запись "грязных" данных.

/proc/sys/vm/dirty_expire_centisecs

Этот подстроечный параметр используется для определения того когда грязные данные уже достаточно старые чтобы подходить для записи демоном pdflush. Он выражается в 100'тых секунды. Данные которые были грязными в-памяти дольше чем этот интервал будут записаны в следующий раз когда демон pdflush проснётся.

/proc/sys/vm/dirty_writeback_centisecs

Демон обратной записи pdflush будет периодически просыпаться и записывать "старые" данны на диск. Этот подстроечный параметр выражает интервал между этими пробуждениями, в 100'тых секунды.

Установив его в ноль совсем отменяет периодичесие обратные записи.(прим. Что также приводит к активности диска и нагрузке в 100% на ЦПУ, вроде бы.)


Теперь что касается опций монтирования ФС Ext4.

commit=чиссек (по умолчанию равно 5 секундам)

ФС Ext4 можно указать синхронизировать все её данные и метаданные каждые 'чиссек' секунд. Число по умолчанию 5 секунд. Это значит что если у вас был сбой электроснабжения, вы утратите к максимум последние 5 секунд работы (ваша ФС не будет повреждена, благодаря журналированию). Это номинальное значение (или более меньшее значение) вредит производительности, но это хорошо для сохранности данных. Установка значения в 0 будет иметь тот же эффект, оставив его номинальное значение (5 секунд). Установка его в очень большое значение улучшит производительность.

inode_readahead_blks=число (кратное 2, напр. 16384)

Этот подстроечный праметр контролирует максимально число айнодов таблицы блоков, которое алгоритм предчтения таблицы айнодов ФС ext4, предсчитает в буфер кеша. Номинально значение равно 32 бкокам.

barrier=>0|1< или nobarrier

Это вкл./выкл. использование барьеров записи в коде jbd. barrier=0 выключает, barrier=1 включает. Также необходим стэк ввода/вывода способный работать с барьерами, и если jbd получит ошибку при записи барьера, это будет отменено с выдачей предупреждения. Барьеры записи принуждают к правильному упорядочиванию на диск журнальных (пакетных) записей, делая изменчивые дисковые кеши записи безопасными для использования, за счёт расплаты в виде производительности. Если ваши диски запитываются от батарей тем или иным образом, отключение барьеров может неопасно улучшить производительность. Опции монтирования "barrier" и "nobarrier" также могут быть использованы для включения или отключения барьеров, для согласованости с другими опциями монтирования ext4.



Суммируя, можно сказать что есть два типа ФС - не журналируемые и журналируемые. Журналирование используется для увеличения сохранности данных. ФС Ext3/4 это журналируемые файловые системы и это значит что при использовании на мобильных устройствах или на устройствах где необходимо обеспечить наименьшее энергопотребление дисками, необходимо производить монтирование разделов с таким настройками ФС при которых диск будет активным наименьшее количество времени. Например команда представленая ниже, перемонтирует уже смонтированый раздел /dev/sda5 c новыми опциями которые при использовании команды mount вида mount /dev/устройство (а не вида mount /dev/устройство /точка_монтировния) будут добавлены к опциям из файла /etc/fstab.

mount -o remount,rw,commit=600,inode_readahead_blks=16384,nobarrier /dev/sda5

Где commit`ы будут происходить каждые 10 минут (60 сек * 10 == 600), где в кеш ФС будет считываться 16384 блоков, и где отключено использование барьеров как и рекомендовано(?) в Documentation/filesystems/ext4.txt при питании от батарей.

Например мой нотбук с установленой ОС Ubuntu 10.04 при загруженом рабочем столе и одной консоли при холостой работе в течении 4995 секунд из них находился в режиме пониженого энергопотребления 4635 секунд (92.79%) а был активен в течении 360 секунд (7.20%). Такой результат был достигнут при опциях монтирования ФС Ext4 rw,errors=remount-ro,commit=600,inode_readahead_blks=16384,nobarrier, и при настройках /proc/sys/vm/* равных: swappiness == 60; dirty_expire_centisecs == 100000; dirty_writeback_centisecs == 1500 (опля ... должно было быть 100000); dirty_ratio == 50; dirty_background_bytes == 0; dirty_background_ratio == 10; dirty_bytes == 0;