У меня был один из наших серверов, который выходил из строя (с точки зрения сети), но продолжал работать (так что, похоже, сервер не теряет свою мощность). Я попросил свою хостинговую компанию провести расследование, и после расследования мне сказали, что 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:
Спасибо за вашу помощь!
Как они рассчитывают, что для 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 для индексов и кешей запросов.