CentOS Сколько SWAP для 16 ГБ оперативной памяти?

11

Сколько SWAP вы бы дали установке CentOS на двухъядерный процессор QuE Core XEON с 16 ГБ ОЗУ, который будет работать на веб-сайте php с бэкэндом mysql - средней / высокой нагрузкой?


источник

Ответы:

20

Не больше, чем концерт или два - вы хотите немного подкачки, на всякий случай и потому, что это помогает немного лучше работать, но если вы когда-нибудь дойдете до точки, где вы сильно поменялись местами, машина будет работать быть бесполезным - и в реальной катастрофической ситуации вам на самом деле лучше с меньшим пространством подкачки, потому что тогда вы активируете OOM killer раньше, чем позже.

genehack
источник
7
И помните, что вы всегда можете добавить больше пространства подкачки позже, если это необходимо, выделив некоторое пространство и создав новый том (если используете LVM) или используя файл в качестве свопа с чем-то вродеdd if=/dev/zero of=swap.file bs=1024 count=1048576; mkswap swap.file; swapon swap.file
David Spillett
3
В качестве примечания вы можете контролировать степень перестановки, регулируя значение / proc / sys / vm / swappiness.
Дэвид
2
Мне придется не согласиться с несколькими моментами здесь. , , Во-первых, диск дешевый, на него можно скинуть пару ГБ. Во-вторых, убийца ООМ может уничтожить всю вашу коробку, если вам не повезет. Полагаться на это каким-либо образом или считать, что лучше запустить OOM killer - очень плохая идея. Думать, что потенциально скрытая коробка лучше, чем потенциальное замедление, также является плохой идеей. Единственное время, которое было бы разумным, - это если у вас есть очень специфическая установка, запланированная на эту ситуацию.
Кристофер Кашелл
Заметьте, что обычно лучше установить раздел подкачки, а не файл, чтобы избежать накладных расходов и упростить процесс загрузки. Однако использование файла будет работать. 4 ГБ - это все, что нужно любой системе, я сомневаюсь, что вы все равно получите много места с 16 ГБ ОЗУ
Silverfire
На самом деле, по словам Эндрю Мортона, производительность должна быть примерно одинаковой для файла подкачки
Путешественник Geek
8

Я прошу прощения за очень длинный ответ. Я давно хотел положить этот материал где-нибудь на некоторое время!

TLDR; Теоретически, ответом будет «вероятно не меньше, чем общий объем резидентной памяти, которую хотят использовать все ваши приложения»

Я постараюсь объяснить, если ты останешься со мной ..

Немного о виртуальной памяти

Я чувствую, что в наши дни существует распространенное заблуждение относительно ценности свопа и его цели. Часто считается, что подкачка подразумевается как «резервный банк» для памяти, когда у вас заканчивается память. Да, это отчасти верно, но ядро не хочет использовать ваш своп в качестве резервного банка . Кроме того, ядро ​​никогда не хочет вызывать диск, чтобы получить данные, которые вы ищете!

В прикладном пространстве есть несколько вещей, которые ядро ​​будет хранить в памяти.

  • Данные сопоставленного файла.
  • файловые системы tmpfs.
  • Необработанная память приложения выделяется во время выполнения.
  • Код приложения (например, содержимое в сегменте данных форматов ELF)
  • Частный файл данных.

Для целей управления памятью, выделение памяти поддерживаются в той или иной форме , с помощью опорного устройства.

Память с файловой поддержкой - это память, полученная из файла, и в типичных операционных системах она занимает подавляющее большинство памяти в системе. Он включает в себя такие файлы, как общие библиотеки, которые были загружены, файлы, считанные с диска и сохраненные в кэше страниц, и файлы, отображаемые с диска (фактически ядро ​​не делает различий между страницами в кэше страниц и файлами, отображенными по существу, так как тоже самое).

Отличительной особенностью этой памяти с точки зрения ядра является то, что она одноразовая, то есть должна быть возможность выгрузить эти страницы, если вам нужна память для чего-то другого, и это именно то, что делает кэш страниц, если память внезапно становится требованием.

Анонимно поддерживаемая память - это другое дело. Память из этого региона является анонимной, потому что на диске нет файла, который бы на самом деле содержал эти данные. Обычно он состоит из стека приложения, кучи, чего-либо в 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 правильно поменять местами

