Как бы я решил эту проблему профилирования производительности веб-сервера .net? - PullRequest
1 голос
/ 01 декабря 2010

Я использую Профилировщик производительности Redgate для тестирования моего приложения asp.net mvc 2. Одна из вещей, которые я обнаружил, заключалась в том, что XMLSerializer занимал слишком много процессорного времени, поэтому, ссылаясь на этот пост . Я изменил его, где он использует XmlSerializerCache сейчас.

Теперь проблема XmlSerializer больше не существует, и я профилирую приложение, симулируя 80 пользователей одновременно, используя веб-сайт с Jmeter. Так что теперь лучшие методы, которые занимают время, делают FirstOrDefault() на некоторых данных, которые я извлекаю, я приведу пример-

var values=(from c in DataContext.Table1
           join s in DataContext.Table2 on new { c.Id, c.date } 
            equals new { s.Id, s.date } into list
                          where c.Id== Id && c.date == date
                          from s in list.DefaultIfEmpty()
                          select new DayDTO()
                          {
                              Points = c.points,
                              Points1 = c.points1,
                              Points2 = c.points2,
                              Points3 = c.points3,
                              Points4 = c.points4
                          }).FirstOrDefault();

Может кто-нибудь предложить мне, что я могу сделать, чтобы улучшить это? Текущее время составляет 25 секунд и 16 секунд для двух лучших методов. Это только потому, что я симулирую 80 пользователей одновременно, и есть некоторые проблемы на стороне базы данных (SQL Server 2005), такие как слишком большая таблица и индексация и т.д ... и я рассмотрю это, но в настоящее время я пытаюсь определить любые проблемы, которые вы видите с кодом, то есть проблемы на стороне C #.

Буду признателен за любую помощь, спасибо!

Ответы [ 2 ]

2 голосов
/ 01 декабря 2010

Предполагается, что верхнее время - это «включающее время», а не «исключительное время».

Включающее время означает, что оно включает любой код, вызываемый методом, в этом случае FirstOrDefault выполнит вызов базы данных.Вызовы базы данных дороги в контексте задержки, но поток ЦП блокируется и не использует ЦП во время ожидания вызова базы данных.

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

Если это проблема, вам нужно ускорить фактический запрос SQL.Вы должны запустить SQL Profiler, поймать реальный вопрос, а затем запустить его в SQL Management Studio.Посмотрите на план выполнения, чтобы увидеть, если запрос медленнее, чем ожидалось, и попытайтесь выяснить, почему.Если он слишком медленный, вы можете начать с индексации.

1 голос
/ 01 декабря 2010

FirstOrDefault, вероятно, вызывается как виновник просто потому, что это метод, который вызывает перечисление в вашем случае.Если вы добавите .ToList () перед ним, вы обнаружите, что бремя переместится на .ToList ().

...