предисловие
Открытие почтового ящика утром несколько дней назад получил контроль электронной почты и тревогу: чем выше определенный IP-адрес сервера загрузки центрального процессора, пожалуйста, исследование исследование для того чтобы решить как можно скорее, время передачи как раз перед рассветом.
В самом деле, еще в прошлом году, я имел дело с подобными проблемами, и записал: «После того , как расследование с целью оптимизации производства 100% практики CPU»
Но причина этой проблемы была создана не то же самое, как в прошлый раз, мы можем смотреть вниз.
анализ
После получения по электронной почте, я сразу зашел на этот сервер, также посмотрел на месте преступления (нагрузка по-прежнему высока).
Так что я снова воспользовался такого рода проблем подпрограмм устранения неполадок позиционирования.
Во - первых, top -c
использование ресурсов системы отображается в режиме реального времени ( -c
параметры могут отображаться полный команду).
Затем введите 大写 P
заявку в соответствии с CPU
использованием сортировки, первый самый высокий коэффициент использования программы.
Конечно , это один из наших Java
приложений.
Это приложение просто запустить некоторые из сроков отчета, планирование задач запускаются каждое утро, за несколько часов при нормальных условиях будут завершены работами.
Вторым шагом является естественными рутинными операции должны знать это приложение потребляющего большинство CPU
нитей в конце концов делает.
Использование top -Hp pid
и ввести P
еще может последовать CPU
использование потоков сортировки.
На этом этапе нам нужно только помнить идентификатор потока , чтобы преобразовать его в шестнадцатеричный хранится, путем jstack pid >pid.log
создания файла журнала, используйте шестнадцатеричный только что сохраненный процесс ID
для поиска снимка этого потока , чтобы знать расход CPU
нити делает.
Если Вы находите это хлопотно, я настоятельно рекомендую Али с открытым исходным кодом проблема позиционирования артефакт , arthas
чтобы локализовать проблему.
Так , например, указанные выше операции могут быть упорядочены в одну команду , thread -n 3
чтобы быть оживленные три потока снимка для распечатки очень эффективными.
Подробнее о Артас руководстве , пожалуйста , обратитесь к официальной документации .
Потому что, прежде чем я забываю выстрелы, и здесь я делаю вывод, что это напрямую:
Зеленый загруженная нить это GC
нить, которая означает , что он занят сбор мусора.
GC Просмотр
Исследование здесь, опытные пожилые водители будут думать: в основном использование памяти приложение вызывает проблемы.
К тому времени я jstat -gcutil pid 200 50
распечатать (каждый 200мс печататься в 50 раз) использование памяти, восстановление дс ситуация.
Информация может быть получена из следующего рисунка:
Eden
Район иold
область почти заполнены, видимое восстановление памяти проблематично.fgc
Восстановление высокой частоты, выздоровление наступило в течение 8 времен 10s ((866493-866485)/ (200 *5)
).- Длится дольше, FGC 8W случалось много раз.
Анализ памяти
Так как исходная позиция проблема памяти, вы должны взять анализ снимка памяти для того, чтобы в конечном итоге найти проблему.
Команда jmap -dump:live,format=b,file=dump.hprof pid
может экспортировать файл снимка.
Тогда мы должны помочь MAT
такого рода инструментов анализа для запуска на.
проблема позиционирования
В самом деле, очевидно, что эта картина, есть очень большая строка в памяти, и эта строка просто это временная ссылка на целевой нить.
Возможно забыть об этой строке памяти, занятой около 258 млн, на строку уже очень большие объекты.
Эта строка является громким шумом, который произвел его?
На самом деле, посмотрите на изображении выше цитируемость отношений и строка не трудно видеть , что это заявление.insert
SQL
Затем надо похвалить MAT
этот инструмент, он может помочь вам предсказать , снимок памяти дает снимок проблемного мест на один и те же нити , которые могут возникнуть.
Окончательный снимок нашел эту тему по конкретной бизнес-код:
Он вызывает метод в записи в базе данных, и этот метод будет сращивать с insert
заявлением, в котором values
это сшивание поколение цикла, вероятно , следующим образом :
<insert id="insert" parameterType="java.util.List">
insert into xx (files)
values
<foreach collection="list" item="item" separator=",">
xxx
</foreach>
</insert>
复制代码
Поэтому, как только этот список очень большой, эта мозаика оператор SQL будет очень долго.
Только с помощью анализа памяти на самом деле можно увидеть , что это List
очень большой, это также привело к окончательному insert
большое заявление занимаемой памяти.
Стратегия оптимизации
Так как это хорошо, чтобы найти причину этой проблемы будет решена, есть два направления:
- Контроль исходного
List
размера, этоList
будет приобретено у таблиц данных, может приобретать подкачки, так что последующиеinsert
заявления будут уменьшены. - Контроль размер партии данных записи, на самом деле, суть или должны сращивание
SQL
длины вниз. - Вся эффективность письма должна быть пересмотрена.
резюме
Проблема не решает долгое время, проведенное на основе анализа, который все еще относительно типичны, в котором процесс подытожить:
- Сначала найдите потребительский
CPU
процесс. - Переориентация потребляет
CPU
определенную нить. - Проблемы с памятью
dump
анализа снимков. - Заключенный настроить код, результаты тестирования.
Наконец, я хотел бы не получил предупреждение производства.
Поделитесь своими пальцами и самая большая поддержка для меня