著名在线资源存储网站 Box.com 近日发布了 memsniff ——一个开源的 memcached 流量分析工具。该工具的推出是为了在不影响 memcached 服务器的情况下诊断热键(hot key)问题。
背景
Box 经历了从少数几台服务器和数据库到大规模、高性能平台的转变,与其他大型的网络公司一样,Box 也使用了分布式缓存层来缓存经常被访问的数据。不过他们有时候会碰到热键问题,也就是说,某些数据对象的访问频率突然变得很高,导致数据服务器带宽负载过重,也会影响缓存服务器提供高性能的服务。
下图展示了出现热键问题的 memcached 服务器的网络带宽走势,其中棕色曲线部分表示出现了热键问题。
导致热键问题的原因有很多,有可能是因为后台任务造成的,也有可能是因为应用程序处理不当,又或者是因为用户频繁的活动。大部分缓存系统出于性能方面的考虑,几乎不提供日志,所以很难确定是哪些数据导致了这个问题。
而 Box 推出的 memsniff 另辟蹊径,它通过检查 memcached 服务器的网络数据包来分析数据键并提供实时的统计信息,包括数据的大小、请求速率和占用的带宽。这样就可以在不影响服务器的情况下找出有问题的数据键。
memsniff 的灵感来自于 Etsy 的 mctop 和 Tumblr 的 memkeys ,它在高负载的情况下仍然可以处理几乎所有的网络包(超过 99.99%)。它使用了 golang 的多线程原语,并不会占用太多的 CPU 或内存,如下图所示。
安装 memsniff
memsniff 使用了标准的 golang toolchain ,如果已经安装了 golang toolchain,并设置了 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 的原理
- 使用 GoPacket 从 libpcap 主线程抓取原始数据包。
- 解码工作线程解析原始数据包中的 memcached 协议部分,找出 GET 请求的响应消息,从中抽取数据键和数据项大小。
- 抽取出来的概要信息被发送给分析工具,并根据数据键进行分区,每一个工作线程持有一个分区。
- 分析工具合并各个工作线程的报告,将其展示给 UI 用户。
memsniff 的性能
在一台配备了英特尔 Xeon E5-2470 处理器的服务器上运行 memcached,每秒钟处理 35 万个左右的请求,得出如下的数据。
使用了 4-5 个核(20 个左右的线程,每个 20% 左右的 CPU 使用率)
-
处理 100% 数据包
- 展示了 99.99% 的数据包,说明一直有一小部分数据包在启动时被丢弃。
- 在发生热键问题的时候,网络接口出现饱和,仍然可以处理 99.9% 的数据包。
-
使用 40MB 左右的堆内存
-
100MB 左右的 RSS(可以通过 GOGC 进行调整)
-
平均 GC 停顿 0.6 毫秒
-
最大 GC 停顿 2.0 毫秒
memsniff 路线图
更多的功能
- TCP stream 重组:get-miss 跟踪、支持二进制协议,支持 redis
- 触发器(例如在发生热键问题时发出告警)
- 在达到某些条件时自动记录日志(例如某个数据键的流量达到设定的阈值)
- 通过过滤器限制数据集
- 跟踪单个请求和响应
- 根据客户端 IP 限制流量
功能改进
- 支持指定 memcached 服务器端口
- 支持更多的排序方式
- 支持同时监听多个服务器
- 支持 GET 以外的操作
- 视图过滤
- 支持创建稳定的报告,并输出到磁盘
- 提供工具用于构建其他格式的包(如 deb、rpm 等)
感谢郭蕾对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们。
评论