2008-11-08 43 views
1

我想设置一个统计监控平台来观察特定的服务,但我不确定如何去做。处理截获的数据不是我关心的,只是如何去做。一个想法是在客户端应用程序和服务之间设置一个代理,以便所有TCP通信首先到达我的代理,代理然后将截获的消息委派给等待的线程/分支以传递消息并接收结果。另一个是尝试嗅探客户端&服务之间的流量。拦截流量到memcached进行统计/分析

我的主要目标是避免任何严重的客户端应用程序之间的传输速度损失,但获得客户端服务之间100%完整的通信。

环境:Ubuntu的8.04

语言:C/C++

在我想使用的内存或20-25MB的memcache dameon完全运行的sqlite的DB的背景从属于我的过程。

更新: 具体而言,我试图跟踪一个memcache守护进程的密钥的使用情况,存储密钥的集合/获取成功/失败的数量。这个想法是,大多数键都有某种分离字符[`| _-#]来创建一种名称空间。这个想法是介入守护进程和客户端之间,通过配置的分隔符将键分开并记录它们的统计信息。

回答

0

你没有提到一种方法:你可以修改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对我来说似乎是最为冷静的方法。

顺便说一句:你看过memcached的内置统计报告?我不认为它的粒度足够你想要的,但如果你没有看到它,请在做实际工作之前看看:-D

+0

我试图解决的问题是要知道跆拳道的memcache和应用正在做“对即将到期的按键和还是有更多的集合然后得到” – David 2008-11-08 19:11:36

1

究竟你在追踪什么?如果你想包或字节,或基本报头信息的简单计数,然后iptables会帮你记录:

iptables -I INPUT -p tcp -d $HOST_IP --dport $HOST_PORT -j LOG $LOG_OPTIONS 

如果您需要更详细的信息,请进入iptables ULOG目标,它发送的每个数据包到用户空间进行分析。

请参阅http://www.netfilter.org对于非常彻底的文档。

0

iptables provides libipq,一个用户空间数据包排队库。从手册页:

的Netfilter提供 传递数据包出栈的机制 排队到用户空间,然后在接收 这些数据包返回到内核 与判决指定做什么 与包(如ACCEPT或 DROP)。这些数据包也可能是 在 重新注入内核之前在用户空间中被修改。

通过建立定制iptables的规则转发数据包到libipq,除了指定的判决对他们来说,这是可以做到数据包检查进行统计分析。

另一个可行的选择是通过带有套接字过滤器支持的libpcap或PF_PACKET套接字手动嗅探数据包。

1

如果你想采用嗅探方式,使用tcpflow代替tcpdump或libpcap可能更容易。 tcpflow将仅输出TCP有效载荷,因此您无需关心自己重新组合数据流。如果你更喜欢使用库而不是粘贴一堆程序,你可能会对libnids感兴趣。

libnids和tcpflow也可在其他的Unix操作系统,并且不限制你刚才的Linux(反之至iptables的)。

http://www.circlemud.org/~jelson/software/tcpflow/ http://libnids.sourceforge.net/