On Wed, 6 Sep 2000, Daniel Feiglin wrote:

> This programming problebm is not specific to Linux; it can be reproduced under Unix 
>(e.g Solaris).
> 
> Here is the scenario: I have a C++ server (a sort of logger, a bit like syslog) and 
>many Java clients.
> 
> Each Java client sends the server a text header record which I'll describe in a 
>moment, and thereafter, user generated
> text "log" records. Every client write() (using the output stream obtained from the 
>socket), is followed by a flush()
> call, to ensure that each write() is indeed carried out.
> 
> The header record, a comma delimited list,contains a file name, where I want the 
>server to throw out the subseqent
> stuff on a per client basis. It contains other fields not pertinent to this query.
> 
> The server is built in "classic" fashion: A listener thread, assigns each client a 
>file descriptor, and a multiplexed
> read thread (using select())
> processes reads from the clients. I use standard pthreads (Write once, run many).
> 
> When a Java client comes "on board", it first sends the header, upon whichbasis a 
>log file is opened by the server on
> the client's behalf. All subsequent message from that client are recognized as log 
>messages and written to the client's
> log file.
> 
> When a client disconnects, the server detects it (as a zero length read buffer) and 
>cleanly closes the file and the
> socket connection.
> 
> I maintain a table of online client records, which uses standard pthread mutexes to 
>avoid a few simple potential
> clashes.
> 
> Now for the problem:
> 
> When a client comes up, for some reason or other, the header and the first first few 
>log records are aggregated by TCP,
> and appear on select() as a single read(). All subsequent client writes are picked 
>up correctly.I can vary the number
> of initially aggregated records by reducing the select() timeout (but not setting it 
>to zero!). The worst results are
> obtained, when I allow select() to block.
> 
> If for example, I set the select() timeout to say, 1 sec and force the client to 
>sleep 2 secs after issueing the header,
> I can make the problem "disappear", if for an obvious reason.
> 
> 1. Why does TCP aggregate the first few records, and then "settle down" and behave 
>as expected?

  Probably Nagle (take a look at RFC 896 'the small packet problem'). Try
to disable Nagle on the senders (not sure this is possible). BTW, anyone
who have seen '[A' while typing an Up Arrow withing vi has stumbled upon
Nagle (actually, a combination of Nagle and vi's low timeout value).

> 2. Any suggested "fix"?

  What are the clients ?

> 
> If it is felt that this is somewhat off-topic, please reply directly to me.
> 
> References: Stevens, UNP Vol 1, and APUE, syslog sources (for an example).


-- Yaron.


=================================================================
To unsubscribe, send mail to [EMAIL PROTECTED] with
the word "unsubscribe" in the message body, e.g., run the command
echo unsubscribe | mail [EMAIL PROTECTED]

Reply via email to