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