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

Производительность Linux / Apache очень низкая даже в локальной сети

У меня есть сервер Ubuntu с Apache и MYSQL. Информация о системе и версии выглядит следующим образом: ядро ​​Linux 3.0.0.-12 Apache / 2.2.20 MySQL Ver 14.14.Distrib 5.1.58

У меня есть несколько веб-сайтов на этом сервере, некоторые только HTML, некоторые PHP / MySQL. [Проблема в том, что время отклика очень медленное, как на статических, так и на динамических сайтах. Иногда на получение ответа уходит более 10 секунд, что делает сайты очень медленными и почти непригодными для использования.
Проблема возникает даже при запросе из локальной сети. Я добавил задействованные поддомены в свой файл / etc / hosts, и устраню все проблемы, которые не решаются с помощью IP-адресов вместо URL-адресов. Таким образом, нет проблем с поиском DNS.
Я изменил формат журнала, указав время отклика, и иногда для обслуживания файлов требуется 12 секунд, см. Файл jquery ~ .js на снимке экрана примера.
У меня нет объяснения такому чрезвычайно долгому времени отклика, но это даже не единственная проблема, некоторые другие файлы тоже обслуживаются долго, но не показывают долгое время отклика в файле журнала.
Так что, вероятно, здесь задействованы разные ткани. Я не могу найти решение до сих пор, есть предложения ??? Спасибо заранее, Клаас

ссылка на снимок экрана из файла журнала доступа

Некоторая дополнительная информация о конфигурации:

apache2.conf (комментарий удален)

LockFile ${APACHE_LOCK_DIR}/accept.lock
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

<IfModule mpm_worker_module>
    StartServers          2
    MinSpareThreads      25
    MaxSpareThreads      75 
    ThreadLimit          64
    ThreadsPerChild      25
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

<IfModule mpm_event_module>
    StartServers          2
    MinSpareThreads      25
    MaxSpareThreads      75 
    ThreadLimit          64
    ThreadsPerChild      25
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

AccessFileName .htaccess

<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy all
</Files>

DefaultType text/plain
HostnameLookups Off

ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn

Include mods-enabled/*.load
Include mods-enabled/*.conf
Include httpd.conf
Include ports.conf
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %T/%D" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
Include conf.d/
Include sites-enabled/

И виртуальный хост-файл для одного из медленных сайтов, на самом деле, довольно прост ...

<VirtualHost *:80>
    ServerAdmin blablabla@gmail.com
        ServerSignature EMail
        ServerName toenjoy.drsklaus.nl
    DocumentRoot /var/www/toenjoy.drsklaus.nl
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/toenjoy.drsklaus.nl/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride AuthConfig
                AuthType Basic
                AuthName "To Enjoy"
                AuthUserFile /etc/.htpasswd
                Require user petraaa
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn
    CustomLog /var/log/apache2/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>
</VirtualHost>

И вывод free -m:

klaas@ubuntu-server:/etc/apache2$ free -m
             total       used       free     shared    buffers     cached
Mem:          1997       1401        595          0        144       1017
-/+ buffers/cache:        238       1758
Swap:         2035          0       2035

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

РЕДАКТИРОВАТЬ: проблема, казалось, исчезла в течение некоторого времени, но возникает снова! И не только с Apache, подключение с помощью SSH занимает очень много времени, иногда до запроса ключевой фразы может пройти до 15 секунд. Также scp работает очень медленно. Поведение действительно непредсказуемо и делает сервер очень сложным в использовании. Любые идеи...?

Apache - сложный зверь и может быть здесь проблемой ... а может и нет. Я бы начал отладку общей медлительности сети, прежде чем залезть в эту темную дыру. В частности:

  • Попробуйте запустить netcat в режиме сервера на порту, настроенном для передачи содержимого локального файла, а затем подключитесь к нему с самого компьютера. Например:

    пока правда; сделать nc -l 80 <index.html; сделано

Это устраняет проблемы с apache, физической сетью и DNS или IP-связью. Обратите внимание, что обслуживаемый файл является локальным - например, без монтирования NFS.

  • Снова то же самое, но подключайтесь по локальной сети из той же подсети
  • Опять же, но из другой подсети

Если вы зашли так далеко, ваш сервер в порядке, и ваша сетевая маршрутизация тоже в порядке.

Теперь очистите DNS и убедитесь, что обратный поиск работает. dig 4.3.2.1.in-addr.arpa, например, чтобы проверить поиск адреса 1.2.3.4. Если он медленный, это проблема, и вам нужно будет поиграть с /etc/resolv.conf, dnsmasq или чем-то еще. Не продолжайте, пока он не станет твердым как скала. На этом этапе тоже стоит попробовать SSH / SCP - это должно быть быстро.

Далее Apache. Если вы зайдете так далеко, значит, ваша сеть в порядке, DNS работает и коробка в порядке. Таким образом, ваше приложение (например, www-сервер) остается. Попробуйте сократить конфигурацию до минимума и посмотреть, как у вас дела. Например Вот является одним.

Удачи!

Что происходит, когда вы пытаетесь получить доступ через lynx или curl с локального хоста или с машины в сети?

Также посмотрите этот блок от Apache:

Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>

Я бы порекомендовал избавиться от всего этого блока, перезапустить Apache и повторить попытку. У меня тоже были странные зависания, когда Apache deny действия против локального хоста или локального IP-адреса. Непонятные проблемы с поиском в DNS могут привести к зависанию Apache для каждого запроса. И задержка в 12 секунд на страницу заставляет меня думать, что это причина. Но из вашей конфигурации не на 100% ясно, является ли блок, который я указываю, виновником или нет. Но сделайте какой-нибудь поиск задач, связанных с поиском DNS, связанных с Apache.

Кроме того, трудно сказать, какие настройки должны быть на вашем сервере, не наблюдая за реальным трафиком ваших сайтов, но я предлагаю вам KeepAlive настройки кажутся ресурсоемкими. Я бы рекомендовал изменить так:

KeepAlive On
MaxKeepAliveRequests 50
KeepAliveTimeout 2

Я бы также рекомендовал снизить MaxClients и добавление ServerLimit корректировка MaxRequestsPerChild а также в вашем основном apache2.conf вот так:

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    ServerLimit          90
    MaxClients           90
    MaxRequestsPerChild 2000
</IfModule>

<IfModule mpm_worker_module>
    StartServers          2
    MinSpareThreads      25
    MaxSpareThreads      64 
    ThreadLimit          64
    ThreadsPerChild      25
    ServerLimit          90
    MaxClients           90
    MaxRequestsPerChild 2000
</IfModule>

<IfModule mpm_event_module>
    StartServers          2
    MinSpareThreads      25
    MaxSpareThreads      64 
    ThreadLimit          64
    ThreadsPerChild      25
    ServerLimit          90
    MaxClients           90
    MaxRequestsPerChild 2000
</IfModule>

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

Изменить: попробуйте их по одному!

Выскакивает пара вещей:

MaxRequestsPerChild 0

Если у вас нет причин использовать 0 (процесс никогда не умирает), затем немного увеличьте его (по умолчанию 1000) сказать 100 и перезапустите, и посмотрите, улучшится ли это. Может предотвратить утечку памяти.

MaxClients 150

В зависимости от того, сколько памяти у вашего сервера, и если все три модуля вызываются одновременно, вам может не хватить памяти. Например, если ваш процесс apache имеет размер 20 МБ, у вас будет 150 клиентов x 20 МБ x 3 мода = 9000 МБ ~ 8,8 ГБ. Даже если вызывается только один из них, вы используете ~ 2,9 ГБ.

Если вы не используете все три мода, удалите ненужные из своего экземпляра apache.

Кроме того, как насчет вывода top и free -m во время этой медленной работы?