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 будет автоматически уничтожен.