초당 최대 10개의 요청만 처리할 수 있는 서비스가 있는데 이 숫자가 얼마나 자주 초과되는지 모니터링해야 합니다. tcpdump, ss, netstat, ntop에 대한 다양한 솔루션을 보았지만 내 요구 사항을 충족하는 솔루션은 없는 것 같습니다. 모니터링은 두 개의 스크립트로 나누어야 한다고 생각합니다. tcpdump를 통해 루트로 실행하여 데이터를 수집합니다. 예:
tcpdump -i eth0 src ldapproxy and port ldap and '(tcp-syn|tcp-ack)!=0'
그런 다음 출력을 분석하고 마지막 확인 이후 초당 최대 쿼리 수를 제공하는 또 다른 스크립트가 여기서 막히게 됩니다.
답변1
시작하는 데 도움이 되는 몇 가지 내용은 다음과 같습니다.
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]
} '
event
1초 실행 창의 모든 타임스탬프를 (배열에) 유지합니다 (부동 소수점 초로 변환). 새 이벤트가 범위를 벗어나면 처음으로 기록된 이벤트가 삭제되고 모든 이벤트가 1비트 아래로 이동됩니다. i
항상 상대 시간이 0인 창의 시작에 해당하는 이벤트를 제외하고 존재하는 이벤트 수를 나타냅니다. 숫자가 10을 초과하면 스크립트는 창에 있는 이벤트 수를 인쇄합니다. 출력 예:
11 events in 0.962827 secs at 14:53:51.262827
이 패턴은 / > /
들어오는 패킷에만 일치합니다. 관심 있는 행과 일치하도록 개선해야 할 수도 있습니다.