Обзор вещей
в прошлую пятницу, черезГрафана Мониторинг, процессор и память неожиданно взлетели в онлайн-среде:
Однако, учитывая, что сетевой вход и входящий трафик не очень высоки, вероятность того, что сайт будет атакован другими, невелика.В дальнейшем нагрузка на сервер оставалась высокой, поэтому я мог только сохранить файл дампа для анализа и перезапустить серверы один за другим (к счастью, в пятницу все не работают)
Через анализ журнала
Так как сервер имеет высокую нагрузку в определенный момент времени, я сначала найду сервер, у которого были проблемы в начале, и найду трудоемкий сервис, например, я искал трудоемкий сервис базы данных в то время, потому что журнал прошлой недели был сброшен, поэтому позвольте мне описать это примерно:
[admin@xxx xxxyyyy]$ grep '15:14:' common-dal-digest.log | grep -E '[0-9]{4,}ms'
2018-08-25 15:14:21,656 - [(xxxxMapper,getXXXListByParams,Y,1089ms)](traceId=5da451277e14418abf5eea18fd2b61bf)
Вышеприведенное утверждениеЗапросите службу SQL, которая заняла более 1000 мс в файле common-dal-digest.log за минуту в 15:14.(На прошлой неделе я смотрел сервисы, которые занимали больше 10 секунд).
пройти черезtraceId для проверки журнала доступа, сохраненного Nginx., найдите пользовательский запрос, отправленный на сервер в данный момент времени. И в соответствии с traceId найти службы, используемые всем вызывающим процессом, и оказывается, что это действительно очень трудоемко...
Таким образом, я получил конкретную информацию о запросе, включая номер мобильного телефона для входа в систему пользователя, потому что в это время также увеличилась загрузка ЦП и памяти нескольких других серверов, поэтому я запросил журналы доступа нескольких других серверов в соответствии с мобильным телефоном. номер, и нашел один и тот же запрос, этот пользователь тоже звонил много раз...
Анализ файла дампа с помощью мата
Проанализируйте файл дампа с помощью инструмента mat, чтобы выяснить, какие запросы занимают много памяти:
Просмотрев дерево ссылок объекта, щелкните правой кнопкой мыши, чтобы выбрать [class_reference], просмотрите список объектов и просмотрите журнал GC, чтобы найти конкретную информацию об объекте.
Через файл журнала и дампа оба указывают на определенный интерфейс экспорта файлов, а затем анализируют конкретную ссылку вызова интерфейса в коде и обнаруживают, что экспортированных данных много, а логика расчета старого кода вложенных со многими циклами for, и эффективность вычислений низкая.
После запроса количества данных, вызываемых пользователем в этом интерфейсе, необходимо запросить три таблицы, а затем цикл for будет вычислять около 100+ раз, что блокирует другие запросы, а использование ЦП и памяти онлайн-сервера было уменьшено. парящий.
Код для оптимизации производительности
Когда я увидел, что git submit запись этого бизнеса была написана мной во время моей стажировки в прошлом году, у меня сердце сжалось, я не был знаком с бизнесом на тот момент, поэтому я прямо вызывал старый код в цикле, и я никогда не проверил такой большой объем данных. , так что GG отсутствует.
Затем я начал оптимизировать производительность кода.Во-первых, я тщательно разобрался во всем бизнес-процессе.Увеличив условия SQL-запроса, я уменьшил объем ввода-вывода в базу данных и данных запроса, оптимизировал условия суждения и уменьшил для вложенности, количество петель и количество расчета.
Сравнение через jvisualVM
Сравните состояние ЦП и памяти, занимаемых новым и старым кодом
До оптимизации:
Оптимизировано:
После приведенной выше оптимизации, подсчитывая количество данных 1w для экспорта, требуется 48s для старого кода и 8s для нового кода
Конечно, поскольку эти данные вновь добавляются в локальную среду разработки, все еще есть некоторые различия в количестве пользовательских данных с проблемами OOM, но с оптимизированным кодом,Многие недопустимые данные были отфильтрованы при запросе к базе данных, а также добавлены условия фильтрации перед вычислением цикла for., поэтому фактическое вычисление сокращает количество вычислений.
Что ж, я оптимизировал его сам, и мне нужно дождаться тестовых пап, чтобы протестировать его, прежде чем я осмелюсь выйти в интернет.На этот раз мне нужно создать сумасшедшие данные.
Заметки о разработке
В начале разработки вопросы производительности не рассматривались, и задачи выполнялись только с мыслью об удовлетворении потребностей.Однако при увеличении количества данных могут возникать эти OOM проблемы.Поэтому при разработке в дальнейшем нужно учитывать следующие моменты:
- Наладьте процесс проектирования
- Подумайте, есть ли проблемы с производительностью
- Обсудите с менеджером продукта, чтобы контролировать условия запроса и уменьшить объем запроса.
- Уменьшите недопустимые запросы, запросы на слияние и операции обновления слияния при взаимодействии с базой данных.
- Уменьшите количество циклов, особенно для проблем с вложением циклов!
- Обратите внимание на вызов старого кода =-=
Подавать жалобы
Конечно, каждый раз, когда я смотрю на код, который я написал раньше, я чувствую, что хочу si to siСыграйте в новый автомат с бюджетом 10 000 юанейИ выражение лица тети Шэнь такое смешное, что я использовала его напрямую~