2015-12-06 6 views
0

У меня есть обработка приложения причала около 2 тыс. Запросов в секунду. Машина имеет 8 ядер и размер кучи JVM составляет 8 ГБ. Существует много файлов с отображением памяти и внутренним кэшированием, что занимает большую часть кучи (4.5 ГБ).Как сборка мусора влияет на задержки причала?

Вот статистика после применения стабильно и JVM выполняется настройкой молодого и старые генераторного пространства: молодого поколения: 2,6 ГБ старого поколение: 5.4GB

Я вижу, что мой молодой GC является вызывается каждые 3 секунды, и все пространство Eden очищается (т.е. очень мало данных передается в старое поколение). Я понимаю, что заполнение молодого поколения так быстро означает, что я выделяю слишком много объектов и что это проблема. Но в моем приложении нет утечки памяти, так как серверы работают с 2-х недель без сбоев OOM.

Young GC - это остановка мирового события. Поэтому я понимаю, что все потоки приостановлены в течение этого времени. Поэтому, когда я отслеживаю задержки из журналов, я вижу, что каждые 2-3 секунды около 6-9 запросов имеют время отклика> 100 мс (Мое среднее время отклика равно < 10 мс). И когда вызывается Full GC, я вижу, что 6-9 запросов имеют время отклика> 3 секунды (вот как долго длится полный GC, и поскольку он вызван очень-очень мало, это не проблема)

Мой вопрос так как мое приложение для причала имеет 200-разрядный пул потоков и не ограниченную очередь запросов, не должен ли вызывать молодой GC иметь эффект аккордеона в отношении моего ответа? Будет ли добавлен буфер 100 мс ко всем запросам в моей очереди?

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

Один из способов - проверить мой балансировщик нагрузки. Но поскольку эти серверы отстают от ELB, у меня на самом деле нет большого доступа, кроме среднего времени отклика, которое мне действительно не помогает.

ответ

-1

Вы должны включить GC-протоколирование для своего приложения. Попробуйте добавить следующие аргументы командной строки JVM

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:-PrintTenuringDistribution -XX:+PrintGCCause -XX:+PrintGCApplicationStoppedTime -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=<REPLACE_ME> -XX:GCLogFileSize=20M -Xloggc:<path_to_gc_log_dir>/gc.log

Тогда посмотрите на события в журналах GC и попытаться соотнести его с журналами приложений

Смежные вопросы