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

Apache и MySQL забирают всю память? Максимум подключений?

У меня был один из наших серверов, который выходил из строя (с точки зрения сети), но продолжал работать (так что, похоже, сервер не теряет свою мощность). Я попросил свою хостинговую компанию провести расследование, и после расследования мне сказали, что Apache и MySQL все время использовали 80% памяти с пиковым значением 95%, и что мне может потребоваться добавить еще немного оперативной памяти в сервер.

Одним из оправданий добавления дополнительной оперативной памяти было то, что я использовал настройку максимального количества подключений по умолчанию (125 для MySQL и 150 для Apache) и что для обработки этих 150 одновременных подключений мне потребуется как минимум 3 ГБ памяти вместо 1 ГБ, которые у меня есть. в данный момент.

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

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

Я собираюсь:

# free -m
             total       used       free     shared    buffers     cached
Mem:          1000        944         56          0        148        725
-/+ buffers/cache:         71        929
Swap:         1953          0       1953

Что, я полагаю, означает, что да, сервер в настоящий момент резервирует около 95% своей памяти, но я также подумал, что это означает, что только 71 из 1000 в общей сложности действительно использовались приложениями в данный момент, глядя на строку буферов / кеша .

Также я не вижу подкачки:

# vmstat 60
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0      0  57612 151704 742596    0    0     1     1    3   11  0  0 100  0
 0  0      0  57604 151704 742596    0    0     0     1    1   24  0  0 100  0
 0  0      0  57604 151704 742596    0    0     0     2    1   18  0  0 100  0
 0  0      0  57604 151704 742596    0    0     0     0    1   13  0  0 100  0

И, наконец, при запросе страницы:

top - 08:33:19 up 3 days, 13:11,  2 users,  load average: 0.06, 0.02, 0.00
Tasks:  81 total,   1 running,  80 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.3%us,  0.3%sy,  0.0%ni, 98.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1024616k total,   976744k used,    47872k free,   151716k buffers
Swap:  2000052k total,        0k used,  2000052k free,   742596k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
24914 www-data  20   0 26296 8640 3724 S    2  0.8   0:00.06 apache2            
23785 mysql     20   0  125m  18m 5268 S    1  1.9   0:04.54 mysqld             
24491 www-data  20   0 25828 7488 3180 S    1  0.7   0:00.02 apache2            
    1 root      20   0  2844 1688  544 S    0  0.2   0:01.30 init               
...

Итак, я хотел бы знать, знатоки serverfault:

  1. Действительно ли мне сейчас нужно больше оперативной памяти? // Обновление: мне бы очень хотелось понять, почему они говорят, что я использую всю свою текущую оперативную память, и как оправдать увеличение объема оперативной памяти, которое они рекомендуют.
  2. Как они рассчитывают, что для 150 одновременных подключений мне понадобится 3 ГБ?

Спасибо за вашу помощь!

Как они рассчитывают, что для 150 одновременных подключений мне понадобится 3Гб?

В среднем 150 * ОЗУ для одного клиента Apache (они, по-видимому, решили, что для вашего случая это 20 МБ).

Судя по приведенному здесь снимку, использование памяти кажется нормальным, и обновление не потребуется (и, вероятно, не поможет).

Free & top оба заявляют, что свободно всего около 50 МБ, но с учетом буферов это число значительно выше. Linux будет использовать любую нераспределенную / неиспользуемую физическую оперативную память в качестве кеш-памяти и буферного пространства. Если вашим приложениям требуется больше памяти, brk & sbrk извлечет его из кеша. Это может сказаться на производительности, поскольку это происходит чаще, но, вероятно, это совсем не проблема.

Теперь очень возможно, что вы действительно время от времени делаете пики во время высокого трафика или запуска сценариев обслуживания. Есть ли у вас запланированные задания cron, которые выполняют большие запросы как часть процесса очистки или чего-то еще? Есть ли что-нибудь, что может временно поглотить оперативную память, а затем освободить ее? Аккаунт замораживает пакетные задания или что-то в этом роде?

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

А как насчет вывода dmesg? Ошибки сетевого устройства?

Объем памяти, который использует ваш apache, зависит от использования памяти php, от количества загруженных модулей apache и php и количества подключений.
Всегда нужно проверять наихудший сценарий:
MEMOF (max php mem, max загруженные модули) x max соединения apache
и вы всегда хотите избегать использования свопа, поэтому результат должен быть меньше, чем объем вашей физической памяти.
У вас также есть сервер mysql, поэтому вы также должны учитывать максимальное использование памяти.
Вы можете выполнить много оптимизаций конфигурации, чтобы уменьшить использование памяти, сохраняя при этом скорость и стабильность вашего сайта (выполните поиск в serverfault - здесь вы можете найти полезные обсуждения).

«нынешние 1 или 2 посетителя до обеда»

Если у вас 1-2 посетителя, проблема не в максимальном количестве подключений и, вероятно, не в оперативной памяти, а в конфигурации. Это может быть зарезервированная кеш-память Mysql для индексов и кешей запросов.