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

ASP.NET High CPU ставит серверы на колени

Хорошо, наша новая сборка имеет 100% скачков ЦП на каждом сервере через случайные промежутки времени. На долгое время сайт полностью не отвечает - это будет в часы пик, когда люди из разных стран заходят на сайт и т. Д.

Мы рассмотрели perfmom, профилировщики памяти, профилировщик CLR, профилировщики sql, профилировщик муравьев Red Gate, попробовали нагрузочное тестирование в UAT, но даже не смогли воспроизвести проблему. Это может означать, что только тысячи пользователей попадают на действующий сайт, и это происходит.

Мы заметили одну закономерность, заключающуюся в том, что новый код - сломанная сборка - на самом деле использует заметно меньше потоков.

Мы также используем пружину для IOC - у этого есть репутация кровати?

Что еще хуже, мы не можем развернуть в реальном времени из-за влияния на бизнес - поэтому не можем сузить проблему до подмножества новых функций, которые мы добавили.

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

Предлагаю делать дампы памяти и анализировать их в WinDdg с помощью Sos. Я исправил некоторые проблемы в нашей продукции, которые, вероятно, не смог бы диагностировать без WinDbg.

Тесс Фернандес ведет отличный блог, где можно узнать, как анализировать дампы памяти.

Это виртуальный сервер с общими ресурсами или физический сервер? Если это первое, возможно, вам стоит выделить ресурсы для этого сервера. Удачи...

Обычно это вызвано очисткой больших долгоживущих объектов в GC (У stackoverflow была эта проблема, см. ссылку). Вы храните много коллекций объектов в кеше или сеансе?

Нападение GC

Я также рекомендую вам создать и настроить новый сервер для тестирования. Если у вас случайное безумие, и вы не знаете, почему, и не можете его воспроизвести, я бы указал пальцем на оборудование или конфигурацию, а не на код.

Попробуйте использовать cache server как фронтенд как Apache Traffic Server (ATS).

Хотя это не решит проблему, это может помочь ее выявить, потому что в то же время вы переместите потенциально опасную нагрузку с бэкэнда (посмотрите, есть ли проблемы и с внешним интерфейсом) и сделаете вещи менее нагретыми на бэкэнде, чтобы он легче увидеть, что не так.

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

  1. Ты должен репро эта проблема. Jmeter - хорошее начало из-за его широты, но мы не можем порекомендовать подходящий инструмент, не зная нашей архитектуры.
  2. логирование особенно на вашем прикладном уровне является обязательным. Вы можете включить трассировку IIS для снижения производительности, но маппеты в Microsoft сделали это так, что вы не можете захватить весь поток конвейера, когда он медленный. Если это так сложно воспроизвести, вам действительно нужны журналы, которые помогут вам сузить где проблема в. (например, о, это всякий раз, когда мы вызываем эту сохраненную процедуру).

100% CPU немного подозрительно в том смысле, что это вряд ли будет ввод-вывод (если db - это еще один блок, медленная база данных не должна вызывать 100% CPU на веб-серверах). Вам нужно присмотреться к дому.