如何修复S3 / memcache延迟问题?

时间:2009-09-18 18:53:31

标签: memcached amazon-s3 amazon-ec2

我们的服务器上有严重的延迟问题。

我们在S3中存储了3个感兴趣的东西,并将它们填充到memcache中。

  • 平均约为25k的用户头像
  • text~1.5k
  • xml~1.5k

我们现在已经为memcached提供了128meg的ram ... 截至目前它正在骑着74兆的

做一些基本的数学我们应该能够轻松地拥有大约30,000个文本文档(使用xml表示它们)和1,000个用户头像,并且仍然在我们的128meg专用于memcache

现在我们有~100个用户头像可以在任何给定时间拉起来 我们有成千上万的text / xml文档,但它们没有被查看 就像头像一样...它就在这里,在那里有类型的东西

有时白天用户头像加载速度超慢(表示必须从s3加载)和其他时间(当然加载后),你可以告诉他们是从memcached提供的;与文本文件相同的东西

我们正在用REE在apache下运行merb。 我们正在使用基于libmemcached-0.25.14构建的evan weaver的memcached gem(我完全理解它不是最新的lib;这个gem需要它)

从我所看到的我们的延迟问题是因为S3确实存在严重的延迟问题(对于单个虚拟形象有时为500毫秒)。但是,考虑到应该一直缓存它似乎不应该是一个问题。缓存的默认到期时间设置为1周。

相关代码是:

@cache = MMCACHE.clone
begin
  picture = @cache.get("/avatars/#{user.avatar}")
rescue
  picture = user.picture
  @cache.set("/avatars/#{user.avatar}", picture)
end
@cache.quit

克隆/退出很重要,因为在apache / phusion中,当它分叉时会有共享连接的问题,如果我们没有关闭它们的连接,它们会一直存在,直到我们用完文件描述符。

我开始密切关注内存缓存,看看我是否可以追踪我的问题,但有任何建议吗?我们应该摆脱S3 ??

2 个答案:

答案 0 :(得分:6)

如果我理解正确,您将图像文件存储在S3支持的memcached中。

为什么不直接从S3引用图像,但在它们上设置Expires HTTP标头,以便客户端不会每次都拉它们,这有两个好处:

  1. 由于浏览器会从多个域中提取页面组件,因此页面加载速度会更快。

  2. 简化您的架构。

答案 1 :(得分:1)

您可以将Amazon CloudFront用于客户端浏览器提取的静态资源(如image,static html,css,javascript)。 CDN(内容交付网络)服务消除了此类数据的延迟问题;以下是服务的描述:

Amazon CloudFront是一种用于内容交付的Web服务。它与其他Amazon Web Services集成,为开发人员和企业提供了一种简单的方式,可以以低延迟,高数据传输速度和无需承诺的方式向最终用户分发内容。 Amazon CloudFront使用全球边缘位置网络提供您的内容。对象的请求会自动路由到最近的边缘位置,因此内容以最佳性能传递。 Amazon CloudFront可与Amazon Simple Storage Service(Amazon S3)无缝协作,后者可持久存储文件的原始版权。与其他亚马逊网络服务一样,使用Amazon CloudFront没有任何合同或每月承诺 - 您只需支付实际通过该服务提供的内容或内容。

此致 Sirmak