Apache a sendfile

Dalibor Straka dast na panelnet.cz
Pátek Červen 1 17:24:37 CEST 2007


Ahoj,

On Fri, Jun 01, 2007 at 03:18:51PM +0200, Jan Kasprzak wrote:
> Dalibor Straka wrote:
> : On Wed, May 30, 2007 at 09:47:58PM +0200, Jan Kasprzak wrote:
> : Ja bych tipnul, ze je to zalezitost programatora. proftpd nastavi socket
> : jako blokujici, udela sendfile() na celou velikost souboru a pocka az to
> : odtece. Kdezto apache2 pouziva poll() nebo select() a soubor si kouskuje
> : na buffery 190kB. Nicmene netusim, kde bere hodnotu 190KB :-). Podle me
> : jsou obe dve metody i na vysokorychlostnich sitich optimalni, pokud
> : ma poll() rozumny timeout.
> 
> 	Ne, prave Apache taky dela sendfile() na cely soubor
> (bylo to tusim videt v tom mem puvodnim mailu). Akorat se mu sendfile()
> vrati uz po 190 KB (a toto cislo se jeste navic v case meni).
> 
Koukam do zdrojaku apache2 a on dela sendfile_it_all() na cely soubor,
ktery se prevadi na apr_socket_sendfile() a v nem je nejaky
if(socket->option & APR_INCOMPLETE_WRITE) coz je jako nonblocking a
skoci na tento kus kodu:
	do_select:
		arv = apr_wait_for_io_or_timeout(NULL, sock, 0);
		if (arv != APR_SUCCESS) {
			*len = 0;
			return arv;
		}
		else {
			do {
				rv = sendfile(sock->socketdes,    /* socket */
				  file->filedes, /* open file descriptor of the file to be sent */
				  &off,    /* where in the file to start */
				  *len);    /* number of bytes to send */
			} while (rv == -1 && errno == EINTR);
		}
	}

	if (rv == -1) {
		*len = nbytes;
		rv = errno;
		apr_socket_opt_set(sock, APR_TCP_NOPUSH, 0);
		return rv;
	}

A tento kod se vola dokolecka pokazde, kdyz sendfile() zaplni tcp buffer
a vrati, ze zapsal treba 190kB.

-- Dalibor Straka
P.S. Zdrojaky jsem bral apache2-2.2.3 
sendfile_it_all() je v server/core_filters.c
apr_socket_sendfile() je v srclib/apr/network_io/unix/sendrecv.c




Další informace o konferenci Linux