Memsniff:一个健壮的Memcached流量分析工具

2017 年 8 月 14 日

著名在线资源存储网站 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 eth0memsniff 也可以从 tcpdump 的数据包转储文件中读取数据。

$ sudo memsniff -r eth0.pcapmemsniff 的 GitHub 主页上提供了更多的参数说明。

memsniff 的原理

  1. 使用 GoPacket libpcap 主线程抓取原始数据包。
  2. 解码工作线程解析原始数据包中的 memcached 协议部分,找出 GET 请求的响应消息,从中抽取数据键和数据项大小。
  3. 抽取出来的概要信息被发送给分析工具,并根据数据键进行分区,每一个工作线程持有一个分区。
  4. 分析工具合并各个工作线程的报告,将其展示给 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 )关注我们。

2017 年 8 月 14 日 19:001329
用户头像

发布了 321 篇内容, 共 107.7 次阅读, 收获喜欢 101 次。

关注

评论

发布
暂无评论
发现更多内容

面试官:讲一下缓存穿透、缓存雪崩和缓存击穿?

bigsai

redis 缓存穿透 缓存击穿 缓存雪崩

TCP/IP 基础知识总结

cxuan

后端 计算机网络 计算机

酷睿i5-10600KF对标锐龙7 3700X,游戏表现领先且售价更香

intel001

进“大厂”的故事

北风

职业规划 职业成长 大厂

网络直播打赏背后的套路:刺激用户不理智消费

石头IT视角

目标检测学习-比赛路线

Dreamer

Scrapy 源码剖析(三)Scrapy有哪些核心组件?

Kaito

Python 爬虫 Scrapy 源码剖析

队列实现栈的3种方法,全都击败了100%的用户!

王磊

Java 算法和数据结构

元模型驱动(二)构建元模型ーGME构建分层模型

KaYa

DDD Kaya MDA GME MDD

1分钟教你如何整理 React 知识体系

Leo

学习 前端 React 前端进阶训练营

元模型驱动(一)构建元模型ーGME入门

KaYa

DDD Kaya MDA GME MDD

Redis还可以做哪些事?

Java旅途

redis

老板下了死命令,要把日志系统切换到Logback

沉默王二

Java logback 日志系统

如何搭建一个爬虫代理服务?

Kaito

爬虫 代理

java安全编码指南之:文件和共享目录的安全性

程序那些事

代码规范 java安全 java安全编码指南 java编码 程序那些事

5G应用的实时决策

VoltDB

5G 物联网 工业互联网 技术分享

【架构师训练营 1 期】第六周学习总结

诺乐

【面经】面试官:讲讲类的加载、链接和初始化?

冰河

架构 JVM 类加载 优化 性能调试

训练营第二周作业

爱码士

训练营第二周课程总结

爱码士

训练营

轻量型GPU应用首选 京东智联云推出NVIDIA vGPU实例

京东智联云开发者

人工智能 gpu

基于服务设计的线上展览

京东智联云开发者

云安全

如何构建一个通用的垂直爬虫平台?

Kaito

Python 爬虫 代理

【架构师训练营 1 期】第六周作业

诺乐

给打工人熬一锅「毒」鸡汤

HPioneer

程序员 打工人 毒鸡汤

接口测试(apipost、jmeter和python脚本)

测试人生路

Python 接口测试 测试工具

从零实现一个动态表单设计(编辑)器

徐小夕

Java 编辑器 H5 Node React

Scrapy 源码剖析(四)Scrapy如何完成抓取任务?

Kaito

Python 爬虫 Scrapy 源码剖析

Scrapy 源码剖析(二)Scrapy是如何运行起来的?

Kaito

Python 爬虫 Scrapy 源码剖析

为什么 React Hooks 优于 HOCs(译)

西贝

Java 翻译 React Hooks HOC

Scrapy源码剖析(一)架构概览

Kaito

Python 爬虫 Scrapy 源码剖析

Memsniff:一个健壮的Memcached流量分析工具-InfoQ