Музыка

понедельник, 15 августа 2011 г.

Настройка некоторых параметров подсистемы vm в Linux

У меня есть быстрая дисковая подсистема RAID-10 из нескольких SCSI-дисков. Все приложения запущенные на современном ядре Linux не могут производить запись непосредственно на диск. Все, что им позволено — это запись в специальный кэш файловой системы, которая управляется менеджером виртуальной памяти ядра Linux (Linux kernel virtual memory manager), если кратко — подсистемой vm. Поскольку у меня высокоскоростной RAID-контроллер, то мне нужно уменьшить количество данных, хранимых в данном кэше. Как мне настроить подсистему виртуальной памяти в Linux для улучшения производительности? 




Каталог для настройки параметров подсистемы vm

Linux позволяет гибко настраивать подсистему vm. Однако, ее настройка является непростой задачей. Неправильные настройки могут негативно повлиять на общую производительность системы. Лучший путь это тщательное тестирование производимых настроек - модификация только одной из настроек за раз и слежение за системой некоторой время. Если производительность увеличилась — можете оставить настройки как есть, если нет - вернуть все назад.
Для настройки функционирования системы виртуальной памяти (подсистемы vm) ядра Linux используется содержимое директории /proc/sys/vm:

cd /proc/sys/vm
ls -l

total 0 Всего 0
-rw-r—r-- 1 root root 0 Oct 16 04:21 block_dump
-rw-r—r-- 1 root root 0 Oct 16 04:21 dirty_background_ratio
-rw-r—r-- 1 root root 0 Oct 16 04:21 dirty_expire_centisecs
-rw-r—r-- 1 root root 0 Oct 16 04:21 dirty_ratio
-rw-r—r-- 1 root root 0 Oct 16 04:21 dirty_writeback_centisecs
-rw-r—r-- 1 root root 0 Oct 16 04:21 drop_caches
-rw-r—r-- 1 root root 0 Oct 16 04:21 flush_mmap_pages
-rw-r—r-- 1 root root 0 Oct 16 04:21 hugetlb_shm_group
-rw-r—r-- 1 root root 0 Oct 16 04:21 laptop_mode
-rw-r—r-- 1 root root 0 Oct 16 04:21 legacy_va_layout
-rw-r—r-- 1 root root 0 Oct 16 04:21 lowmem_reserve_ratio
-rw-r—r-- 1 root root 0 Oct 16 04:21 max_map_count
-rw-r—r-- 1 root root 0 Oct 16 04:21 max_writeback_pages
-rw-r—r-- 1 root root 0 Oct 16 04:21 min_free_kbytes
-rw-r—r-- 1 root root 0 Oct 16 04:21 min_slab_ratio
-rw-r—r-- 1 root root 0 Oct 16 04:21 min_unmapped_ratio
-rw-r—r-- 1 root root 0 Oct 16 04:21 mmap_min_addr
-rw-r—r-- 1 root root 0 Oct 16 04:21 nr_hugepages
-r—r--r-- 1 root root 0 Oct 16 04:21 nr_pdflush_threads
-rw-r—r-- 1 root root 0 Oct 16 04:21 overcommit_memory
-rw-r—r-- 1 root root 0 Oct 16 04:21 overcommit_ratio
-rw-r—r-- 1 root root 0 Oct 16 04:21 pagecache
-rw-r—r-- 1 root root 0 Oct 16 04:21 page-cluster
-rw-r—r-- 1 root root 0 Oct 16 04:21 panic_on_oom
-rw-r--r-- 1 root root 0 Oct 16 04:21 percpu_pagelist_fraction
-rw-r—r-- 1 root root 0 Oct 16 04:21 swappiness
-rw-r--r-- 1 root root 0 Oct 16 04:21 swap_token_timeout
-rw-r--r-- 1 root root 0 Oct 16 04:21 vfs_cache_pressure
-rw-r--r-- 1 root root 0 Oct 16 04:21 zone_reclaim_mode

 

Настройка pdflush

Введите следующую команду, чтобы увидеть текущее время, через которое просыпается демон pdflush:
# sysctl vm.dirty_background_ratio
sysctl vm.dirty_background_ratio = 10
 
