Окт 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;
Ну... это блог, что ещё ожидать от блога?
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий