| 548 | } |
| 549 | |
| 550 | static void __show_stats(struct conn *c) |
| 551 | { |
| 552 | unsigned long msec, qps; |
| 553 | unsigned long bytes, bw; |
| 554 | struct conn_dir *cd; |
| 555 | int i; |
| 556 | |
| 557 | if (c->flags & (CONN_F_STATS_SHOWN | CONN_F_REAPED)) |
| 558 | return; |
| 559 | if (!(c->flags & CONN_F_STARTED)) |
| 560 | return; |
| 561 | |
| 562 | if (!(c->flags & CONN_F_END_TIME)) |
| 563 | gettimeofday(&c->end_time, NULL); |
| 564 | |
| 565 | msec = (c->end_time.tv_sec - c->start_time.tv_sec) * 1000; |
| 566 | msec += (c->end_time.tv_usec - c->start_time.tv_usec) / 1000; |
| 567 | |
| 568 | qps = 0; |
| 569 | for (i = 0; i < 2; i++) |
| 570 | qps += c->cd[i].rcv + c->cd[i].snd; |
| 571 | |
| 572 | if (!qps) |
| 573 | return; |
| 574 | |
| 575 | if (msec) |
| 576 | qps = (qps * 1000) / msec; |
| 577 | |
| 578 | printf("Conn %d/(in_fd=%d, out_fd=%d): qps=%lu, msec=%lu\n", c->tid, |
| 579 | c->in_fd, c->out_fd, qps, msec); |
| 580 | |
| 581 | bytes = 0; |
| 582 | for (i = 0; i < 2; i++) { |
| 583 | cd = &c->cd[i]; |
| 584 | |
| 585 | if (!cd->in_bytes && !cd->out_bytes && !cd->snd && !cd->rcv) |
| 586 | continue; |
| 587 | |
| 588 | bytes += cd->in_bytes; |
| 589 | bytes += cd->out_bytes; |
| 590 | |
| 591 | printf("\t%3d: rcv=%u (short=%u, enobufs=%d), snd=%u (short=%u," |
| 592 | " busy=%u, enobufs=%d)\n", i, cd->rcv, cd->rcv_shrt, |
| 593 | cd->rcv_enobufs, cd->snd, cd->snd_shrt, cd->snd_busy, |
| 594 | cd->snd_enobufs); |
| 595 | printf("\t : in_bytes=%lu (Kb %lu), out_bytes=%lu (Kb %lu)\n", |
| 596 | cd->in_bytes, cd->in_bytes >> 10, |
| 597 | cd->out_bytes, cd->out_bytes >> 10); |
| 598 | printf("\t : mshot_rcv=%d, mshot_snd=%d\n", cd->rcv_mshot, |
| 599 | cd->snd_mshot); |
| 600 | show_buckets(cd); |
| 601 | |
| 602 | } |
| 603 | if (msec) { |
| 604 | bytes *= 8UL; |
| 605 | bw = bytes / 1000; |
| 606 | bw /= msec; |
| 607 | printf("\tBW=%'luMbit\n", bw); |
no test coverage detected