On 06/17/12 01:20, Christiano F. Haesbaert wrote:
On Sun, Jun 17, 2012 at 01:08:25AM +0200, Alexander Hall wrote:
On 06/16/12 01:07, Christiano F. Haesbaert wrote:
Hi, this behaviour is really annoying, in tcp server, when the last
user disconnects, we don't update the status line, so it keeps showing
1 connected user, it would be better to show Conn: 0.
BEFORE
sauron:haesbaert: tcpbench -s
elapsed_ms bytes mbps bwidth
1000 645674612 5165.397 100.00%
Conn: 1 Mbps: 5165.397 Peak Mbps: 5165.397 Avg Mbps: 5165.397
2000 673254000 5386.032 100.00%
Conn: 1 Mbps: 5386.032 Peak Mbps: 5386.032 Avg Mbps: 5386.032
AFTER
gimli:obj: ./tcpbench -s
elapsed_ms bytes mbps bwidth
1000 314833908 2518.671 100.00%
Conn: 1 Mbps: 2518.671 Peak Mbps: 2518.671 Avg Mbps: 2518.671
Conn: 0 Mbps: 0.000 Peak Mbps: 2518.671 Avg Mbps: 0.000
NAN might be more appropriate than 0.
Why is that ?
It was directed at the average, where also your diff takes special
measures, since <something> / 0 is not defined. I'm not entirely sure
NAN is appropriate for "undefined", but I would expect it to be better
off than 0.
Also, only start timer if this is the first connection, this prevents
the display from not running while we have clients connecting (since
it always pushes the display 1 second in the future).
Are you sure about this? Looking at the code, I didn't get that
impression (not that I claim to know much about event(3)), but
adding a new connection every 0.5 seconds did not stop the output
either.
You're correct, my mistake I had missed the following in
set_slice_timer():
if (evtimer_pending(&mainstats.timer, NULL))
return;
Even though I think it makes more sense, no ?
You mean, to only call set_slice_timer on == 1 instead of > 0 ?
Given the minimal performance difference, I'd prefer whatever gives the
most readable code, and since the check is already in set_slice_timer(),
I don't see a big point in doing the same check twice.
I considered adding:
+ timerclear(&tv);
+ evtimer_add(&mainstats.timer,&tv);
But the output looks funky since the headers don't match the output:
./tcpbench -s
elapsed_ms bytes mbps bwidth
Conn: 0 Mbps: 0.000 Peak Mbps: 0.000 Avg Mbps: 0.000
But I'm not too strong about it.
The output is already rather funky and mixed up IMO, so I don't know if
this makes it better or worse.
All this said, I don't use tcpbench much anyway, it was just my two
cents. :-)
/Alexander
}
if (ptb->sflag)
/Alexander
Index: tcpbench.c
===================================================================
RCS file: /cvs/src/usr.bin/tcpbench/tcpbench.c,v
retrieving revision 1.35
diff -d -u -p -r1.35 tcpbench.c
--- tcpbench.c 8 May 2012 01:39:58 -0000 1.35
+++ tcpbench.c 15 Jun 2012 23:04:23 -0000
@@ -568,7 +568,7 @@ tcp_process_slice(int fd, short event, v
mainstats.peak_mbps = slice_mbps;
printf("Conn: %3d Mbps: %12.3Lf Peak Mbps: %12.3Lf Avg Mbps: %12.3Lf\n",
mainstats.nconns, slice_mbps, mainstats.peak_mbps,
- slice_mbps / mainstats.nconns);
+ mainstats.nconns ? slice_mbps / mainstats.nconns : 0);
mainstats.slice_bytes = 0;
set_slice_timer(mainstats.nconns> 0);
@@ -657,7 +657,6 @@ tcp_server_handle_sc(int fd, short event
free(sc);
mainstats.nconns--;
- set_slice_timer(mainstats.nconns> 0);
return;
}
if (ptb->vflag>= 3)
@@ -723,7 +722,8 @@ tcp_server_accept(int fd, short event, v
event_add(&sc->ev, NULL);
TAILQ_INSERT_TAIL(&sc_queue, sc, entry);
mainstats.nconns++;
- set_slice_timer(mainstats.nconns> 0);
+ if (mainstats.nconns == 1)
+ set_slice_timer(1);
if (ptb->vflag)
fprintf(stderr, "Accepted connection from %s, fd = %d\n",
tmp, sc->fd);
@@ -934,7 +934,8 @@ client_init(struct addrinfo *aitop, int
event_add(&sc->ev, NULL);
TAILQ_INSERT_TAIL(&sc_queue, sc, entry);
mainstats.nconns++;
- set_slice_timer(mainstats.nconns> 0);
+ if (mainstats.nconns == 1)
+ set_slice_timer(1);
}
freeaddrinfo(aitop);
if (aib != NULL)