mirror of
https://github.com/apache/httpd.git
synced 2025-08-08 15:02:10 +03:00
core: core output filter optimizations.
The core output filter used to determine first if it needed to block before trying to send its data (including set aside ones), and if so it did call send_brigade_blocking(). This can be avoided by making send_brigade_nonblocking() send as much data as possible (nonblocking), and only if data remain check whether they should be flushed (blocking), according to the same ap_filter_reinstate_brigade() heuristics but afterward. This allows both to simplify the code (axe send_brigade_blocking and some duplicated logic) and optimize sends since send_brigade_nonblocking() is now given all the buckets so it can make use of scatter/gather (iovec) or NOPUSH option with the whole picture. When sendfile is available and/or with fine tuning of FlushMaxThreshold (and ReadBufferSize) from r1836032, one can now take advantage of modern network speeds and bandwidth. This commit also adds some APLOG_TRACE6 messages for outputed bytes (including at mod_ssl level since splitting happens there when it's active). git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1836237 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
@@ -153,6 +153,9 @@ static int bio_filter_out_flush(BIO *bio)
|
||||
bio_filter_out_ctx_t *outctx = (bio_filter_out_ctx_t *)BIO_get_data(bio);
|
||||
apr_bucket *e;
|
||||
|
||||
ap_log_cerror(APLOG_MARK, APLOG_TRACE6, 0, outctx->c,
|
||||
"bio_filter_out_write: flush");
|
||||
|
||||
AP_DEBUG_ASSERT(APR_BRIGADE_EMPTY(outctx->bb));
|
||||
|
||||
e = apr_bucket_flush_create(outctx->bb->bucket_alloc);
|
||||
@@ -211,6 +214,9 @@ static int bio_filter_out_write(BIO *bio, const char *in, int inl)
|
||||
return -1;
|
||||
}
|
||||
|
||||
ap_log_cerror(APLOG_MARK, APLOG_TRACE6, 0, outctx->c,
|
||||
"bio_filter_out_write: %i bytes", inl);
|
||||
|
||||
/* when handshaking we'll have a small number of bytes.
|
||||
* max size SSL will pass us here is about 16k.
|
||||
* (16413 bytes to be exact)
|
||||
@@ -872,6 +878,9 @@ static apr_status_t ssl_filter_write(ap_filter_t *f,
|
||||
return APR_EGENERAL;
|
||||
}
|
||||
|
||||
ap_log_cerror(APLOG_MARK, APLOG_TRACE6, 0, f->c,
|
||||
"ssl_filter_write: %"APR_SIZE_T_FMT" bytes", len);
|
||||
|
||||
/* We rely on SSL_get_error() after the write, which requires an empty error
|
||||
* queue before the write in order to work properly.
|
||||
*/
|
||||
@@ -1670,8 +1679,11 @@ static apr_status_t ssl_io_filter_coalesce(ap_filter_t *f,
|
||||
&& (ctx == NULL
|
||||
|| bytes + ctx->bytes + e->length < COALESCE_BYTES);
|
||||
e = APR_BUCKET_NEXT(e)) {
|
||||
if (e->length) count++; /* don't count zero-length buckets */
|
||||
bytes += e->length;
|
||||
/* don't count zero-length buckets */
|
||||
if (e->length) {
|
||||
bytes += e->length;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
upto = e;
|
||||
|
||||
|
Reference in New Issue
Block a user