Назад | Перейти на главную страницу

Как дать указание Linux не выгружать горячие страницы файлов из mmaped?

У меня есть сервер, на котором я запускаю рабочие процессы, которые обслуживают довольно большие файлы "словаря" только для чтения (всего ~ 8 ГБ). Тесты показали, что они активно обращаются к страницам в этих файлах только размером около 1 ГБ. На том же сервере я запускаю другой процесс, который последовательно читает огромный файл, объединяет в него некоторые обновления и записывает результат в новую версию этого огромного файла. На сервере нет никакой другой важной деятельности, кроме этого процесса «слияния» и «рабочих» процессов. Поэтому обычно рабочие должны быть привязаны к ЦП, а слияние должно быть привязано к диску. Но я вижу, что рабочие постоянно задыхаются от серьезных ошибок страниц. Слияние использует около 20 ГБ RSS, а машина имеет 48 ГБ. Есть 4 рабочих. У них есть 2 ГБ RSS каждый и только 600 МБ (вместо ожидаемых 1 ГБ горячих страниц). Каким-то образом остальная часть памяти в основном используется кешем fs. Есть ли способ «приоритизировать» горячие страницы моих файлов mmaped в памяти? Я пробовал madvise (MADV_WILLNEED), но, похоже, это не помогает. Может есть решение с cgroups или sysctls?

$ free
             total       used       free     shared    buffers     cached
Mem:      49324064   48863392     460672          0      22520   25409896
-/+ buffers/cache:   23430976   25893088
Swap:            0          0          0

$ uname -a
Linux dev-kiwi02 3.2.0-25-server #40-Ubuntu SMP Fri May 25 13:12:35 UTC 2012 x86_64 GNU/Linux

P.S. Уже спрашивал об этом в StackOverflow, но похоже, что ServerFault более подходит.

Вам, вероятно, понадобится mlock (), а не madvise (). Madvise слишком «слабый»; mlock блокирует память в ядре. Предполагая, что у вас достаточно оперативной памяти и вы блокируете только «горячие» страницы (а не все 8 ГБ), это не должно быть проблемой для вашей настройки.

Еще одно решение, которое может показаться нелогичным: отключить подкачку. Ваша машина имеет 48 ГБ; вычтите 4 воркера, общие данные и вашу ОС, и у вас останется> 35 ГБ. Вы пишете, что ваше слияние последовательно читает файл и вставляет несколько записей; поэтому я предполагаю, что вам не нужно хранить большой файл в памяти, но вы также можете записывать его последовательно; вам нужно только загрузить все обновления в память, что не должно быть проблемой.