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

Проблема с задержкой AWS ELB

У меня есть две машины c3.2xlarge EC2 со средой Ubuntu в us-west-2a AZ. Оба содержат одинаковый код с базой данных mySQL от AWS RDS (db.r3.2xlarge). Оба экземпляра добавляются в ELB. У обоих есть один запланированный cron, который запускается дважды в день.

ELB настроен на подачу сигнала тревоги при превышении порогового значения 5,0. Загрузка ЦП обоих экземпляров составляет в среднем 30–50. В часы пик достигает 100% в течение минуты или двух, а затем возвращается к норме. Но ELB постоянно бьет тревогу трижды в день. На данный момент оба экземпляра

CPU     - ~50%
Memory  - total - 14979
          used  - ~6000
          free  - ~9000
RDS CPU - ~30%
          Connections - 200 to 300 /5,000

Согласно этому https://aws.amazon.com/premiumsupport/knowledge-center/elb-latency-troubleshooting/ Я не нашел ничего плохого в экземплярах. Но по-прежнему задержка достигает пика, и оба экземпляра не отвечают.

До сих пор я просто удаляю один экземпляр из балансировщика нагрузки, перезапускаю apache, затем загружаю его обратно и делаю то же самое для другого экземпляра. Это отлично справляется со своей задачей, и экземпляры и ELB работают в течение следующих 6-10 часов. Но это неприемлемо, так как каждый день дважды или трижды нужно заботиться о сервере, нужно его перезапускать.

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

Статус сервера Apache содержит слишком много таких (~ 200/250 процессов):

7-0 23176   1/2373/5118 C   30.95   3986    0   0.0 7.01    15.78   127.0.0.1   ip-xxx-xxx-xxx-xxx.us-west-2.comp   OPTIONS * HTTP/1.0

ЦПУ использование (%) не является ключом, ключом является ЦП средняя нагрузка (очередь) и сетевые метрики, метрики apache, буферы и т. д. Балансировщики нагрузки - это очень простые устройства, проблемы, в архитектуре которых LB задействованы, обычно не связаны с ELB, а связаны с характером того, как работает остальное.

Чтобы увидеть, в чем проблема, вам нужно выполнить следующие шаги:

  • Проверьте, отвечает ли apache на локальные запросы, если нет - проблема НЕ в ELB
  • Проверьте состояния рабочих Apache (т.е. mod_status), соответствующим образом настройте параметры MPM
  • Проверьте среднюю загрузку ЦП, если средняя загрузка превышает количество ЦП, а iowait растет - у вас проблемы с вводом-выводом
  • Проверьте, включена ли постоянная связь и действительно ли она требуется, если вы действительно используете сеансы на веб-серверах, которым требуется доступ к одному и тому же веб-экземпляру.
  • Проверьте настройки поддержки активности для apache, отключите его или установите очень низкое значение тайм-аута
  • Убедитесь, что на экземпляре включен iptables и настроены ли параметры ядра nf_conntrack_max и nf_conntrack_count с более высокими значениями. Если вам это не нужно - отключите и вообще не загружайте модули
  • Единичные экземпляры стресс-теста с http-запросами (подсказка: ab, jmeter)
  • Проверьте и соответствующим образом настройте параметры ядра:

    net.core.wmem_max
    net.core.rmem_max
    net.core.netdev_max_backlog
    
    net.core.somaxconn
    net.ipv4.tcp_rmem
    net.ipv4.tcp_wmem
    net.ipv4.tcp_no_metrics_save
    net.ipv4.tcp_timestamps
    net.ipv4.tcp_fin_timeout
    net.ipv4.tcp_max_tw_buckets
    net.ipv4.tcp_tw_recycle
    net.ipv4.tcp_synack_retries
    net.ipv4.tcp_keepalive_time
    
    net.netfilter.nf_conntrack_acct
    net.netfilter.nf_conntrack_generic_timeout
    net.netfilter.nf_conntrack_tcp_timeout_syn_sent
    net.netfilter.nf_conntrack_tcp_timeout_syn_recv
    net.netfilter.nf_conntrack_tcp_timeout_established
    net.netfilter.nf_conntrack_tcp_timeout_fin_wait
    net.netfilter.nf_conntrack_tcp_timeout_close_wait
    net.netfilter.nf_conntrack_tcp_timeout_last_ack
    net.netfilter.nf_conntrack_tcp_timeout_time_wait
    net.netfilter.nf_conntrack_tcp_timeout_close
    net.netfilter.nf_conntrack_tcp_timeout_max_retrans
    net.netfilter.nf_conntrack_tcp_timeout_unacknowledged
    net.netfilter.nf_conntrack_icmp_timeout
    net.netfilter.nf_conntrack_events_retry_timeout
    net.ipv4.netfilter.ip_conntrack_generic_timeout
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent2
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_last_ack
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_close
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_max_retrans
    net.ipv4.netfilter.ip_conntrack_icmp_timeout
    net.netfilter.nf_conntrack_tcp_loose
    net.netfilter.nf_conntrack_max net.nf_conntrack_max
    net.netfilter.nf_conntrack_count
    

После этого Apache не отвечает? Это вовсе не вина ELB.