MVC3 + Потоковое изображение из базы данных вызывает очень высокую загрузку процессора на моем сервере

У меня есть этот сайт, который передает изображения из базы данных (SQL2008), и я думаю, что именно он вызывает очень высокую загрузку ЦП на моем сервере. Загрузка процессора составляет не менее 60-90%.

Я использую MVC3 и ниже код в моем контроллере, который отправляет изображение в представление:

 [OutputCache(Duration = 86400, VaryByParam = "GUID")]
 public FileStreamResult GetFile(string guid)
    {
        Guid id = new Guid(guid);
        Thumbnail thumbnail = thumbService.GetThumbnailByGUID(id);
        Stream stream = new MemoryStream(thumbnail.FileContent.ToArray());
        var fsr = new FileStreamResult(stream, "image");
        return fsr;
    }

Вид:

 <div style="background:url('@url');background-repeat:no-repeat;background-position:50% top;background-color:#fff;" class="photoThumb">

@Url выше - это /GetFile/guid

Может кто-нибудь сказать мне, что я делаю не так?

Спасибо

Обновления на ответ и еще один вопрос:

[OutputCache(Duration = 86400, VaryByParam = "GUID")] из приведенного ниже ответа сработал и улучшил производительность сайта. Использование ЦП снизилось до 8-60%, но я также хочу убедиться, что все утилизировано, поэтому я хочу знать, делает ли FileStreamResult это для меня, или я должен сделать это вручную?

2 ответа

Решение

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

Если вы украшаете свои действия с

[OutputCache( Duration = 86400, VaryByParam = "id" )]

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

Вы также можете изменить, как показано ниже.

[OutputCache(Duration = 86400, VaryByParam = "GUID")]
     public FileStreamResult GetFile(string guid)
        {
            Guid id = new Guid(guid);
            Thumbnail thumbnail = thumbService.GetThumbnailByGUID(id);
            var fsr; 
            using(Stream stream = new MemoryStream(thumbnail.FileContent.ToArray()))
            {
                fsr = new FileStreamResult(stream, "image");
            }
            return fsr;
        }

Как уже упоминалось в комментарии выше, при визуализации вашей страницы FileStreamResult будет автоматически уничтожен.

Другие вопросы по тегам