В виду того, что заметка
Портеж Gentoo вызвала большой интерес, решил продолжить тему. На этот раз - вопросом оптимизации дисковых операций Linux.
Подавляющее большинство из нас сидит на ядрах 2.6
Но далеко не все в курсе, что настройки по умолчанию некоторых параметров в этой системе неоптимальны на десктопе.
/proc/sys/vm/swappiness
В этом псевдофайле хранится значение (в целых процентах), на сколько я понимаю (могу ошибаться), уровень свободной памяти, при котором система начнёт активно сбрасывать память в своп.
Значение по умолчанию -
60. Это очень много. Такой параметр заставляет Linux начинать интенсивный свопинг задолго до реальной десктопной потребности в этом. Как следствие - значительный хруст винтом и тормоза при относительно невеликой загрузке памяти.
code bash
# echo 10 > /proc/sys/vm/swappiness
и ваша система начнёт сбрасывать данные в своп когда это будет реально необходимо. Сейчас у меня программы занимают 550Мб, буфера - 94Мб, а кеш - 342Мб из 1010Мб доступной памяти. А своп занят только на 22Мб. Диск - простаивает...
/proc/sys/vm/vfs_cache_pressure
Врать не буду, навскидку не помню, за что отвечает этот файл. Давно разбирался, больше года назад. Но помню, что значение туда лучше записать побольше
code bash
# echo 1000 > /proc/sys/vm/vfs_cache_pressure
CFQ IO Shedule
Это шедулер ввода-вывода, старающийся обеспечить таймслайсы для каждого процесса. При используемом по умолчанию методе anticipatory, процесс, начавший интенсивно работать с диском, может не отдавать временные интервалы другим процессам. На десктопе это приводит к сильным субхективным тормозам. Пока кто-то "хрустит" диском, перерисовка GUI тормозит, программы не запускаются по минуте и т.д. и т.п. CFQ делает более равномерную загрузку.
Практика. Смотрим:
code bash
# cat /sys/block/hda/queue/scheduler
Если видим:
code text
noop [anticipatory] deadline cfq
меняем anticipatory на cfq:
code bash
# echo cfq > /sys/block/hda/queue/scheduler
Если cfq в ядре нет, то добавляем (menuconfig):
code text
Symbol: IOSCHED_CFQ [=y]
Prompt: CFQ I/O scheduler
Location:
-> Block layer
-> IO Schedulers
Можно также сразу:
code text
Symbol: DEFAULT_CFQ =y
Prompt: CFQ
Location:
-> Block layer
-> IO Schedulers
-> Default I/O scheduler (<choice> [=y])
После этого, система начинает более равномерно выделять доступ к диску всем фоновым процессам. Фактически это выражается в том, что машина совершенно перестаёт тормозить при 100% загрузке IO Wait (интенсивная работа с винтом, копирование больших файлов и т.п.) Можно в фоне запустить пару компиляций (Gentoo, привет!), копирование файла с винта на винт и при этом десктоп практически не тормозит там, где до этого буквально вставал колом