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