关注我们

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

LzersLzers 安全工具 2018-04-13 228460 0

背景介绍

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

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

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

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

安装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的工作原理

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

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等)提供构建支持;


版权声明

本文仅代表作者观点,不代表黑白网立场。
如文章侵犯了您的权利,请通过邮箱联系我们删除。
详情查看:版权纠纷
E-Mail:server@heibai.org

喜欢0评论已闭