【问题标题】:Software/system to serve large quantities of images?提供大量图像的软件/系统?
【发布时间】:2009-11-24 00:30:51
【问题描述】:

在我们的高峰时段,我们需要提供大约 250/rps 的服务。我们正在做的是接受图像的 url,将图像从内存缓存中拉出,然后通过 Apache 返回。

我们目前的系统是双核机器,内存为 4GB:2GB 用于 memcache 中的图像,2GB 用于 Apache;但是我们在高峰期看到了非常高的负载(20-30)。 Apache 报告的平均响应时间是每个请求 30-80 毫秒,这对于从内存提供的简单 Apache 请求来说似乎有点慢。

有更好的工具吗?从磁盘提供服务不是一个选项,因为 IO 等待阻碍了它,所以我们将它移到内存中。 CDN 是如何做到的?

编辑:嗯,系统是这样工作的。一个请求进来,我们检查一个“队列”,看看我们以前是否见过这个请求,如果我们有我们提供图像(从磁盘......或内存)。如果不是,我们在 memcached 队列中增加该请求的计数器,并且有工作机器实际生成图像,然后将其存储回主服务器。因此,目前当请求进来时,我们正在检查 memcached 数据库是否存在,然后我们将连接到另一个数据库以获取实际的图像数据库。当图像在磁盘上时,我们发现只有 file_exist 函数需要 30 多毫秒才能完成,因此我们将其移至内存。如果我们将图像移动到 ramdisk 会加快 file_exist 的速度,还是我们仍然需要先检查一下是否应该寻找图像?

【问题讨论】:

    标签: apache memcached c10k


    【解决方案1】:

    你看过nginx吗?

    根据 Netcraft 在 2009 年 5 月,nginx 服务或代理 3.25% busiest sites。也可以serve from memcached

    【讨论】:

      【解决方案2】:

      根据图像的大小,Apache 应该可以毫无问题地处理这个问题。我们有一个 Apache 服务 2000 个请求/秒,响应的平均大小是 12K。这台机器有 32GB 内存,所以我们所有的内容都被缓存了。

      这里有一些调优技巧,

      1. 使用线程化的 MPM,如 worker,打开大量线程(我们有 256 个)。
      2. 使用 mod_cache 以便所有图像都在内存中
      3. 为 Apache 进程分配尽可能多的内存

      当您说 memcache 时,您是指 memcached 服务器吗?运行 memcached 会更慢,因为 TCP 连接的延迟(即使它是环回)比直接访问内存要大得多。

      如果您可以将所有图像都放在内存中,那么 RAM 磁盘也会有很大帮助。

      【讨论】:

      • 是否有另一个系统可以直接从内存中读取而无需 tcp 连接...比如共享内存之类的?
      • mod_cache 将读取文件一次并将其存储在内存中。如果您想确保文件是从内存中提供的,请尝试 mod_file_cache:httpd.apache.org/docs/2.0/mod/mod_file_cache.html
      猜你喜欢
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 2011-09-09
      • 2015-04-03
      • 2011-10-01
      • 1970-01-01
      相关资源
      最近更新 更多