MVC3 + Streaming images from the Database is causing very high CPU usage on my server

走远了吗. 提交于 2019-12-11 19:48:53

问题


I have this site that streams images from the database (SQL2008), and I think it's the one causing the very high CPU usage on my server. The CPU usage is at least 60-90%.

I am using MVC3 and below is the code in my Controller that sends the image to the View:

 [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;
    }

The View:

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

The @url above is /GetFile/guid

Can anyone tell me what I'm doing wrong?

Thanks

Updates on the answer and another question:

The [OutputCache(Duration = 86400, VaryByParam = "GUID")] from the answer below worked and has improved the performance of the site. The CPU usage has now went down to 8-60% but I also want to make sure that everything is disposed so I want to know if FileStreamResult is doing that for me or should I do it manually?


回答1:


I'd guess that there is a database hit for each image request, with multiple images per page request - this could lead to high CPU usage. You should try caching the images.

If you decorate your action with

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

this should cache the result image for one day, meaning fewer db queries, and hopefully less load on your server.




回答2:


You can also modify as below.

[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;
        }

As mentioned in above comment, when your page render FileStreamResult will automatically dispose.



来源:https://stackoverflow.com/questions/10791933/mvc3-streaming-images-from-the-database-is-causing-very-high-cpu-usage-on-my-s

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!