Сколько SWAP вы бы дали установке CentOS на двухъядерном Quad Core XEON с 16 ГБ ОЗУ, на котором будет запущен веб-сайт php с серверной частью mysql - средняя / большая нагрузка?
Не более одного-двух гигов - вам нужно немного подкачки, на всякий случай и потому, что это помогает работать немного лучше, но если вы когда-нибудь дойдете до точки, когда вы сильно меняете местами, машина пойдет быть бесполезным - и в реальной катастрофической ситуации вам на самом деле лучше с меньшим пространством подкачки, потому что тогда вы вызовете убийцу OOM раньше, чем позже.
Прошу прощения за очень длинный ответ. Я давно хотел разместить это где-нибудь доступным!
TL; DR; Теоретически ответ был бы «вероятно, не меньше, чем общий объем резидентной памяти, которую хотят использовать все ваши приложения».
Я постараюсь объяснить, если ты останешься со мной ..
Немного о виртуальной памяти
Я чувствую, что в наши дни существует распространенное заблуждение относительно того, какова ценность свопа и для чего он предназначен. Часто считается, что под свопом подразумевается «резервный банк» для памяти, когда у вас не хватает памяти. Да, отчасти это правда, но ядро не хочет использовать ваш своп в качестве резервного банка. Дополнительно ядро никогда не хочет обращаться к диску для получения данных, которые вам нужны!
В области приложения ядро будет хранить в памяти несколько вещей.
Для управления памятью выделение памяти поддержанный в той или иной форме с помощью поддерживающего устройства.
Файл поддерживается память - это память, которая была получена из файла и на типичной операционной системе составляет подавляющее большинство распределения памяти в системе. Он включает в себя файлы, такие как общие библиотеки, которые были загружены, файлы, считанные с диска и сохраненные в кэше страниц, и файлы, отображаемые с диска (фактически, ядро не делает различий между страницами между файлами в кеше страниц и файлами, отображенными в нем, поскольку по существу тоже самое).
Самое замечательное в этой памяти с точки зрения ядра - это то, что она одноразовая, то есть должна иметься возможность сбросить эти страницы, если вам нужна память для чего-то еще, и это именно то, что делает кеш страниц, если память внезапно становится требованием.
Анонимно поддержано память - другое дело. Память из этого региона анонимна, потому что на диске нет файла, который действительно содержит эти данные. Обычно он состоит из стека приложения, кучи, всего в tmpfs и данных mmapped, которые являются частными и были изменены (поскольку он не может синхронизировать эти данные с диском). Поскольку в файловой системе просто нет допустимого файла, в который можно было бы записать эти страницы в случае их изменения, анонимно поддерживаемая память поддерживается носителем подкачки.
Теперь ядро знает, что при нехватке памяти гораздо дешевле отказаться от файловой памяти и анонимно отображаемой памяти, потому что анонимные данные имеют гораздо более высокий шанс быть «грязными», чем данные с файловой поддержкой, фактически по умолчанию ядро оценивает память с анонимным резервированием как в 80 раз более ценную, чем память с файловой поддержкой, и именно это на самом деле делает модификатор swappiness в Linux (см. этот пост Вот если вы хотите знать, что именно меняет параметр swappiness).
Худший сценарий
Наихудший сценарий, когда сервер выходит из-под контроля и OOMing, основан на том факте, что он тратит слишком много времени на обработку запросов ввода-вывода, чем на выполнение запросов на выделение памяти. Есть два условия, которые могут вызвать этот критерий.
Первый - это проблема, о которой обычно думают. То есть, поскольку большая часть памяти находится внутри подкачки, нужно выгрузить анонимную память из ОЗУ, вернуть ее в подкачку, затем взять что-то из подкачки и поместить в реальную ОЗУ. Эта операция очень дорогостоящая и замедляет работу машины до такой степени, что может стать неустранимой ситуацией (поскольку в очереди для запросов страниц стоит больше материала, чем может быть обслужено с помощью ввода-вывода).
Второй вариант менее важен, но не менее важен. Если вы выделите почти всю свою память для реальных данных приложения - долго не протянете. Почти каждое приложение для работы полагается на чтение файлов из файловой системы, это может быть связано с тем, что некоторые инструкции находятся в разделяемой библиотеке или потому, что вам нужно прочитать /etc/resolv.conf для вызова библиотеки или любой другой цели. Совершенно правдоподобно остановить работу операционной системы - при этом у вас достаточно памяти для размещения всех ваших приложений, но, поскольку вы ставите в очередь так много запросов ввода-вывода, ничто не может быть завершено должным образом.
Что ядро хочет делать с вашим свопом
Ядро хочет использовать ваш своп, чтобы избавиться от страниц, которые тратят память, чтобы оно могло использовать эту память для чего-то другого.
По сути, при нормальной работе ядро любит агрессивно заполнять кеш страницы данными, прочитанными с диска, это означает, что оно не будет читать диск для тех же данных. Это хороший дизайн, который может значительно сократить количество операций ввода-вывода. Возможно, у вас есть какое-то приложение, сидящее в памяти, которое спит 3 дня, просыпается, выполняет кучу работы, а затем спит еще 3 дня.
Что ядро хочет сделать с этими данными, так это заменить их, чтобы освободить место для активности файловой системы, поскольку у вас гораздо больше шансов на самом деле использовать эти страницы чаще, чем страницы, которые вы используете для своего приложения. Своппинг в этом смысле может быть транзакцией 16 Кбайт для вашего носителя подкачки, что вы вряд ли должны почувствовать, но взамен вы освободили 16 Кбайт памяти, которая мог использоваться для хранения четырех файлов данных.
Для чего ядро не хочет использовать своп
Ядро определенно не хочет использовать ваш своп для выделения большего количества анонимной памяти путем подкачки другой анонимной памяти, это ситуация, о которой люди беспокоятся больше всего, и это правильно.
Тем не менее, я должен указать, что если вы выделили так много памяти, что у ядра нет другого выбора, кроме как сделать это, это проблема конфигурации системных администраторов, а не самого ядра - оно просто пытается сделать все возможное с помощью варианты, которые вы ему дали!
Если у вас большой объем свопа, увеличиваете ли вы вероятность его использования?
Нет! Если у вас 1 Гб оперативной памяти и 4G подкачки, вероятность обмена данными не превышает 80%! Ядро хочет использовать своп только тогда, когда страницы в памяти можно лучше обслуживать, делая что-то еще!
Выгодно ли вообще не использовать своп
Я бы никогда этого не сделал. Перестановка позволяет оператору избавиться от памяти, которая вам нужна, но никогда не используется. Если у вас нет свопа, вы просто поглотите память, и вы никогда не вернетесь, для чего вы можете увидеть значительное улучшение производительности, если вместо этого разрешите, скажем, кеш страницы.
Какой лучший своп?
Теоретически выясните, сколько резидентной памяти + 20% для средств защиты, таких как вызовы реентерабельной библиотеки, которые должны выделять память из кучи, - затем установите это значение для свопа. Это (в любом случае теоретически) позволило бы операционной системе выгружать всю анонимную память, если бы ей пришлось освободить место для чего-то более полезного.
Если я получу возможность ядра поменять все, что опасно, не так ли?
Помните, что ядро не хочет менять местами, чтобы освободить место для более анонимного распределения памяти, оно будет заменять только неиспользуемые страницы, чтобы отдать предпочтение чему-то другому, которое вместо этого будет лучше использовать пространство.
Если вы меняете местами анонимную память только для выделения из большего количества анонимной памяти, значит, вы делаете что-то не так и вам нужно больше ОЗУ или все равно перенастроить стек приложения.
Сколько оперативной памяти вам понадобится
Разумеется, вам необходимо предоставить достаточно ОЗУ для запуска всех ваших приложений, но вам, вероятно, следует разрешить дополнительные 2 ГБ ОЗУ для заполнения кеша страниц - может быть, больше. Кэш страниц делает ваш компьютер намного быстрее, а ваши диски служат дольше. Если вы думаете о запуске веб-сервера, наличие еще большего количества кеша страниц - хорошая идея из-за огромного количества статического контента, который вы можете извлекать и повторно использовать из кеша страниц, который будет обслуживаться (если пропускная способность вашего веб-сервера составляет 5 МБ / с, вы действительно не хотите, в конце концов, получать тот контент со скоростью 5 МБ / с, который вы генерируете со своего диска!).
Что делать, если вы действительно не доверяете Linux в правильной подкачке
Если вы действительно обеспокоены, вы можете выделить больше памяти, чем у вас есть:
Как лучше всего настроить память для моего приложения
Производитель рекомендует другую конфигурацию.
Вместо этого послушайте это. Некоторые приложения написаны таким образом, что они сознательно вызывают ядро, чтобы их страницы были активными поверх всех остальных. Честно говоря, это неприятный трюк, но он нарушает способность ядра беспрепятственно управлять памятью, когда это происходит. Если ваш поставщик сообщает вам подробности, он, вероятно, попадает в эту категорию и вместо этого слушает то, что они говорят.
В итоге
Ядро обычно очень хорошо справляется с управлением виртуальной памятью. Почти всегда ваше приложение выделяет больше памяти, чем вы могли бы надеяться на работу, и именно это вызывает OOM.
Раньше своп использовался как «запасная память», но это больше не его основная цель, поэтому не думайте об этом. Вместо этого помните, что ваше ядро, вероятно, лучше всех знает, для чего оно хочет использовать вашу память. Дайте ему возможность принимать эти решения, и вы выиграете от общего повышения производительности.
Из документа «Рекомендации по развертыванию Oracle 10g Server на Red Hat® Enterprise Linux® 5».
Oracle предоставляет общие рекомендации относительно размера свопа в MetaLink Note 169706.1. Эти рекомендации могут привести к созданию очень большого пространства подкачки в системах с большим объемом памяти. Очень большой размер подкачки может привести к снижению производительности системы и может быть решен путем уменьшения пространства подкачки. Red Hat не рекомендует выделять для подкачки более 4 ГБ в Red Hat Enterprise Linux 5.
Таким образом, для 16 ГБ у вас должно быть не более 4 ГБ подкачки.
PS. Также стоит отметить, что вызванный oom
почти всегда лучше, чем непригодный для использования процесс подкачки, использующий всю полосу ввода-вывода.
Текущие рекомендации CentOS Swap используют формулу:
M = Amount of RAM in GB, and S = Amount of swap in GB, then
If M < 2
S = M *2
Else
S = M + 2
Таким образом, для 16G размер свопа должен быть 18G.
Видеть http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-swapspace.html
Из того, что я помню из документации Linux: если ваш RAM больше 2 ГБ, вы делаете swap = (ramSize + 2). Если меньше, то вы делаете swap = (ramSize * 2)
Я нашел для вас этот документ, он должен помочь вам принять это решение, вот он: Что такое пространство подкачки?, но ни один из приведенных выше ответов неверен