Как мне решить эту проблему профилирования производительности веб-сервера .net?

Я использую профилировщик производительности 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), такие как слишком большая таблица и индексация и т.д... и я рассмотрю это, но в настоящее время я пытаюсь определить любые проблемы, которые вы видите с кодом, т.е. проблемы на стороне С#..

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


person Vishal    schedule 01.12.2010    source источник
comment
У вас есть доступ к операторам SQL, отправляемым на сервер, например. SQL Management Studio?, возможно, SQL, сгенерированный из Linq, неоптимален   -  person Sebastian    schedule 01.12.2010


Ответы (2)


Это предполагает, что верхнее время является «инклюзивным временем», а не «эксклюзивным временем».

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

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

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

person Albin Sunnanbo    schedule 01.12.2010

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

person John Saunders    schedule 01.12.2010