2011-07-07 1 views
1

Я только начинаю возиться с BookSleeve (и redis) в Windows и просто хочу посмотреть, могу ли я получить какое-то направление от того, что я могу делать неправильно здесь. Используя следующий код, а затем запустив ab против него, я могу обслуживать ~ 500 запросов до того, как сработает w3wsvc.exe. Когда я присоединяюсь к процессу для отладки, я вижу, что запрос на сервер redis отключен.BookSleeve Wait() тайм-аут на странице Razor во время бенчмаркинга

@using (var conn = new BookSleeve.RedisConnection("localhost")) 
{   
    conn.Open(); 
    var catgrabber = conn.ListRange(0,"categories",0,-1); 
    byte[][] categories = conn.Wait(catgrabber); 
    foreach (byte[] category in categories) 
    { 
     <h3> @System.Text.UTF8Encoding.UTF8.GetString(category) </h3> 
     var actgrabber = conn.ListRange(0, String.Format("activity:{0}", 
      System.Text.UTF8Encoding.UTF8.GetString(category).Replace(' ', '_')), 0, - 1); 
     byte[][] activities = conn.Wait(actgrabber); 
     foreach (byte[] activity in activities) 
     { 
      <label for="@System.Text.UTF8Encoding.UTF8.GetString(category).Replace(' ', '_'):@System.Text.UTF8Encoding.UTF8.GetString(activity):12345"> 
      <input type="checkbox" id="@System.Text.UTF8Encoding.UTF8.GetString(category).Replace(' ', '_'):@System.Text.UTF8Encoding.UTF8.GetString(activity):12345" value="@System.Text.UTF8Encoding.UTF8.GetString(activity)"/> 
      @System.Text.UTF8Encoding.UTF8.GetString(activity) 
     </label><br /> 
     } 
    } 
} 

Я еще не установил .NET async/wait CTP.

Теперь, для всего лишь одной веб-страницы, это отлично работает. Я просто хотел грохнуть на сервере хостинг это так что я сделал ...

ab -n 1000 -c 5 http://server/page.cshtml

Это будет служить 500-700 запросов, а затем крах. Хотя я не уверен, что когда-либо буду иметь такую ​​нагрузку, я считаю, что это указывает на явную ошибку в моем коде и хотелось бы, чтобы кто-то умнее, чем я указываю, что я делаю неправильно.

Спасибо!

ответ

2

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

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

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

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