1

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

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

环境:UBuntu 8.04

语言:c/c++

在后台,我正在考虑使用完全在内存中运行的 sqlite DB 或从属于我的进程的 20-25MB 内存缓存守护进程。

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

4

4 回答 4

1

你到底想追踪什么?如果您想要一个简单的数据包或字节计数,或基本标头信息,那么 iptables将为您记录:

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

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

有关非常详尽的文档,请参见http://www.netfilter.org 。

于 2008-11-08T05:08:56.713 回答
1

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

libnids 和 tcpflow 也可用于其他 Unix 风格,并且不限制您仅使用 Linux(与 iptables 相反)。

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

于 2008-11-08T22:16:32.910 回答
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 对我来说似乎是最明智的方法。

BTW:你看过 memcached 的内置统计报告吗?我认为它的粒度不足以满足您的需求,但是如果您还没有看到它,请在进行实际工作之前先看看 :-D

于 2008-11-08T07:06:01.393 回答
0

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

Netfilter 提供了一种机制,用于将数据包从堆栈中传递出来以排队到用户空间,然后将这些数据包接收回内核,并通过一个裁决指定如何处理这些数据包(例如 ACCEPT 或 DROP)。这些数据包也可以在重新注入内核之前在用户空间中进行修改。

通过设置将数据包转发到 libipq的定制iptables规则,除了为它们指定判决外,还可以进行数据包检查以进行统计分析。

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

于 2008-11-08T13:32:54.013 回答