Как следует из вывода приведённой команды данный параметр равен 10, что представляет собой долю свободной памяти в процентах от общей памяти всей системы, по достижении которой демон pdflush начинает сбрасывать данные их дискового кэша на сам диск (данные в дисковом кэше, которые пока находятся в оперативной памяти, называются «грязными» и процесс их сброса на диск называется их «очищением», а демон pdflush существует именно для этого - прим.перев.). Однако, для быстрого RAID-массива эта величина великовата и может привести к слишком большому количеству сбрасываемых «грязных» страниц памяти. Увеличение данного параметра до 20 должно сократить количество сбросов информации из кэша на диск:
# sysctl -w vm.dirty_background_ratio=20

Параметр swappiness

Введите следующую команду, чтобы увидеть текущие значения по умолчанию:
# sysctl vm.swappiness
vm.swappiness = 60
Данный параметр показывает насколько агрессивно страницы оперативной памяти будут сбрасываться на раздел подкачки (swap-раздел). Его уменьшение замедляет этот процесс. Однако, если ваши системные процессы спят большую часть времени — вы можете попробовать освободить больше оперативной памяти путем его увеличения.
Например, вы можете увеличить параметр swappiness следующей командой:
# sysctl -w vm.swappiness=100

 

Прим. перев: Я решил немного пояснить полнее изменение данного параметра. Поскольку оперативная память работает гораздо быстрее, чем виртуальная (которая находится обычно на жестком диске), то она (оперативная) гораздо ценнее для системы и должна использоваться более полно. И значит если страницы памяти, занимаемые в данный момент каким-либо процессом не используются в течение продолжительного времени, то они просто зря занимают свое место в оперативной памяти и вполне могут быть использованы для чего-то другого. А значит они вытесняются в подкачку. Подчеркиваю, речь идет не обо всей памяти, которую занимает данный процесс, а об отдельных ее страницах. Если данные страницы вдруг опять потребуются приложению — процесс их перенесения из раздела подкачки обратно в оперативную память займет определенное время и будет выглядеть, как замедление работы приложения (ведь данные нужно обратно считать с диска в память). Поэтому оптимальное значение данного показателя подбирается экспериментальным путем. По умолчанию, это значение равно 40. Для десктопов его обычно рекомендуют уменьшать до 10, что приводит, наоборот, к тому, что большее количество памяти будет использоваться под приложения, даже если они ничего не делают большую часть времени. Такой режим работы больше соответствует настольным системам, когда у пользователя открыто много программ и он попеременно работает с несколькими из них. Если эти приложения не будут вытесняться в подкачку, а будут висеть в памяти — при переключении между ними не будет происходить никаких замедлений работы.

 

Параметр dirty_ratio

Введите следующую команду:
# sysctl vm.dirty_ratio
vm.dirty_ratio = 40

Значение 40 означает долю свободной системной памяти в процентах, по достижении которой процесс, ведущий запись на диск, инициирует запись «грязных» данных (напоминаю еще раз - «грязными» принято называть данные, хранящиеся в дисковом кэше и которые ожидают своего сброса на диск — прим.перев.). Изменить данный параметр можно следующей командой:

# sysctl -w vm.dirty_ratio=25

Внесение постоянных изменений в работу подсистемы vm


В оригинале было написано всего две строчки, я постараюсь немного раскрыть тему. Все параметры, которые вы устанавливаете командой sysctl — сохранятся только до перезагрузки системы и при новом запуске будут восстановлены параметры по умолчанию. Для того, чтобы ваши настройки пережили перезагрузку их нужно внести в файл /etc/sysctl.conf. Значение, которое нужно вносить в данный файл определяется очень просто. Допустим, файл, определяющий параметр swappiness имеет следующий путь: /proc/sys/vm/swappiness. То, что вносится в файл /etc/sysctl.conf, получается отбрасыванием из пути /proc/sys/ и заменой оставшихся знаков / на знак «.». То есть в данном случае получается: vm.swappiness. Этот путь годится для любых файлов-параметров работы системы, лежащих ниже /proc/sys.

1 комментарий:

Анонимный комментирует...

Большое спасибо а статью. Но "бубен" пишется всё-таки через "е".