Похоже, вы уже попробовали многие вещи, которые я бы предложил вначале (настройка конфигурации подкачки, изменение расписаний ввода-вывода и т. Д.).
Помимо того, что вы уже пытались изменить, я бы посоветовал взглянуть на то, как изменить несколько мертвых настроек по умолчанию для поведения обратной записи виртуальной машины. Это управляется следующими шестью значениями sysctl:
vm.dirty_ratio
: Контролирует, сколько записей должно быть отложено для обратной записи, прежде чем она будет запущена. Обрабатывает обратную запись переднего плана (для каждого процесса) и выражается в виде целого процента ОЗУ. По умолчанию 10% оперативной памятиvm.dirty_background_ratio
: Контролирует, сколько записей должно быть отложено для обратной записи, прежде чем она будет запущена. Обрабатывает фоновую (общесистемную) обратную запись и выражается в виде целого процента ОЗУ. По умолчанию 20% оперативной памятиvm.dirty_bytes
: То же самоеvm.dirty_ratio
, за исключением выраженного как общее количество байтов. Либо это, либоvm.dirty_ratio
будет использоваться, в зависимости от того, что было написано до конца.vm.dirty_background_bytes
: То же самоеvm.dirty_background_ratio
, за исключением выраженного как общее количество байтов. Либо это, либоvm.dirty_background_ratio
будет использоваться, в зависимости от того, что было написано до конца.vm.dirty_expire_centisecs
: Сколько сотых долей секунды должно пройти, прежде чем начнется отложенная обратная запись, когда вышеуказанные четыре значения sysctl еще не сработают. По умолчанию 100 (одна секунда).vm.dirty_writeback_centisecs
: Как часто (в сотых долях секунды) ядро будет оценивать грязные страницы для обратной записи. По умолчанию 10 (одна десятая секунды).
Итак, со значениями по умолчанию, каждую десятую секунды ядро будет делать следующее:
- Запишите любые измененные страницы в постоянное хранилище, если они были последний раз изменены более секунды назад.
- Запишите все измененные страницы для процесса, если его общий объем измененной памяти, который не был записан, превышает 10% ОЗУ.
- Запишите все измененные страницы в системе, если общий объем измененной памяти, который не был записан, превышает 20% ОЗУ.
Таким образом, должно быть довольно легко понять, почему значения по умолчанию могут вызывать у вас проблемы, потому что ваша система может пытаться записывать до 4 гигабайт данных в постоянное хранилище каждую десятую секунды.
В настоящее время общее согласие состоит в том, vm.dirty_ratio
чтобы установить 1% ОЗУ и vm.dirty_background_ratio
2%, что для систем с менее чем 64 ГБ ОЗУ приводит к поведению, эквивалентному тому, что изначально планировалось.
Некоторые другие вещи, чтобы посмотреть на:
- Попробуйте
vm.vfs_cache_pressure
немного увеличить sysctl. Это контролирует, насколько агрессивно ядро восстанавливает память из кэша файловой системы, когда ему требуется оперативная память. По умолчанию 100, не опускайте его на что - нибудь ниже 50 (вы будете получать действительно плохое поведение, если вы идете ниже 50, в том числе условия OOM), и не поднимать его гораздо больше, чем около 200 (гораздо выше, и ядро будет тратить время, пытаясь восстановить память, которую он действительно не может). Я обнаружил, что увеличение его до 150 на самом деле заметно улучшает скорость отклика, если у вас достаточно быстрое хранилище. - Попробуйте изменить режим переполнения памяти. Это можно сделать, изменив значение
vm.overcommit_memory
sysctl. По умолчанию ядро будет использовать эвристический подход, чтобы попытаться предсказать, сколько ОЗУ он может выделить. Установка этого значения в 1 отключает эвристику и заставляет ядро действовать так, как будто оно имеет бесконечную память. Если установить значение 2, ядро не будет выделять больше памяти, чем общий объем пространства подкачки в системе, плюс процент фактической оперативной памяти (контролируемойvm.overcommit_ratio
). - Попробуйте настроить
vm.page-cluster
sysctl. Это контролирует, сколько страниц будет выгружено или выгружено за раз (это логарифмическое значение base-2, поэтому значение по умолчанию 3 переводит в 8 страниц). Если вы на самом деле меняете местами, это может помочь повысить производительность обмена страницами.