Назад | Перейти на главную страницу

Управление памятью LAMP (CentOS)

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

Теперь я, наконец, оказался в ситуации, когда мне потребовалось создать LAMP-установку с нуля (с простой установкой CentOS), чтобы обслуживать довольно интенсивную установку Wordpress.

Все шло гладко, так как я был в блоке с администрированием серверов на базе Linux, чтобы все заработало, но я получаю действительно странные зависания системы несколько раз в неделю, и поскольку я единственный, кто может получить доступ к серверу и загрузите сервисы, это ДЕЙСТВИТЕЛЬНО раздражает.

Вот некоторые ключевые данные:

Сервер

использование

Я сузил проблему до управления памятью - или ее отсутствия. По какой-то причине свопинг отключен на сервере, и как только потребление памяти достигает 100%, сервер просто переходит в режим перегрузки, и вся надежда теряется. Объем памяти (384 МБ) должен быть более чем достаточным для размещения сайта с такой статистикой, поэтому что-то сделано неправильно. У меня заканчиваются идеи, что это могло быть.

Я, очевидно, пытался настроить параметры в my.cnf, php.ini и httpd.conf, но безрезультатно. Вот мои основные настройки на данный момент:

my.cnf

skip-innodb
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip-locking
skip-ndbcluster
skip-bdb
skip-networking
safe-show-database
query_cache_limit=8M
query_cache_size=48M
query_cache_type=1
max_user_connections=200
max_connections=32
interactive_timeout=60
wait_timeout=60
connect_timeout=50
thread_cache_size=4
key_buffer= 96M
join_buffer=1M
max_connect_errors=20
max_allowed_packet=32M
table_cache=1024
record_buffer=1M
sort_buffer_size=6M
read_buffer_size=6M
read_rnd_buffer_size=6M
thread_concurrency=4
myisam_sort_buffer_size=32M
server-id=1
user=mysql
tmp_table_size=64M
max_heap_table_size=48M

php.ini

memory_limit = 128M

httpd.conf

StartServers       2
MinSpareServers    3
MaxSpareServers   5
ServerLimit      16
MaxClients       16
MaxRequestsPerChild  1000

Это та часть, где может быть самоочевидно, что я летаю прямо здесь, за штаны. Являются ли эти настройки хотя бы отдаленно приемлемыми для настройки сервера 384 МБ? Что еще можно сделать для уменьшения количества сбоев, когда единственное решение - войти в систему для перезапуска mysqld и httpd?

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

Глупо то, что мы перешли от довольно надежной настройки веб-хостинга к более дорогостоящей настройке виртуального сервера, чтобы уменьшить беспокойство по поводу стабильности и масштабирования сервера, но на самом деле это ухудшило ситуацию и, несомненно, на 99% из-за моего собственные недостатки как админ!

Так что, пожалуйста, гуру, помогите мне немного. Я обещаю, что я никогда не буду скучать с ИТ-специалистом и напишу только код, который легко развернуть, не выйдет из строя посреди ночи и в целом будет хорошо помнить вас в другие дни, помимо Дня системного администратора.

  1. Apache довольно интенсивно использует память, в основном потому, что с mpm_worker каждый клиентский запрос получает свой собственный процесс, а с mod_php каждый клиентский процесс получает собственную встроенную виртуальную машину PHP. Попробуйте уменьшить или отключить интервал KeepAlive, который быстрее освобождает клиентские процессы (2 секунды более чем достаточно для большинства случаев использования).
  2. Если у вас нет раздела подкачки, вы все равно можете настроить файл подкачки следующим образом

    dd if = / dev / zero of = / swapfile1 bs = 1024 count = 524288
    mkswap / swapfile1
    swapon / swapfile1
    echo "/ swapfile1 swap swap defaults 0 0" >> / etc / fstab

    Замена веб-сервера по-прежнему будет ухудшать производительность, но не остановится.

  3. Замените Apache более легким веб-сервером, например Nginx, чтобы уменьшить использование памяти. Установка nginx + php на CentOS
  4. Уменьшите размер буфера кэша запросов MySQL, если вы обнаружите, что вам все еще не хватает памяти. Вы можете добавить skip-innodb в my.cnf, чтобы уменьшить использование памяти, если вы не используете механизм хранения InnoDB.
  5. Узнайте, что забирает вашу память (смотрите htop / top, читайте логи).