Сколько SWAP вы бы дали установке CentOS на двухъядерный процессор QuE Core XEON с 16 ГБ ОЗУ, который будет работать на веб-сайте php с бэкэндом mysql - средней / высокой нагрузкой?
Сколько SWAP вы бы дали установке CentOS на двухъядерный процессор QuE Core XEON с 16 ГБ ОЗУ, который будет работать на веб-сайте php с бэкэндом mysql - средней / высокой нагрузкой?
Ответы:
Не больше, чем концерт или два - вы хотите немного подкачки, на всякий случай и потому, что это помогает немного лучше работать, но если вы когда-нибудь дойдете до точки, где вы сильно поменялись местами, машина будет работать быть бесполезным - и в реальной катастрофической ситуации вам на самом деле лучше с меньшим пространством подкачки, потому что тогда вы активируете OOM killer раньше, чем позже.
Я прошу прощения за очень длинный ответ. Я давно хотел положить этот материал где-нибудь на некоторое время!
TLDR; Теоретически, ответом будет «вероятно не меньше, чем общий объем резидентной памяти, которую хотят использовать все ваши приложения»
Я постараюсь объяснить, если ты останешься со мной ..
Немного о виртуальной памяти
Я чувствую, что в наши дни существует распространенное заблуждение относительно ценности свопа и его цели. Часто считается, что подкачка подразумевается как «резервный банк» для памяти, когда у вас заканчивается память. Да, это отчасти верно, но ядро не хочет использовать ваш своп в качестве резервного банка . Кроме того, ядро никогда не хочет вызывать диск, чтобы получить данные, которые вы ищете!
В прикладном пространстве есть несколько вещей, которые ядро будет хранить в памяти.
Для целей управления памятью, выделение памяти поддерживаются в той или иной форме , с помощью опорного устройства.
Память с файловой поддержкой - это память, полученная из файла, и в типичных операционных системах она занимает подавляющее большинство памяти в системе. Он включает в себя такие файлы, как общие библиотеки, которые были загружены, файлы, считанные с диска и сохраненные в кэше страниц, и файлы, отображаемые с диска (фактически ядро не делает различий между страницами в кэше страниц и файлами, отображенными по существу, так как тоже самое).
Отличительной особенностью этой памяти с точки зрения ядра является то, что она одноразовая, то есть должна быть возможность выгрузить эти страницы, если вам нужна память для чего-то другого, и это именно то, что делает кэш страниц, если память внезапно становится требованием.
Анонимно поддерживаемая память - это другое дело. Память из этого региона является анонимной, потому что на диске нет файла, который бы на самом деле содержал эти данные. Обычно он состоит из стека приложения, кучи, чего-либо в tmpfs и mmapped-данных, которые являются частными и модифицированы (поскольку он не может синхронизировать эти данные обратно на диск). Поскольку в файловой системе просто нет действительного файла для записи этих страниц в случае их изменения, память с анонимным резервным копированием поддерживается носителем подкачки.
Теперь ядро знает, что при нехватке памяти гораздо дешевле обходить память с файловой поддержкой анонимно отображаемой памяти, потому что анонимные данные имеют гораздо большую вероятность быть «грязными», чем данные с файловой поддержкой, фактически по умолчанию ядро оценивает память с анонимным резервированием как в 80 раз более ценную, чем память с файловым резервированием, и именно это и делает модификатор swappiness в linux (см. этот пост здесь, если вы хотите узнать, что именно изменяет параметр swappiness).
Худший вариант развития событий
В худшем случае, когда сервер выходит из-под контроля и OOMing основывается на том факте, что он тратит слишком много времени на обработку запросов ввода-вывода, чем на выполнение запросов на выделение памяти. Есть два условия, которые могут ссылаться на этот критерий.
Первый - это обычно думаемая проблема. То есть, поскольку большая часть памяти находится внутри свопинга, необходимо выгрузить анонимную память из ОЗУ, поместить ее обратно в своп, затем извлечь что-то из свопа и поместить в реальную оперативную память. Эта операция является очень дорогой, замедляя работу компьютера до такой степени, что она может стать неисправимой ситуацией (поскольку в очереди для запросов страниц находится больше материала, чем может быть получено из операций ввода-вывода).
Второй менее продуман, но не менее важен. Если вы выделите почти всю свою память для реальных данных приложения - вы не продержитесь долго. Почти каждое приложение полагается на чтение файлов из файловой системы для работы, это может быть связано с тем, что некоторые инструкции находятся в общей библиотеке или из-за того, что вам нужно прочитать /etc/resolv.conf для вызова библиотеки или для любой другой цели. Весьма вероятно остановить операционную систему - но при этом иметь достаточно памяти, чтобы вместить все ваши приложения, но, поскольку ваша очередь требует так много запросов ввода / вывода, ничто не может завершиться должным образом.
Что ядро хочет сделать с вашим свопом
Ядро хочет использовать ваш своп, чтобы избавиться от страниц, которые тратят впустую память, чтобы оно могло использовать эту память для чего-то другого.
По сути, при нормальной работе ядро любит агрессивно заполнять кеш страниц данными, считанными с диска, это означает, что оно не будет читать диск для тех же данных. Это хороший дизайн и может значительно уменьшить количество операций ввода-вывода. Теперь может случиться так, что у вас есть какое-то приложение, которое хранится в памяти, которое спит в течение 3 дней, просыпается, выполняет кучу работы, а затем спит еще 3 дня.
Ядро хочет сделать с этими данными замену, чтобы освободить место для активности файловой системы, поскольку у вас гораздо больше шансов на самом деле использовать эти страницы чаще, чем страницы, которые вы используете для своего приложения. Подкачка в этом смысле может быть транзакцией 16 КБ на ваш носитель подкачки, которую вы вряд ли почувствуете, но взамен вы освободили 16 КБ памяти, которую можно использовать для хранения данных объемом в четыре файла.
Для чего ядро не хочет использовать swap для
Ядро определенно не хочет использовать ваш своп для выделения большего количества анонимной памяти путем замены некоторой другой анонимной памяти, о которой люди больше всего и справедливо беспокоятся.
Тем не менее, я должен отметить, что если вы выделили так много памяти, что у ядра нет иного выбора, кроме как сделать это, то это проблема конфигурации системных администраторов, а не самого ядра, - это просто попытка сделать все возможное с помощью варианты вы дали!
Если у вас есть огромное количество свопа, вы увеличиваете вероятность его использования?
Нет! Если у вас есть 1 ГБ оперативной памяти и 4 ГБ подкачки, вероятность того, что ваши данные поменяются местами, не составляет 80%! Ядро хочет использовать своп только тогда, когда страницы в памяти лучше обслуживать, делая что-то еще!
Выгодно ли вообще не использовать своп
Я бы никогда этого не сделал. Замена позволяет O / S избавиться от памяти, которая вам нужна, но никогда не используется. Если у вас нет свопа, вы просто не сможете вернуть свою память, что может привести к значительному повышению производительности, если, скажем, кеш страниц будет иметь ее вместо этого.
Какой лучший обмен
Говоря теоретически, выясните, сколько резидентной памяти + 20% для таких безопасных вещей, как повторные входящие вызовы библиотеки, которые должны выделять память из кучи, - затем установите размер подкачки на это количество. Это (теоретически в любом случае) позволило бы операционной системе выгружать всю анонимную память, если бы ей пришлось уступить место чему-то более полезному.
Если я получу возможность ядра поменять все, что опасно, верно?
Помните, что ядро не хочет менять местами, чтобы освободить место для анонимного выделения памяти, оно будет только когда-либо заменять неиспользуемые страницы, чтобы отдать предпочтение чему-то еще, что вместо этого будет лучше использовать пространство.
Если вы заменяете память только для того, чтобы выделить ее из более анонимной памяти, вы делаете что-то не так, и вам нужно больше оперативной памяти или все равно перенастроить стек приложений.
Сколько оперативной памяти вам нужно
Конечно, вам нужно разрешить достаточно оперативной памяти для запуска всех ваших приложений, но вам, вероятно, следует добавить дополнительные 2 ГБ оперативной памяти для заполнения кэша страниц - может быть, больше. Кеш страниц делает ваш компьютер намного быстрее, а ваши диски работают дольше. Если вы думаете о том, чтобы запустить веб-сервер, иметь еще больше возможностей для pagecache - это хорошая идея из-за огромного количества статического содержимого, которое вы можете извлечь и повторно использовать из pagecache, которое будет получено (если пропускная способность вашего веб-сервера составляет 5 Мбит / с, вы действительно не хотите Вы хотите получить тот контент 5 Мб / с, который вы генерируете с вашего диска!).
Что делать, если вы действительно не доверяете Linux правильно поменять местами
Если вы действительно обеспокоены, вы можете выделить больше памяти, чем у вас есть:
Какой лучший способ настроить мою память для моего приложения
Производитель рекомендует другую конфигурацию.
Послушайте это вместо этого. Некоторые приложения написаны таким образом, что они намеренно вызывают ядро, чтобы их страницы были активными над всеми остальными. Честно говоря, это неприятный трюк, но он нарушает способность ядра легко управлять памятью, когда это происходит. Если ваш поставщик сообщает вам подробности, он, скорее всего, попадает в эту категорию и прислушивается к тому, что он говорит.
В итоге
Ядро обычно очень хорошо справляется с управлением виртуальной памятью. Это почти всегда тот случай, когда ваше приложение выделяет больше памяти, чем вы могли бы надеяться на работу, и именно это вызывает OOM.
Раньше своп использовался как «запасная память», но больше не является его основной целью, поэтому не думайте об этом. Вместо этого, оцените, что ваше ядро, вероятно, лучше знает, для чего оно хочет использовать вашу память. Оставьте место для принятия этих решений, и вы получите общее улучшение производительности.
Из документа «Рекомендации по развертыванию сервера Oracle 10g на 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)
Я нашел этот документ для вас, он должен помочь вам принять это решение, вот оно: Что такое Swap Space? , но ни один из приведенных выше ответов не является правильным
dd if=/dev/zero of=swap.file bs=1024 count=1048576; mkswap swap.file; swapon swap.file