У меня неплохой веб-сервер (выделенный) с хорошими ресурсами памяти:
System information
Server load 2.19 (8 CPUs)
Memory Used 29.53% (4,804,144 of 16,267,652)
Swap Used 10.52% (220,612 of 2,097,136)
Как видите, мой сервер использует подкачку, когда доступно много свободной памяти.
Это нормально или что-то не так с конфигурацией или кодировкой?
N.B.
Мой процесс MySQL по какой-то причине использует более 160% мощности процессора; Не знаю почему, но у меня не более 70 одновременных пользователей ...
Это совершенно нормально.
При запуске системы запускается ряд служб. Эти службы инициализируются, читают файлы конфигурации, создают структуры данных и так далее. Они используют некоторую память. Многие из этих служб никогда не будут работать снова в течение всего времени работы системы, потому что вы их не используете. Некоторые из них могут длиться часы, дни или недели. Но все эти данные находятся в физической памяти.
Конечно, система не может выбросить эти данные. Нельзя доказать, что к нему в буквальном смысле никогда не будет доступа. Например, одна из этих служб может предоставлять вам удаленный доступ к ящику. Возможно, вы не использовали его в течение недели, но если вы все же используете, он лучше работает.
Но система знает, что она может захотеть использовать эту физическую память для таких вещей, как дисковый кеш, или другими способами, которые улучшат производительность. Так происходит оппортунистический обмен. Когда ему нечего делать, он записывает данные, которые не использовались в течение очень долгого времени, на диск, используя пространство подкачки. Однако он по-прежнему сохраняет страницы в физической памяти. Таким образом, к ним по-прежнему можно получить доступ, не меняя их.
Теперь, если системе позже потребуется эта физическая память для чего-то еще, она может просто выбросить эти страницы, потому что она уже записала их для обмена. Это дает системе лучшее из обоих миров. Данные по-прежнему хранятся в памяти, поэтому к ним можно получить доступ, не считывая их с диска. Но если системе нужна эта память для другой цели, ей не придется сначала ее записывать. Большая победа со всех сторон.
Это может произойти, если в какой-то момент в прошлом вам требовалось больше памяти, чем у вас есть физической RAM на машине. В это время некоторые данные будут записаны в область подкачки.
Когда позже память освобождается, данные из подкачки не считываются автоматически обратно в ОЗУ: это происходит только тогда, когда данные из подкачки действительно нужны какому-либо процессу. Это совершенно нормально.
Что касается вашего процесса mysql: все зависит от типа выполняемых вами запросов. Теоретически двух очень сложных запросов может хватить, чтобы получить такую нагрузку, независимо от количества пользователей. Вы можете включить журнал медленных запросов, чтобы лучше понимать, какие запросы являются интенсивными.
Вы также можете изменить это поведение, sysctl -w vm.swappiness=10
, что значительно сократит использование свопа до тех пор, пока он действительно не понадобится.
Что касается MySQL, выполнили ли вы хотя бы тест базовой конфигурации с помощью tuning-primer.sh сценарий?
Это, вероятно, как объяснил Дэвид, нормальное поведение ядра Linux, но также может быть результатом Проблема MySQL «безумие подкачки». В вашем случае (8 ЦП, всего 16 ГБ ОЗУ, используется 5 ГБ), для этого ваш компьютер должен быть системой NUMA с 4 узлами (сокетами) и 4 ГБ ОЗУ на узел и пулом буферов MySQL InnoDB из 4 ГБ.
Вкратце (вы должны прочитать ссылку выше для получения полной информации), вот что происходит:
Чтобы этого избежать, измените распределение памяти для MySQL, чтобы выделить оперативную память для всех ядер (см. Ссылку выше для получения дополнительных сведений).