%20%D0%B2%20%D1%87%D0%B0%D1%81%D1%8B%20%D0%BF%D0%B8%D0%BA%2C%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82%20%D0%BD%D0%B0%20tomcat%20%D1%81%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%BC%20%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BE%D0%BC%20%D0%BE%D1%82%20%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0%20apache%2C%20%D1%80%D0%B0%D0%B7%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D0%BE%20%D0%BD%D0%B0%20AWS.png)
Просто для предисловия: я разработчик программного обеспечения, и поначалу никто не понимал, что происходит, поэтому я провел небольшое тестирование и почитал, и хотел бы помочь своим коллегам решить эту проблему.
Проблема:
Проблема в том, что в часы пик сервер становится настолько медленным, что соединение прерывается в браузерах, таких как Chrome (через 30 секунд), но сервер все еще работает и может обслуживать страницы примерно через 100 секунд (проверено с помощью insomnia). Я воспроизвел проблему abs ...
на производственном сервере, и она как-то связана с количеством одновременных запросов, вероятно, вызванных нашей конфигурацией сервера Apache.
Больше информации:
При разработке мы запускаем tomcat8 локально, и я тестировал его с " abs -c 200 -n 2000 https:/[link]
", и время выполнения нормальное. Но при тестировании производственного сервера, даже с 50 одновременными запросами, замедление API, которое я тестировал, было значительным: с 800 мс по умолчанию до 27846 мс.
Что было опробовано и более подробно:
У нас запущена java melody, и я подумал, что, возможно, мы достигли предела потоков в потоке выполнения tomcat, поэтому мы увеличили количество потоков до 500 с 200 по умолчанию (это было до того, как я провел тестирование). При запуске вышеупомянутого теста я вижу, что занятые потоки достигают 50 с чем-то из 500 (работает в продакшне, так что некоторые люди на самом деле также используют программу), но нет, она все еще сильно замедляется.
В пиковые моменты я вижу, что у нас около 1000 http-сессий, но потоки, память и процессор даже близко не приближаются к 100%. Просто чтобы убедиться, что мы обновили сервер до наилучшего, но, конечно, это не то. Мы используем SQL, но сервер SQL тоже не пиковый, так что я сомневаюсь, что проблема в этом.
Я знаю, что не стоит подражать аргументам JVM, но, глядя на похожие проблемы, я пробовал добавлять "-XX:ReservedCodeCacheSize=512M", но это тоже не сработало. Я также пробовал увеличить acceptCount до 1000 в server.xml, но это все еще не работает.Стоит ли мне отменить эти изменения?Я не заметил никаких изменений в производительности, и, насколько я могу судить по документации, можно оставить все как есть.
У нас есть странная функция, когда веб-приложение переходит на домашнюю страницу после некоторого времени бездействия, а затем продолжает обновлять домашнюю страницу каждые xx минут. Я думаю, что это плохо для производительности, особенно если у пользователя открыто много вкладок, и они начинают обновляться, возможно, это не то, что вызывает наши проблемы, но стоит упомянуть.
Следующее, что я попробую сегодня, это поиграться с аргументами сервера Apache. Я читаюруководство по настройкеи MaxRequestWorkers / MaxClients выглядит как что-то, что может объяснить то, что мы испытываем. ЦитатаЕсли значение этой директивы слишком низкое, Apache неэффективно использует имеющееся оборудование, что приводит к пустой трате денег и длительным задержкам загрузки страниц в часы пик.
Буду признателен за любые советы. Надеюсь, это просто сервер Apache, и я смогу хотя бы сделать сервер пригодным для использования сегодня. Есть ли еще какие-то конфигурации, которые могут вызывать это замедление?
решение1
Ваш веб-сервер может быть перегружен из-за слишком большого количества запросов, что фактически эмулирует атаку SlowLoris DOS, пожалуйста, проверьте мойпредыдущий ответпо теме.