performance - 我怎样才能提高这个架构的性能?

标签 performance web architecture cluster-computing server-side

我正在运行一个由于大量图像缩略图而占用大量 CPU 资源的网站。

这是我目前做事的方式:

  1. 用户上传图片到服务器
  2. 服务器保留一份副本,并将图像存储在 Amazon S3 上
  3. 当请求缩略图时,服务器使用本地副本生成它,然后将其存储在 S3 上;然后将 S3 URL 提供给客户端
  4. 后续的请求是这样优化的:服务器在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/

相关文章:

html - 多尺寸的 favicon .ico 文件会影响网页加载速度吗?

python - 优化python中的双循环

javascript - 为 Violentmonkey 创建 iframe 脚本

c# - 将 Web 服务与 EF 一起使用时出现异常

.net - 什么是处理长时间运行任务的良好 API 架构?

MySQL 十进制列 ORDER BY 查询索引

.net - System.Activator.CreateInstance(T) 是否存在足以阻止我们随意使用它的性能问题?

java - web.xml中的Java错误页面不适用于所有请求

node.js - Node.js 中的一个大应用程序与多个小应用程序

ios - 一起开发 iphone 和 ipad 应用程序时的最佳做法是什么?