Memsniff:一款开源的Memcached流量分析工具

背景介绍

在<span "="">知名在线资源存储网站Box上,我们看到云服务已经经历了从一小撮应用服务器和数据库到高规格、高性能协作平台的转变。像大多数大型网络公司一样,Box也依赖于使用分布式缓存层来缓存经常访问的数据。

Box使用memcached(一个高性能的分布式内存对象缓存系统)每天为经常使用的数据对象提供数十万亿请求。然而,我们偶尔也会碰到某些数据对象的访问频率突然变得很高的现象(即出现热键,hot key),热键问题的诱因有很多,有可能是因为后台任务造成的,也有可能是因为应用程序处理不当,又或者是因为用户频繁的活动。

在下图中,我们可以看到几个memcached服务器其中一个网络带宽突然激增的现象(棕色曲线部分表示出现了热键问题)。这种现象会导致数据服务器带宽负载过重,影响缓存服务器提供高性能的服务。

在此次事件中,很难确定是哪些数据导致了这一问题。因为与数据库不同的是,许多缓存系统为了高效地处理请求,几乎不提供日志,所以很难进行判定。这时就需要一种不同的方法来识别热键。

如今,Box正式推出了memsniff——一款强大的memcached开源流量分析工具。它通过检查memcached服务器上的网络数据包,来分析数据键并提供各个数据键的实时统计信息,包括数据大小、请求速率以及占用的带宽。如此一来,就可以在不影响memcached服务器的情况下识别热键。

Memsniff操作步骤

作为一款强大的、高效和可扩展的开源工具,memsniff的灵感来自于Etsy的mctop和Tumblr的memkeys。它可以在大量流量负载的情况下处理几乎所有的网络数据包(超过99.99%)。此外,它使用golang的简单多线程原语,并在不占用太多CPU或内存的情况下发挥高性能,具体参见下图:

安装Memsniff

memsniff使用了标准的 golang工具链(toolchain),这使得安装过程变得更为便捷。如果你已经安装了golang工具链,并设置了GOPATH环境变量,那么可以通过如下的命令来构建memsniff:

$ go get github.com/box/memsniff $ go build github.com/box/memsniff

使用Memsniff

memsniff需要超级用户权限来捕获大多数操作系统上的网络数据包,-i 参数是必备的,需要用它来指定网卡接口。使用示例:

$ sudo memsniff -i eth0 memsniff还具有从tcpdump的数据包转储文件中读取数据的能力。 $ sudo memsniff -r eth0.pcap 参见memsniff的GitHub主页,了解其他更多的命令行选项。

Memsniff的工作原理

1. 使用 GoPacket 从 libpcap 主线程上捕获原始数据包; 2. 批量的原始数据包被发送到解析工具中,随后,工作人员开始对原始数据包中的memcached协议部分进行解析,来寻找GET请求的响应消息。从中提取返回值的数据键和数据项大小; 3. 提取出来的响应概要被发送给分析工具,然后,根据数据键进行哈希分区,并发送给工作线程。每一个工作线程持有一个分区; 4. 响应来自UI的定期请求,分析工具将各个工作线程的报告合并到单个排序的列表中,并将其展示给UI用户。

Memsniff的性能

在一台运行Intel Xeon E5-2470处理器的服务器上,每秒钟可以处理约35万个memcached请求,具体数据如下:

使用了4-5个核(约20个线程,每个CPU使用率约为20%); 100%的数据包处理; 展示99.99%的数据包,表明启动时丢弃了一小部分数据包; 在发生热键问题,网络接口(NIC)出现饱和时,仍然可以处理99.9%的数据包; 使用40MB左右的堆内存(heap); 100MB左右的RSS(可通过GOGC调节); 平均GC停顿:0.6毫秒; 最大GC停顿:2.0毫秒;

Memsniff愿景/路线图

我们期待memsniff将以下面的方式进一步发展:

深化功能

TCP stream重组:get-miss跟踪、支持二进制协议,支持redis; 触发器(例如,当热键出现时发出警报); 当满足指定条件时自动记录日志到磁盘(例如集成或单个数据键的流量超过阈值); 能够将数据收集限制为与过滤器匹配的数据键; 跟踪单个请求/响应周期; 根据客户端IP限制流量;

改进功能

支持非默认memcached服务器端口; 支持其他替代的排序方式; 支持同时监听多个服务器端口的流量; 支持GET以外的其他操作; 视图过滤; 创建稳定的报告格式,并输出到磁盘; 为其他格式的包(如deb、rpm等)提供构建支持;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏抠抠空间

漫谈单点登录(SSO)

1.5K50
来自专栏架构师之路

数据库秒级平滑扩容架构方案

一、缘起 (1)并发量大,流量大的互联网架构,一般来说,数据库上层都有一个服务层,服务层记录了“业务库名”与“数据库实例”的映射关系,通过数据库连接池向数据库路...

60190
来自专栏IT技术精选文摘

聊聊C10K问题及解决方案

1 C10K问题 大家都知道互联网的基础就是网络通信,早期的互联网可以说是一个小群体的集合。互联网还不够普及,用户也不多。一台服务器同时在线100个用户估计在当...

68490
来自专栏IT技术精选文摘

分布式系统关键技术之服务调度

服务关键程度要通过对业务的梳理来发现。服务依赖关系用Spring Cloud的一套方法就能够非常好的解决,但是千万不要出现循环依赖,解决方式是通过第三方的消息队...

20540
来自专栏喔家ArchiSelf

老曹眼中的负载均衡

负载(load)一词起源于典型系统,指连接在电路中消耗电能的装置,负载(用电器)的功能是把电能转变为其他形式能。引申出来,一个是实体,一个转化。

23950
来自专栏FreeBuf

看我如何发现苹果公司官网Apple.com的无限制文件上传漏洞

最后,我也因此测试漏洞收获了苹果官方不菲的赏金,以及漏洞名人堂的入榜致谢。好吧,我们一起来看看这个苹果官网的无限制文件上传漏洞。

17130
来自专栏非著名程序员

Android开发方便快捷的8个好工具,你造吗?

Android是第二个最流行的用于 智能手机和平板电脑 的操作系统。这里有8个最好的 Android工具以许多不同的方式 帮助开发人员 ,例如 - SDK和AV...

21570
来自专栏恰童鞋骚年

Hadoop学习笔记—14.ZooKeeper环境搭建

从字面上来看,ZooKeeper表示动物园管理员,这是一个十分奇妙的名字,我们又想起了Hadoop生态系统中,许多项目的Logo都采用了动物,比如Hadoop采...

9920
来自专栏纯洁的微笑

构建高可用网关之容错实践

自从微服务概念以来,众多的软件架构在践行着这一优秀的设计理念。各自的系统在这一指导思想下收获了优雅的可维护性,但一方面也给接口调用提出了新的要求。比如众多的AP...

41970
来自专栏技术博文

Linux下常用压缩 解压命令和压缩比率对比

常用的格式有: tar, tar.gz(tgz), tar.bz2, 不同方式,压缩和解压方式所耗CPU时间和压缩比率也差异也比较大。 1. tar 只是打包...

1.2K70

扫码关注云+社区

领取腾讯云代金券