如果你翻阅过一些关于大型网站扩展(Scaling)的资料,那么你可能听说过一个叫memcached 的 东西。memcached是一个高性能、分布式的内存对象缓存系统。我们Facebook可能是世界上最大的memcached用户了。我们利用 memcached来减轻数据库的负担。memcached确实很快,但是我们还要让他更快、更高效。我们使用了超过800台服务器,提供超过28TB的 内存来服务于用户。在过去的一年里,随着Facebook的用户量直线上升,我们遇到了一系列的扩展问题。日益增长的需求使得我们必须对操作系统和 memcached进行一些修改,以获得足够的性能来为我们的用户提供最好的体验。
因为我们有好几千台机器,每个都运行了几百个Apache进程甚至更多,最终导致到memcached进程的TCP链接有几十万个。这些链接本身并 不是什么大问题,但是memcached为每个TCP链接分配内存的方法却很成问题。memcached为每个链接使用单独的缓存进行数据的读写。当达到 几十万链接的时候,这些累计起来达好几个G——这些内存其实可以更好地用于存储用户数据。为了收复这些内存,我们实现了一个针对TCP和UDP套接字的每 线程共享的链接缓存池。这个改变使每个服务器可以收回几个G的内存。
虽然TCP上我们改进了内存的使用效率,但我们还是转向了UDP,目的是让get(获取)操作能降低网络流量、让multi-get(同时并行地获 取几百个键值)能实现应用程序级别的流量控制。我们发现Linux上到了一定负载之后,UDP的性能下降地很厉害。这是由于,当从多个线程通过单个套接字 传递数据时,在UDP套接字锁上产生的大量锁竞争导致的。要通过分离锁来修复内核恐怕不太容易。所以,我们使用了分离的UDP套接字来传递回复(每个线程 用一个答复套接字)。这样改动之后,我们就可以部署UDP同时后端性能不打折。
另一个Linux中的问题是到了一定负载后,某个核心可能因进行网络软终端处理会饱和而限制了网络IO。在Linux中,网络中断只会总是传递给某 个核心,因此所有的接受软终端的网络处理都发生在该内核上。另外,我们还发现某些网卡有过高的中断频率。我们通过引入网络接口的“投机”轮询解决了这两个 问题。在该模型中,我们组合了中断驱动和轮询驱动的网络IO。一旦进入网络驱动(通常是传输一个数据包时)以及在进程调度器的空闲循环的时候,对网络接口 进行轮询。另外,我们也用到了中断(来控制延迟),不过网络中断用到的数量大大减少(一般通过大幅度提升中断联结阈值interrupt coalescing thresholds)。由于我们在每个核心上进行网络传输,同时由于在调度器的空闲循环中对网络IO进行轮询,我们将网络处理均匀地分散到每个核心上。
最后,当开始部署8核机器的时候,我们在测试中发现了新的瓶颈。首先,memcached的stat工具集依赖于一个全局锁。这在4核上已经很令人 讨厌了,在8核上,这个锁可以占用20-30%的CPU使用率。我们通过将stats工具集移入每个线程,并且需要的时候将结果聚合起来。其次,我们发现 随着传递UDP数据包的线程数量的增加,性能却在降低。最后在保护每个网络设备的传送队列的锁上发现了严重的争用。数据包是由设备驱动进行入队传输和出 队。该队列由Linux的“netdevice”层来管理,它位于IP和设备驱动之间。每次只能有一个数据包加入或移出队列,这造成了严重的争用。我们当 中的一位工程师修改了出队算法,实现了传输的批量出队,去掉了队列锁,然后批量传送数据包。这个更正将请求锁的开销平摊到了多个数据包,显著地减少了锁争 用,这样我们就能在8核系统上将memcached伸展至8线程。
做了这些修改之后,我们可以将memcached提升到每秒处理20万个UDP请求,平均延迟降低为173微秒。可以达到的总吞吐量为30万UDP 请求/s,不过在这个请求速度上的延迟太高,因此在我们的系统中用处不大。对于普通版本的Linux和memcached上的50,000 UDP请求/s而言,这是个了不起的提升。
我们希望尽快将我们的修改集成到官方的memcached仓库中去,我们决定在这之前,先将我们对memcached的修改发布到github 上。
相关推荐
1. **memcached概述**:memcached是由Danga Interactive公司开发的一款内存键值存储系统,最初用于LiveJournal,后来广泛应用在许多大型网站,如Facebook、Twitter等。它旨在简化动态Web应用程序的数据存储,通过...
Facebook的工程师们对开源Memcached进行了一系列的改进,以适应其庞大的用户规模和流量。这包括: - 数据分片和分布式缓存的实现; - 高可用性和数据复制策略; - 客户端和服务器端的负载均衡; - 系统监控和故障...
总的来说,Memcached是提升Web应用性能的重要工具,尤其在大数据量、高并发的场景下,正确使用和配置Memcached能显著改善用户体验,减轻数据库压力。在Linux环境下,通过合理的安装、配置和管理,可以充分利用其特性...
个人整理memcached缓存技术资料: 目录如下: ...用于提升LiveJournal . com访问速度的。LJ每秒动态页面访问量几千次,用户700万。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。
这些网站和服务通过部署Memcached实现了数据的高速缓存,极大地提升了用户体验,同时降低了对后端数据库的压力。 #### 三、Memcached与Redis比较 虽然Memcached和Redis都是流行的内存数据存储系统,但它们之间存在...
### Memcached内存分析、调优、集群 ...通过对内存分配机制、性能优化技巧以及集群部署策略的理解,可以有效地提升Web应用的整体性能。未来随着技术的发展,Memcached也将不断演进,更好地满足不同场景下的需求。
Memcached是一个基于内存的键值对存储系统,它不支持复杂的数据结构,只能存储简单的字符串。因此,当我们需要将Java实体(可能是POJO或数据库映射的对象)保存到Memcached时,通常需要将其序列化为字节流,然后再...
Memcached是一种高性能的分布式内存缓存系统,广泛应用于加速动态Web应用程序,通过减少对数据库的访问来提升网站性能。其核心特性包括: 1. **高速缓存**:Memcached采用内存作为存储介质,提供比硬盘更快的数据...
- `mcrouter`: Facebook开源的多路由Memcached客户端,支持故障切换和负载均衡。 - `mcstat`: 实时监控Memcached的性能指标。 8. **最佳实践** - 保持键的简洁性,避免使用过长的键名,以节省内存。 - 尽可能...
memcached 是一款高效、轻量级的分布式内存缓存系统,由 Danga Interactive 公司的 Brad Fitzpatrick 首创,现广泛应用于众多大型互联网服务,如 mixi、hatena、Facebook 和 LiveJournal 等,以提升 Web 应用的性能...
3. **mcrouter**:Facebook开发的一个路由工具,可以根据预定义的策略将请求分发到多个Memcached实例,提供更高级的故障转移和负载均衡功能。 ### 学习资源 从提供的链接中,我们可以找到一篇关于Memcached的博客...
它最初由 LiveJournal 的 Danga Interactive 创建,现在广泛应用于各种Web应用程序,如Facebook、Twitter等。 ### 服务端详解 **安装 Memcached 服务端** `memcached-1.4.13.tar.gz` 是 Memcached 的源代码包,...
5. **缓存策略**:Facebook利用Memcached和Redis这样的内存数据存储进行高速缓存,以减少对数据库的直接访问,提高响应速度。同时,他们还实施了复杂的缓存更新策略,确保数据的实时性和一致性。 6. **图形数据库**...
Memcached是一个自由开源的系统,由Danga Interactive公司的Brad Fitzpatrick领导开发,现已成为包括mixi、hatena、Facebook、Vox、LiveJournal在内的众多服务中提升Web应用扩展性的关键组件。 Memcached作为一种...
文中提到了一些知名的互联网公司,如Facebook、YouTube和Reddit,它们都部署了大型的Memcached服务器集群来处理大量键值对请求,这表明了Memcached在现代Web服务中的重要性。这些服务器集群的规模和请求处理量都在...
【Memcached 入门文档】 ...总之,Memcached是提升Web应用性能的有效工具,尤其适合那些需要快速读取、但对数据持久化要求不高的场景。理解其工作原理和最佳实践,能够帮助开发者更好地利用这一强大的工具。
Memcached 是一个高性能的分布式内存对象缓存系统,广泛应用于许多大型网站,如Facebook、Twitter等,用以缓解数据库负载,提升系统性能。它的工作原理是将数据存储在内存中,以便快速访问,从而减少对数据库的直接...
Facebook的源码还会包含对基础设施的管理,如自动化部署、持续集成/持续部署(CI/CD)流程、监控和日志系统等,这些都是大型项目不可或缺的部分。 9. **开源项目**: Facebook是多个开源项目的贡献者,如Open Graph...
**Memcached** 是一款高效、分布式内存对象缓存系统,设计初衷是为了提升网站的访问速度,尤其是对于动态网页应用。最初由 Danga Interactive 的 Brad Fitzpatrick 为 LiveJournal 开发,现已被众多大型网站广泛采用...
“无底洞现象”是由Facebook工作人员提出,他们在使用大量Memcached节点时发现,随着节点的增加,由于批量操作(如multiget)需要跨多个节点进行,导致网络IO增加,反而降低了效率。这是因为键的分布与业务无关,...