我正在运行一个占用大量CPU的网站,这是因为大量的缩略图图像。
这是我目前的工作方式:
用户将图像上传到服务器
服务器保留一份副本,并将图像存储在Amazon S3上
当请求缩略图时,服务器使用本地副本生成它,然后将其存储在S3上。然后将S3 URL提供给客户端
后续请求的优化如下:服务器将S3 URL缓存在memcached中,因此它不会再次执行该工作;如果文件存在,服务器将不会再次生成缩略图;服务器使用中型缩略图生成小型缩略图,因此不要使用不必要的大文件
现在,我在一个Linode 4G实例上托管(8个内核,具有4倍优先级,4GB RAM),尽管进行了优化,并且内存缓存命中率为70%,但我的平均CPU是170%。我一直看到所有8个CPU都同时频繁地以100%的峰值运行。
我正在使用nginx和gunicorn服务于Django应用程序,并且缩略图是使用PIL生成的。
如何改善这种架构?
我在考虑几种可能性:
#1。最简单:添加第二台相同的服务器,并在其前面放置一个负载均衡器,以便它们共享负载。
问题是这两个服务器不会共享本地图像缓存。我可以通过将这种份额放在网络驱动器上来解决此问题,还是延迟最终会阻碍收益?
#2。有点困难:将缩略图代码作为单独的Web服务从我的应用程序中分离出来,该代码将在第二台服务器上运行。这样,主应用程序和数据库就不会遭受高CPU使用率的困扰,并且可以快速提供网页。缩略图已通过JavaScript异步提供
有人可以推荐其他解决方案吗?
最佳答案
您确定性能问题来自缩略图吗?好的,我想您已经检查了。
您可以在用户上传图像后立即(或不久)缩小2个缩略图并将其上传到S3。这样,您应该可以节省不必要的CPU负载,您现在浪费在为每个HTTP请求检查这些缩略图并使用memcached进行IPC上。
关于performance - 如何改善这种架构的性能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19795595/