我有一个服务每秒最多只能处理 10 个请求,我需要监视超出此数量的频率。我已经看到了 tcpdump、ss、netstat、ntop 的各种解决方案,但似乎没有一个能满足我的需要。我想监控需要分成两个脚本。通过以 root 身份运行的 tcpdump 收集数据,例如:
tcpdump -i eth0 src ldapproxy and port ldap and '(tcp-syn|tcp-ack)!=0'
然后另一个脚本来分析输出并给出自上次检查以来每秒的最大查询数,这就是我陷入困境的地方。
答案1
这里有一些 awk 可以帮助您入门:
awk '/ > /{
split($1,t,":"); time = (t[1]*60+t[2])*60+t[3]
diff = time-lasttime; lasttime = time
event[++i] = diff; window += diff; tod[i] = $1
while(window>=1){
window -= event[1]
for(j=1;j<i;j++){
event[j] = event[j+1]
tod[j] = tod[j+1]
}
i--
}
if(i+1>10) printf "%d events in %f secs at %s\n",i+1,window,tod[i]
} '
它保留(在 array 中event
)1 秒运行窗口中的所有时间戳(转换为浮点数秒)。当新事件超出窗口时,第一个记录的事件将被删除,所有事件将下移一位。i
表示有多少个事件,不包括与窗口开始相对应的事件,该窗口始终处于相对时间零。当数量超过 10 时,该脚本会打印窗口中有多少个事件。输出示例:
11 events in 0.962827 secs at 14:53:51.262827
该模式/ > /
仅匹配传入数据包。您可能需要对其进行改进以匹配您感兴趣的行。