📄 stat.c
字号:
storeAppendPrintf(sentry, "icp.queries_sent = %d\n", f->icp.queries_sent); storeAppendPrintf(sentry, "icp.replies_sent = %d\n", f->icp.replies_sent); storeAppendPrintf(sentry, "icp.queries_recv = %d\n", f->icp.queries_recv); storeAppendPrintf(sentry, "icp.replies_recv = %d\n", f->icp.replies_recv); storeAppendPrintf(sentry, "icp.query_timeouts = %d\n", f->icp.query_timeouts); storeAppendPrintf(sentry, "icp.replies_queued = %d\n", f->icp.replies_queued); storeAppendPrintf(sentry, "icp.kbytes_sent = %d\n", (int) f->icp.kbytes_sent.kb); storeAppendPrintf(sentry, "icp.kbytes_recv = %d\n", (int) f->icp.kbytes_recv.kb); storeAppendPrintf(sentry, "icp.q_kbytes_sent = %d\n", (int) f->icp.q_kbytes_sent.kb); storeAppendPrintf(sentry, "icp.r_kbytes_sent = %d\n", (int) f->icp.r_kbytes_sent.kb); storeAppendPrintf(sentry, "icp.q_kbytes_recv = %d\n", (int) f->icp.q_kbytes_recv.kb); storeAppendPrintf(sentry, "icp.r_kbytes_recv = %d\n", (int) f->icp.r_kbytes_recv.kb);#if USE_CACHE_DIGESTS storeAppendPrintf(sentry, "icp.times_used = %d\n", f->icp.times_used); storeAppendPrintf(sentry, "cd.times_used = %d\n", f->cd.times_used); storeAppendPrintf(sentry, "cd.msgs_sent = %d\n", f->cd.msgs_sent); storeAppendPrintf(sentry, "cd.msgs_recv = %d\n", f->cd.msgs_recv); storeAppendPrintf(sentry, "cd.memory = %d\n", (int) f->cd.memory.kb); storeAppendPrintf(sentry, "cd.local_memory = %d\n", (int) (store_digest ? store_digest->mask_size / 1024 : 0)); storeAppendPrintf(sentry, "cd.kbytes_sent = %d\n", (int) f->cd.kbytes_sent.kb); storeAppendPrintf(sentry, "cd.kbytes_recv = %d\n", (int) f->cd.kbytes_recv.kb);#endif storeAppendPrintf(sentry, "unlink.requests = %d\n", f->unlink.requests); storeAppendPrintf(sentry, "page_faults = %d\n", f->page_faults); storeAppendPrintf(sentry, "select_loops = %d\n", f->select_loops); storeAppendPrintf(sentry, "cpu_time = %f\n", f->cputime); storeAppendPrintf(sentry, "wall_time = %f\n", tvSubDsec(f->timestamp, current_time)); storeAppendPrintf(sentry, "swap_files_cleaned = %d\n", f->swap_files_cleaned); storeAppendPrintf(sentry, "aborted_requests = %d\n", f->aborted_requests);}voidstatFreeMemory(void){ int i; for (i = 0; i < N_COUNT_HIST; i++) statCountersClean(&CountHist[i]); for (i = 0; i < N_COUNT_HOUR_HIST; i++) statCountersClean(&CountHourHist[i]);}static voidstatPeerSelect(StoreEntry * sentry){#if USE_CACHE_DIGESTS StatCounters *f = &Counter; peer *peer; const int tot_used = f->cd.times_used + f->icp.times_used; /* totals */ cacheDigestGuessStatsReport(&f->cd.guess, sentry, "all peers"); /* per-peer */ storeAppendPrintf(sentry, "\nPer-peer statistics:\n"); for (peer = getFirstPeer(); peer; peer = getNextPeer(peer)) { if (peer->digest) peerDigestStatsReport(peer->digest, sentry); else storeAppendPrintf(sentry, "\nNo peer digest from %s\n", peer->host); storeAppendPrintf(sentry, "\n"); } storeAppendPrintf(sentry, "\nAlgorithm usage:\n"); storeAppendPrintf(sentry, "Cache Digest: %7d (%3d%%)\n", f->cd.times_used, xpercentInt(f->cd.times_used, tot_used)); storeAppendPrintf(sentry, "Icp: %7d (%3d%%)\n", f->icp.times_used, xpercentInt(f->icp.times_used, tot_used)); storeAppendPrintf(sentry, "Total: %7d (%3d%%)\n", tot_used, xpercentInt(tot_used, tot_used));#else storeAppendPrintf(sentry, "peer digests are disabled; no stats is available.\n");#endif}static voidstatDigestBlob(StoreEntry * sentry){ storeAppendPrintf(sentry, "\nCounters:\n"); statCountersDump(sentry); storeAppendPrintf(sentry, "\n5 Min Averages:\n"); statAvgDump(sentry, 5, 0); storeAppendPrintf(sentry, "\nHistograms:\n"); statCountersHistograms(sentry); storeAppendPrintf(sentry, "\nPeer Digests:\n"); statPeerSelect(sentry); storeAppendPrintf(sentry, "\nLocal Digest:\n"); storeDigestReport(sentry);}static voidstatAvg5min(StoreEntry * e){ statAvgDump(e, 5, 0);}static voidstatAvg60min(StoreEntry * e){ statAvgDump(e, 60, 0);}static doublestatMedianSvc(int interval, int which){ StatCounters *f; StatCounters *l; double x; assert(interval > 0); if (interval > N_COUNT_HIST - 1) interval = N_COUNT_HIST - 1; f = &CountHist[0]; l = &CountHist[interval]; assert(f); assert(l); switch (which) { case MEDIAN_HTTP: x = statHistDeltaMedian(&l->client_http.all_svc_time, &f->client_http.all_svc_time); break; case MEDIAN_HIT: x = statHistDeltaMedian(&l->client_http.hit_svc_time, &f->client_http.hit_svc_time); break; case MEDIAN_MISS: x = statHistDeltaMedian(&l->client_http.miss_svc_time, &f->client_http.miss_svc_time); break; case MEDIAN_NM: x = statHistDeltaMedian(&l->client_http.nm_svc_time, &f->client_http.nm_svc_time); break; case MEDIAN_NH: x = statHistDeltaMedian(&l->client_http.nh_svc_time, &f->client_http.nh_svc_time); break; case MEDIAN_ICP_QUERY: x = statHistDeltaMedian(&l->icp.query_svc_time, &f->icp.query_svc_time); break; case MEDIAN_DNS: x = statHistDeltaMedian(&l->dns.svc_time, &f->dns.svc_time); break; default: debug(49, 5) ("get_median_val: unknown type.\n"); x = 0; } return x;}/* * SNMP wants ints, ick */intget_median_svc(int interval, int which){ return (int) statMedianSvc(interval, which);}StatCounters *snmpStatGet(int minutes){ return &CountHist[minutes];}intstat5minClientRequests(void){ assert(N_COUNT_HIST > 5); return Counter.client_http.requests - CountHist[5].client_http.requests;}static doublestatCPUUsage(int minutes){ assert(minutes < N_COUNT_HIST); return dpercent(CountHist[0].cputime - CountHist[minutes].cputime, tvSubDsec(CountHist[minutes].timestamp, CountHist[0].timestamp));}extern doublestatRequestHitRatio(int minutes){ assert(minutes < N_COUNT_HIST); return dpercent(CountHist[0].client_http.hits - CountHist[minutes].client_http.hits, CountHist[0].client_http.requests - CountHist[minutes].client_http.requests);}extern doublestatByteHitRatio(int minutes){ size_t s; size_t c; assert(minutes < N_COUNT_HIST); c = CountHist[0].client_http.kbytes_out.kb - CountHist[minutes].client_http.kbytes_out.kb; s = CountHist[0].server.all.kbytes_in.kb - CountHist[minutes].server.all.kbytes_in.kb; /* size_t might be unsigned */ if (c > s) return dpercent(c - s, c); else return (-1.0 * dpercent(s - c, c));}static voidstatClientRequests(StoreEntry * s){ dlink_node *i; clientHttpRequest *http; ConnStateData *conn; StoreEntry *e; int fd; for (i = ClientActiveRequests.head; i; i = i->next) { http = i->data; assert(http); conn = http->conn; storeAppendPrintf(s, "Connection: %p\n", conn); if (conn) { fd = conn->fd; storeAppendPrintf(s, "\tFD %d, read %d, wrote %d\n", fd, fd_table[fd].bytes_read, fd_table[fd].bytes_written); storeAppendPrintf(s, "\tFD desc: %s\n", fd_table[fd].desc); storeAppendPrintf(s, "\tin: buf %p, offset %d, size %d\n", conn->in.buf, conn->in.offset, conn->in.size); storeAppendPrintf(s, "\tpeer: %s:%d\n", inet_ntoa(conn->peer.sin_addr), ntohs(conn->peer.sin_port)); storeAppendPrintf(s, "\tme: %s:%d\n", inet_ntoa(conn->me.sin_addr), ntohs(conn->me.sin_port)); storeAppendPrintf(s, "\tnrequests: %d\n", conn->nrequests); storeAppendPrintf(s, "\tpersistent: %d\n", conn->persistent); storeAppendPrintf(s, "\tdefer: n %d, until %d\n", conn->defer.n, conn->defer.until); } storeAppendPrintf(s, "uri %s\n", http->uri); storeAppendPrintf(s, "out.offset %d, out.size %d\n", http->out.offset, http->out.size); storeAppendPrintf(s, "req_sz %d\n", http->req_sz); e = http->entry; storeAppendPrintf(s, "entry %p/%s\n", e, e ? storeKeyText(e->key) : "N/A"); e = http->old_entry; storeAppendPrintf(s, "old_entry %p/%s\n", e, e ? storeKeyText(e->key) : "N/A"); storeAppendPrintf(s, "start %d.%06d (%f seconds ago)\n", http->start.tv_sec, http->start.tv_usec, tvSubDsec(http->start, current_time)); storeAppendPrintf(s, "\n"); }}#if STAT_GRAPHS/* * urgh, i don't like these, but they do cut the amount of code down immensely */#define GRAPH_PER_MIN(Y) \ for (i=0;i<(N_COUNT_HIST-2);i++) { \ dt = tvSubDsec(CountHist[i].timestamp, CountHist[i+1].timestamp); \ if (dt <= 0.0) \ break; \ storeAppendPrintf(e, "%lu,%0.2f:", \ CountHist[i].timestamp.tv_sec, \ ((CountHist[i].Y - CountHist[i+1].Y) / dt)); \ }#define GRAPH_PER_HOUR(Y) \ for (i=0;i<(N_COUNT_HOUR_HIST-2);i++) { \ dt = tvSubDsec(CountHourHist[i].timestamp, CountHourHist[i+1].timestamp); \ if (dt <= 0.0) \ break; \ storeAppendPrintf(e, "%lu,%0.2f:", \ CountHourHist[i].timestamp.tv_sec, \ ((CountHourHist[i].Y - CountHourHist[i+1].Y) / dt)); \ }#define GRAPH_TITLE(X,Y) storeAppendPrintf(e,"%s\t%s\t",X,Y);#define GRAPH_END storeAppendPrintf(e,"\n");#define GENGRAPH(X,Y,Z) \ GRAPH_TITLE(Y,Z) \ GRAPH_PER_MIN(X) \ GRAPH_PER_HOUR(X) \ GRAPH_ENDstatic voidstatGraphDump(StoreEntry * e){ int i; double dt; GENGRAPH(client_http.requests, "client_http.requests", "Client HTTP requests/sec"); GENGRAPH(client_http.hits, "client_http.hits", "Client HTTP hits/sec"); GENGRAPH(client_http.errors, "client_http.errors", "Client HTTP errors/sec"); GENGRAPH(client_http.kbytes_in.kb, "client_http.kbytes_in", "Client HTTP kbytes_in/sec"); GENGRAPH(client_http.kbytes_out.kb, "client_http.kbytes_out", "Client HTTP kbytes_out/sec"); /* XXX todo: http median service times */ GENGRAPH(server.all.requests, "server.all.requests", "Server requests/sec"); GENGRAPH(server.all.errors, "server.all.errors", "Server errors/sec"); GENGRAPH(server.all.kbytes_in.kb, "server.all.kbytes_in", "Server total kbytes_in/sec"); GENGRAPH(server.all.kbytes_out.kb, "server.all.kbytes_out", "Server total kbytes_out/sec"); GENGRAPH(server.http.requests, "server.http.requests", "Server HTTP requests/sec"); GENGRAPH(server.http.errors, "server.http.errors", "Server HTTP errors/sec"); GENGRAPH(server.http.kbytes_in.kb, "server.http.kbytes_in", "Server HTTP kbytes_in/sec"); GENGRAPH(server.http.kbytes_out.kb, "server.http.kbytes_out", "Server HTTP kbytes_out/sec"); GENGRAPH(server.ftp.requests, "server.ftp.requests", "Server FTP requests/sec"); GENGRAPH(server.ftp.errors, "server.ftp.errors", "Server FTP errors/sec"); GENGRAPH(server.ftp.kbytes_in.kb, "server.ftp.kbytes_in", "Server FTP kbytes_in/sec"); GENGRAPH(server.ftp.kbytes_out.kb, "server.ftp.kbytes_out", "Server FTP kbytes_out/sec"); GENGRAPH(server.other.requests, "server.other.requests", "Server other requests/sec"); GENGRAPH(server.other.errors, "server.other.errors", "Server other errors/sec"); GENGRAPH(server.other.kbytes_in.kb, "server.other.kbytes_in", "Server other kbytes_in/sec"); GENGRAPH(server.other.kbytes_out.kb, "server.other.kbytes_out", "Server other kbytes_out/sec"); GENGRAPH(icp.pkts_sent, "icp.pkts_sent", "ICP packets sent/sec"); GENGRAPH(icp.pkts_recv, "icp.pkts_recv", "ICP packets received/sec"); GENGRAPH(icp.kbytes_sent.kb, "icp.kbytes_sent", "ICP kbytes_sent/sec"); GENGRAPH(icp.kbytes_recv.kb, "icp.kbytes_recv", "ICP kbytes_received/sec"); /* XXX todo: icp median service times */ /* XXX todo: dns median service times */ GENGRAPH(unlink.requests, "unlink.requests", "Cache File unlink requests/sec"); GENGRAPH(page_faults, "page_faults", "System Page Faults/sec"); GENGRAPH(select_loops, "select_loops", "System Select Loop calls/sec"); GENGRAPH(cputime, "cputime", "CPU utilisation");}#endif /* STAT_GRAPHS */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -