Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 拦截到memcached的流量以进行统计/分析_C++_C_Linux_Networking_Memcached - Fatal编程技术网

C++ 拦截到memcached的流量以进行统计/分析

C++ 拦截到memcached的流量以进行统计/分析,c++,c,linux,networking,memcached,C++,C,Linux,Networking,Memcached,我想建立一个统计监控平台来观看一个特定的服务,但我不知道该怎么做。处理截获的数据不是我关心的问题,只是如何处理它。一个想法是在客户端应用程序和服务之间设置一个代理,以便所有TCP流量首先到达我的代理,然后代理将截获的消息委托给等待的线程/分支,以传递消息并接收结果。另一个是尝试嗅探客户端和服务之间的通信量 我的主要目标是避免客户机和应用程序之间的传输速度出现任何严重损失,但要在客户机和服务之间实现100%的完整通信 环境:UBuntu 8.04 语言:c/c++ 在后台,我正在考虑使用一个完全在

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

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

环境:UBuntu 8.04

语言:c/c++

在后台,我正在考虑使用一个完全在内存中运行的sqlite DB,或者一个20-25MB的memcache dameon作为进程的奴隶

更新:
具体地说,我试图跟踪memcache守护进程的密钥使用情况,在密钥上存储#of set/get success/fails。其思想是,大多数键都有某种分隔字符[` |-#]来创建一种名称空间。其思想是在守护进程和客户机之间进行干预,通过配置的分隔符将密钥分开,并记录它们的统计信息

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

iptables -I INPUT -p tcp -d $HOST_IP --dport $HOST_PORT -j LOG $LOG_OPTIONS
如果需要更详细的信息,请查看
iptables-ULOG
目标,它将每个数据包发送到用户空间进行分析


有关非常详细的文档,请参阅。

您没有提到一种方法:您可以修改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

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

Netfilter提供了一种用于 将数据包从堆栈中传递出去 排队到用户空间,然后接收 这些数据包返回内核 有一个明确的判决 使用数据包(例如接受或 下降)。这些包也可以是 在之前的用户空间中修改 重新注入内核

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


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

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

libnids和tcpflow也可以在其他Unix版本上使用,并且不限制您只使用Linux(与iptables相反)


我试图解决的问题是了解wtf memcache和应用程序正在做什么“密钥是否很快过期,或者是否有更多的集合然后获取”集合与获取是内置统计数据可以回答的问题。