正在拦截到memcached的流量以进行统计/分析
Intercepting traffic to memcached for statistics/analysis
我想建立一个统计监控平台来监控特定的服务,但我不确定如何进行。处理截获的数据不是我关心的问题,只是如何进行。一个想法是在客户端应用程序和服务之间设置一个代理,这样所有TCP流量都会首先到达我的代理,然后,代理将截获的消息委托给等待的线程/叉,以传递消息并接收结果。另一种是尝试嗅探客户端&服务
我的主要目标是避免客户端和服务器之间传输速度的任何严重损失;应用程序,但在客户端&服务
环境:UBuntu 8.04
语言:c/c++
在后台,我想使用一个完全在内存中运行的sqlite DB,或者一个20-25MB的memcache dameon来处理我的进程。
更新:特别是,我试图跟踪memcache守护进程的密钥使用情况,在密钥上存储sets/gets-success/defaults的数量。其想法是,大多数键都有某种分隔字符[`|_-#]来创建某种名称空间。这个想法是在守护进程和客户端之间介入,通过配置的分隔符将密钥分开,并记录它们的统计信息。
您到底想跟踪什么?如果你想要一个简单的数据包或字节计数,或者基本的头信息,那么iptables
会为你记录:
iptables -I INPUT -p tcp -d $HOST_IP --dport $HOST_PORT -j LOG $LOG_OPTIONS
如果您需要更详细的信息,请查看iptables ULOG
目标,它将每个数据包发送到用户空间进行分析。
请参阅http://www.netfilter.org对于非常彻底的文档。
如果你想采用嗅探器的方式,使用tcpflow而不是tcpdump或libpcap可能会更容易。tcpflow将只输出TCP有效负载,因此您不需要自己重新组装数据流。如果你更喜欢使用库而不是将一堆程序粘在一起,你可能会对libnid感兴趣。
libnids和tcpflow也可用于其他Unix版本,并且不限制您仅使用Linux(与iptables相反)。
http://www.circlemud.org/~jelson/software/tcpflow/http://libnids.sourceforge.net/
您没有提到一种方法:您可以修改memcached或您的客户端来记录所需的统计信息。这可能是最简单、最干净的方法。
在代理和libpcap方法之间,有几个折衷方案:
- If you do the packet capture approach, you have to reassemble the TCP
streams into something usable yourself. OTOH, if your monitor program
gets bogged down, it'll just lose some packets, it won't break the cache.
Same if it crashes. You also don't have to reconfigure anything; packet
capture is transparent.
- If you do the proxy approach, the kernel handles all the TCP work for
you. You'll never lose requests. But if your monitor bogs down, it'll bog
down the app. And if your monitor crashes, it'll break caching. You
probably will have to reconfigure your app and/or memcached servers so
that the connections go through the proxy.
简言之,代理可能更容易编码,但实现它可能是一件痛苦的事,它最好是完美的,否则会占用你的缓存。对我来说,更改应用程序或memcached似乎是最明智的方法
BTW:你看过memcached内置的统计报告吗?我认为它不够精细,无法满足您的需求,但如果您还没有看到它,请在进行实际工作之前先看一看:-D
iptables提供了libipq,一个用户空间数据包排队库。来自手册页:
Netfilter提供了一种机制将数据包从堆栈中传出排队到用户空间,然后接收这些数据包返回到内核有一个明确的判决与数据包(如ACCEPT或下降)。这些数据包也可能是之前在用户空间中修改重新注入内核。
通过设置定制的iptables规则,将数据包转发到libipq,除了指定它们的判决外,还可以进行数据包检查以进行统计分析。
另一个可行的选择是通过支持套接字过滤器的libpcap或PF_PACKET套接字手动嗅探数据包。
- (C++)分析树以计算返回错误值的简单算术表达式
- 函数复杂度分析
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 使用指针重新分析实体
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 模板元编程 - 尝试实现维度分析
- 为什么 gcovr 会生成空覆盖率统计信息?
- 如何以静态代码分析友好的方式使用 #define 防护?
- 为什么C++不支持对未初始化变量进行智能分析?
- 分析包含 NMEA 句子的日志文件C++
- Pisarze - 来自波兰奥林匹克信息学的数据分析任务
- 在字符数组维度分析中构造字符数组
- 如何分析代码的哪一部分创建了线程?
- 如何执行 cppcheck 交叉翻译单元 (CTU) 静态分析?
- 如何分析在 Windows 上运行C++代码?
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- PVS 工作室分析
- 正在分析CSV文件-C++
- Qt 错误:QSqlQuery::value:尝试从表中检索统计信息时未定位在有效记录上 (QComboBox)
- 正在拦截到memcached的流量以进行统计/分析