Есть ли способ указать ядру Linux использовать только определенный процент памяти для буферного кэша? Я знаю, что /proc/sys/vm/drop_caches
можно использовать для временной очистки кэша, но есть ли какие-либо постоянные настройки, которые препятствуют его росту до, например, более 50% основной памяти?
Причина, по которой я хочу это сделать, заключается в том, что у меня есть сервер с OSD Ceph, который постоянно обслуживает данные с диска и в течение нескольких часов может использовать всю физическую память в качестве буферного кеша. В то же время мне нужно запускать приложения, которые будут выделять большой объем (несколько десятков ГБ) физической памяти. Вопреки распространенному мнению (см. Советы, данные почти по всем вопросам, касающимся кеш-буфера), автоматическое освобождение памяти путем удаления записей чистого кеша не происходит мгновенно: запуск моего приложения может занять до минуты, когда кеш-буфер заполнен ( *), хотя после очистки кеша (использования echo 3 > /proc/sys/vm/drop_caches
) одно и то же приложение запускается практически мгновенно.
(*) В течение этой минуты запуска приложения происходит сбой в новой памяти, но он тратит 100% своего времени в ядре, согласно Vtune в вызываемой функции pageblock_pfn_to_page
. Эта функция, похоже, связана с уплотнением памяти, необходимым для поиска больших страниц, что заставляет меня поверить, что проблема заключается в фрагментации.
Ответы:
Если вы не хотите абсолютного ограничения, а просто заставляете ядро быстрее очищать буферы, вы должны посмотреть на
vm.vfs_cache_pressure
Диапазон от 0 до 200. Переместите его к 200 для более высокого давления. По умолчанию установлено значение 100. Вы также можете проанализировать использование памяти с помощью
slabtop
команды. В вашем случае,dentry
и*_inode_cache
значение должно быть высоким.Если вы хотите абсолютный предел, вы должны посмотреть вверх
cgroups
. Поместите сервер OSD Ceph в cgroup и ограничьте максимальный объем памяти, который он может использовать, установивmemory.limit_in_bytes
параметр для cgroup.Ссылки:
[1] - Настройка ядра GlusterFS Linux
[2] - Руководство по управлению ресурсами RHEL 6
источник
limit_in_bytes
Кажется, это делает cgroup с множеством. Благодарность!vfs_cache_pressure
очищает только кэш-память и иноды и не имеет ничего общего с буферным кешем.vfs_cache_pressure
выше100
может помочь, если у вас недостаточно оперативной памяти для вашей рабочей нагрузки. Это уменьшит использование оперативной памяти, но приведет к снижению производительности ввода-вывода в целом.Я не знаю об A%, но вы можете установить ограничение по времени, чтобы оно сбрасывалось через x минут.
Сначала в терминале
Очистить текущие кэши.
Сделайте это
cron-job
нажатием Alt-F2, напечатайтеgksudo gedit /etc/crontab
, затем добавьте эту строку внизу.Это очищает каждые 15 минут. Вы можете установить 1 или 5 минут, если действительно хотите, изменив первый параметр на * или * / 5 вместо * / 15.
Чтобы увидеть вашу свободную оперативную память, кроме кеша:
источник
3 > drop_caches
включает в себя поведениеsync
Я думаю, что ваша догадка в самом конце вашего вопроса на правильном пути. Я подозреваю, что A, NUMA-осведомленное распределение памяти перемещает страницы между процессорами, или B, более вероятно, код дефрагментации прозрачных огромных страниц, пытающихся найти смежные, выровненные области.
Огромные страницы и прозрачные огромные страницы были определены как для заметных улучшений производительности на определенных рабочих нагрузках, так и для того, чтобы потреблять огромное количество процессорного времени без особой выгоды.
Это помогло бы узнать, какое ядро вы используете, содержимое / proc / meminfo (или, по крайней мере, значения HugePages_ *.), И, если возможно, больше из графа vtune profiler, ссылающегося на pageblock_pfn_to_page ().
Также, если вы потворствуете моим догадкам, попробуйте отключить дефрагментацию огромный страницы с помощью:
(это может быть вместо этого, в зависимости от вашего ядра :)
Наконец, это приложение использует много десятков гигабайт оперативной памяти, что вы написали? Какой язык?
Поскольку вы использовали термин «сбой в страницах памяти», я полагаю, вы достаточно знакомы с рабочим дизайном и виртуальной памятью. Я изо всех сил пытаюсь представить себе ситуацию / приложение, которое будет работать так агрессивно, что не будет читать при большом количестве операций ввода-вывода - почти всегда из буферного кэша, который вы пытаетесь ограничить.
(Если вам интересно, посмотрите флаги mmap (2), такие как MAP_ANONYMOUS, MAP_POPULATE и mincore (2), которые можно использовать, чтобы увидеть, какие виртуальные страницы на самом деле имеют отображенную физическую страницу.)
Удачи!
источник
Если Ceph OSD - это отдельный процесс, вы можете использовать cgroups для управления ресурсами, используемыми процессом:
Создайте cgroup с именем наподобие group1 с ограничением памяти (например, 50 ГБ, поддерживаются другие ограничения, например, CPU, в примере также упоминается CPU):
Затем, если ваше приложение уже запущено, перенесите приложение в эту группу:
Или запустите ваше приложение в этой группе:
источник
tuned - это динамический адаптивный демон настройки системы, который динамически настраивает параметры системы в зависимости от использования.
Смотрите соответствующую документацию и файлы конфигурации.
Дополнительная информация
Команда sync очищает буфер, т. Е. Принудительно записывает все неписанные данные на диск, и может использоваться, когда кто-то хочет быть уверен, что все записано безопасно. В традиционных системах UNIX в фоновом режиме выполняется программа обновления, которая выполняет синхронизацию каждые 30 секунд, поэтому обычно нет необходимости использовать синхронизацию. В Linux есть дополнительный демон bdflush , который чаще выполняет несовершенную синхронизацию, чтобы избежать внезапного зависания из-за интенсивного дискового ввода-вывода, который иногда вызывает синхронизация .
Под Linux bdflush запускается обновлением. Обычно нет причин для беспокойства, но если по какой-то причине bdflush умрет, ядро предупредит об этом, и вы должны запустить его вручную ( / sbin / update ).
источник