我正在运行一个由于大量图像缩略图而占用大量 CPU 资源的网站。
这就是我目前做事的方式:
- 用户上传图片到服务器
- 服务器保留一个副本,并将图像存储在 Amazon S3 上
- 当请求缩略图时,服务器使用本地副本生成它,然后将其存储在 S3 上;然后将 S3 URL 提供给客户端
- 后续请求优化如下: 服务器将 S3 URL 缓存在 memcached 中,因此不再做该工作;如果文件存在,服务器将不再生成缩略图;服务器使用中等大小的缩略图来生成小尺寸的,所以不要处理不必要的大文件
现在,我托管在一个 Linode 4G 实例(8 核,4x 优先级,4GB RAM)上,尽管我进行了优化并且内存缓存命中率为 70%,但我的平均 CPU 为 170%。我经常看到所有 8 个 CPU 同时以 100% 的频繁峰值工作。
我正在使用 nginx 和 gunicorn 来为 Django 应用程序提供服务,并且缩略图是使用 PIL 生成的。
我该如何改进这个架构?
我想了几个可能性:
#1。最简单:添加第二个相同的服务器,前面有一个负载均衡器,这样他们就可以分担负载。
这样做的问题是两台服务器不会共享本地图像缓存。我可以通过将此类共享放在网络驱动器上来解决这个问题,还是延迟最终会阻碍收益?
#2。更难一点:将缩略图代码从我的应用程序中分离出来,作为一个单独的 Web 服务,它将在第二台服务器上运行。这样主应用程序和数据库就不会受到高 CPU 使用率的影响,并且可以快速提供网页。无论如何,缩略图已经与 JavaScript 异步提供
任何人都可以推荐其他解决方案吗?