[25.11-RELEASE][[email protected]]/root: sh -c 'unbound-control -c /var/unbound/unbound.conf stats | awk '\''BEGIN { c_h="\033[1;34m"; c_k="\033[0;36m"; c_v="\033[0;33m"; c_r="\033[0m"; sec["System Overview"]="^(time\\.up|total\\.num\\.queries|total\\.recursion\\.time\\.avg|total\\.requestlist\\.(avg|max))"; sec["Performance & Cache"]="^total\\.num\\.(cachehits|cachemiss|prefetch|recursivereplies|queries_discard_timeout)"; sec["Transport Protocols"]="^num\\.query\\.(tcp|tcpout|udp|tls|https|ipv6)"; sec["Query Types"]="^num\\.query\\.type\\."; sec["Response Codes"]="^num\\.answer\\.rcode"; sec["Security & Threats"]="^(num\\.rpz\\.action\\.rpz-local-data|unwanted|num\\.query\\.ratelimited|total\\.num\\.queries_ip_ratelimited)"; sec["Memory & Stats"]="^mem\\.|^(msg\\.cache|rrset\\.cache|infra\\.cache)\\.count"; } { if($0 in seen_lines) next; seen_lines[$0]=1; split($0, kv, "="); k=kv[1]; v=kv[2]+0; d[k]=kv[2]; if(k ~ /^histogram\./ && v>0) { split(k, h, "[.=]"); s=h[2]*1000000+h[3]; e=h[5]*1000000+h[6]; rec_total_hist += v; if(s>=8192) { hc++; hist[hc,"s"]=int(s/1000); hist[hc,"e"]=int(e/1000); hist[hc,"v"]=v; } else { fast_hist += v; } } for(s in sec) { if(k ~ sec[s] && (v>0 || k~/time\\.up/)) { if(!(s in seen)) { printf "\n%s== %s ==%s\n", c_h, s, c_r; seen[s]=1; } if(k == "time.up") { days=int(v/86400); hours=int((v%86400)/3600); mins=int((v%3600)/60); secs=int(v%60); printf "%s%-35s:%s %dd %dh %dm %ds%s\n", c_k, k, c_v, days, hours, mins, secs, c_r; } else if(k ~ /recursion\.time\.avg/) printf "%s%-35s:%s %.2f ms%s\n", c_k, k, c_v, v*1000, c_r; else if(k ~ /^mem\./) { unit="B"; val=v; if(val > 1048576) { val/=1048576; unit="MiB"; } else if(val > 1024) { val/=1024; unit="KiB"; } printf "%s%-35s:%s %.2f %s%s\n", c_k, k, c_v, val, unit, c_r; } else printf "%s%-35s:%s %-10s%s\n", c_k, k, c_v, kv[2], c_r; } } } END { tq=d["total.num.queries"]+0; rec=d["total.num.recursivereplies"]+0; ch=d["total.num.cachehits"]+0; cm=d["total.num.cachemiss"]+0; pf=d["total.num.prefetch"]+0; ne=d["num.answer.rcode.NOERROR"]+0; nx=d["num.answer.rcode.NXDOMAIN"]+0; sf=d["num.answer.rcode.SERVFAIL"]+0; nd=d["num.answer.rcode.nodata"]+0; printf "\n%s== Response Summary ==%s\n", c_h, c_r; tr=ne+nx+sf+nd; printf "%sTotal responses (User+Internal):%s %s%s\n", c_k, c_v, tr, c_r; if(tr>0) { printf "%sSuccess (NOERROR):%s %.2f%%%s\n", c_k, c_v, (ne*100/tr), c_r; printf "%sNXDOMAIN:%s %.2f%%%s\n", c_k, c_v, (nx*100/tr), c_r; printf "%sFailures (SERVFAIL):%s %.2f%%%s\n", c_k, c_v, (sf*100/tr), c_r; } printf "\n%s== Derived Analysis ==%s\n", c_h, c_r; if(tq>0) { printf "%sRecursive (Miss) Rate:%s %.2f%%%s\n", c_k, c_v, (rec*100/tq), c_r; printf "%sCache Hit Rate:%s %.2f%%%s\n", c_k, c_v, (ch*100/tq), c_r; printf "%sPrefetch Ratio (Prefetch/Queries):%s %.2f%%%s\n", c_k, c_v, (pf*100/tq), c_r; } printf "\n%s== Latency Breakdown (Recursive Queries) ==%s\n", c_h, c_r; cum=0; if (rec_total_hist > 0) { fast_pct = (fast_hist / rec_total_hist) * 100; printf "%s%4d-%4d ms:%s %6d %squeries%s (%s%.2f%%%s)\n", c_k, 0, 8, c_r, fast_hist, c_k, c_r, c_v, fast_pct, c_r; cum += fast_pct; for(i=1; i<=hc; i++) { v=hist[i,"v"]; if(rec_total_hist>0) { p=(v/rec_total_hist)*100; cum+=p; printf "%s%4d-%4d ms:%s %6d %squeries%s (%s%.2f%%%s, %scum%s: %s%.2f%%%s)\n", c_k, hist[i,"s"], hist[i,"e"], c_r, v, c_k, c_r, c_v, p, c_r, c_k, c_r, c_v, cum, c_r; } } } else { printf "No recursive latency data available.\n"; } }'\''' == System Overview == total.num.queries : 18293 == Performance & Cache == total.num.queries_discard_timeout : 27 total.num.queries_discard_timeout : 27 total.num.cachehits : 14852 total.num.cachemiss : 3441 total.num.prefetch : 7871 total.num.recursivereplies : 3414 total.requestlist.avg : 6.56462 total.requestlist.max : 67 total.recursion.time.avg : 18.00 ms time.up : 0d 3h 44m 9s == Memory & Stats == mem.cache.rrset : 699.37 KiB mem.cache.message : 650.66 KiB mem.mod.iterator : 16.32 KiB mem.mod.validator : 16.37 KiB == Query Types == num.query.type.A : 10238 num.query.type.PTR : 35 num.query.type.HINFO : 1 num.query.type.MX : 40 num.query.type.TXT : 14 num.query.type.AAAA : 6008 num.query.type.SRV : 8 num.query.type.SVCB : 15 num.query.type.HTTPS : 1934 == Transport Protocols == num.query.tcpout : 60 == Response Codes == num.answer.rcode.NOERROR : 17530 num.answer.rcode.SERVFAIL : 324 num.answer.rcode.NXDOMAIN : 412 num.answer.rcode.nodata : 4281 msg.cache.count : 2482 rrset.cache.count : 2442 infra.cache.count : 2 == Security & Threats == num.rpz.action.rpz-local-data : 24 == Response Summary == Total responses (User+Internal): 22547 Success (NOERROR): 77.75% NXDOMAIN: 1.83% Failures (SERVFAIL): 1.44% == Derived Analysis == Recursive (Miss) Rate: 18.66% Cache Hit Rate: 81.19% Prefetch Ratio (Prefetch/Queries): 43.03% == Latency Breakdown (Recursive Queries) == 0- 8 ms: 1736 queries (50.85%) 8- 16 ms: 628 queries (18.39%, cum: 69.24%) 16- 32 ms: 596 queries (17.46%, cum: 86.70%) 32- 65 ms: 334 queries (9.78%, cum: 96.49%) 65- 131 ms: 58 queries (1.70%, cum: 98.18%) 131- 262 ms: 32 queries (0.94%, cum: 99.12%) 262- 524 ms: 22 queries (0.64%, cum: 99.77%) 524-1000 ms: 7 queries (0.21%, cum: 99.97%) 1000-2000 ms: 1 queries (0.03%, cum: 100.00%)