⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stat.c

📁 -
💻 C
📖 第 1 页 / 共 4 页
字号:
    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 + -