Если вы действительно обеспокоены, вы можете выделить больше памяти, чем у вас есть:

  • Установите сумму подкачки не больше, чем ваша RAM
  • Установите / proc / sys / vm / overcommit_memory в 2
  • Задайте для параметра / proc / sys / vm / overcommit_ratio значение, которое фактически не может превышать пределы физической памяти. Посмотрите документацию по ядру, чтобы понять, каким будет это число для вас.

Какой лучший способ настроить мою память для моего приложения

  • Поймите, что на самом деле делает перестановка.
  • Используйте CGroups для выделения правильных ресурсов для приложения.
  • Измените упомянутый выше режим overcommit, чтобы операционная система ввела строгие ограничения.
  • Используйте cgroups, как указано выше, чтобы установить приоритеты OOM для приложений, которые вы действительно хотите сохранить, если у вас недостаточно памяти, и приложения, которые вы действительно хотите отключить, если у вас недостаточно памяти.

Производитель рекомендует другую конфигурацию.

Послушайте это вместо этого. Некоторые приложения написаны таким образом, что они намеренно вызывают ядро, чтобы их страницы были активными над всеми остальными. Честно говоря, это неприятный трюк, но он нарушает способность ядра легко управлять памятью, когда это происходит. Если ваш поставщик сообщает вам подробности, он, скорее всего, попадает в эту категорию и прислушивается к тому, что он говорит.

В итоге

  • Подкачка предназначена для использования в качестве места для размещения потраченной памяти. Не как «запасная память»
  • Наличие большого количества свопа никак не влияет на ваши шансы его использовать.
  • Ядро действительно хочет запретить вам доступ к диску для ваших данных. Это относится так же - если не в большей степени, так и к кешу страниц, как и к пространству подкачки.
  • Ядро будет стараться изо всех сил соблюдать настройки, которые вы задаете для приложений, которые вы запускаете. Но не удивляйтесь, если у вас OOM, если у вас 500 детей с Apache, занимающих 32M памяти. Это ошибка выбранной вами конфигурации, а не управления памятью.

Ядро обычно очень хорошо справляется с управлением виртуальной памятью. Это почти всегда тот случай, когда ваше приложение выделяет больше памяти, чем вы могли бы надеяться на работу, и именно это вызывает OOM.

Раньше своп использовался как «запасная память», но больше не является его основной целью, поэтому не думайте об этом. Вместо этого, оцените, что ваше ядро, вероятно, лучше знает, для чего оно хочет использовать вашу память. Оставьте место для принятия этих решений, и вы получите общее улучшение производительности.

Мэтью Ифе
источник
2

Из документа «Рекомендации по развертыванию сервера Oracle 10g на Red Hat® Enterprise Linux® 5».

Oracle предоставляет общие рекомендации относительно размера свопа в MetaLink Note 169706.1. Эти рекомендации могут привести к созданию очень большого пространства подкачки в системах с большим объемом памяти. Очень большой своп может привести к серьезному снижению производительности системы и может быть решен путем уменьшения пространства подкачки. Red Hat не рекомендует выделять более 4 ГБ для подкачки в Red Hat Enterprise Linux 5.

Таким образом, для 16 ГБ у вас должно быть не более 4 ГБ подкачки.

PS. Также стоит отметить, что вызванный oomпроцесс почти всегда лучше, чем неиспользуемый выкачанный процесс, использующий всю пропускную способность ввода / вывода.

SaveTheRbtz
источник
-1

Из того, что я помню из документации Linux: Если ваш RAM больше 2 ГБ, то вы делаете swap = (ramSize + 2). Если это меньше, тогда вы делаете swap = (ramSize * 2)

MKN Web Solutions
источник
-2

Я нашел этот документ для вас, он должен помочь вам принять это решение, вот оно: Что такое Swap Space? , но ни один из приведенных выше ответов не является правильным

Alexus
источник
1
Документ, на который вы ссылаетесь, не согласен с самим собой. Следование установленному правилу «для большего объема ОЗУ 2 ГБ ОЗУ выше 2 ГБ» даст обмен 1 ГБ для ОЗУ 3 ГБ (3-2 = 1), а не 5 ГБ.
Дэвид Спиллетт