MINOR: cache: Add global option to enable/disable zero-copy forwarding

tune.cache.zero-copy-forwarding parameter can now be used to enable or
disable the zero-copy fast-forwarding for the cache applet only. It is
enabled ('on') by default. It can be disabled by setting the parameter to
'off'.
This commit is contained in:
Christopher Faulet 2023-12-04 16:06:24 +01:00
parent ebead3c0a1
commit 533121a56e
3 changed files with 40 additions and 2 deletions

View File

@ -1323,6 +1323,7 @@ The following keywords are supported in the "global" section :
- tune.buffers.limit - tune.buffers.limit
- tune.buffers.reserve - tune.buffers.reserve
- tune.bufsize - tune.bufsize
- tune.cache.zero-copy-forwarding
- tune.comp.maxlevel - tune.comp.maxlevel
- tune.disable-fast-forward - tune.disable-fast-forward
- tune.disable-zero-copy-forwarding - tune.disable-zero-copy-forwarding
@ -3051,6 +3052,13 @@ tune.bufsize <number>
value set using this parameter will automatically be rounded up to the next value set using this parameter will automatically be rounded up to the next
multiple of 8 on 32-bit machines and 16 on 64-bit machines. multiple of 8 on 32-bit machines and 16 on 64-bit machines.
tune.cache.zero-copy-forwarding { on | off }
Enables ('on') of disabled ('off') the zero-copy forwarding of data for the
cache applet, when objects are served from the cache to clients. It is
enabled by default.
See also: tune.disable-zero-copy-forwarding.
tune.comp.maxlevel <number> tune.comp.maxlevel <number>
Sets the maximum compression level. The compression level affects CPU Sets the maximum compression level. The compression level affects CPU
usage during compression. This value affects CPU usage during compression. usage during compression. This value affects CPU usage during compression.
@ -3074,7 +3082,7 @@ tune.disable-zero-copy-forwarding
Thanks to this directive, it is possible to disable this optimization. Note Thanks to this directive, it is possible to disable this optimization. Note
it also disable any kernel tcp splicing. it also disable any kernel tcp splicing.
See also: tune.pt.zero-copy-forwarding, See also: tune.pt.zero-copy-forwarding, tune.cache.zero-copy-forwarding,
tune.h1.zero-copy-fwd-recv, tune.h1.zero-copy-fwd-send, tune.h1.zero-copy-fwd-recv, tune.h1.zero-copy-fwd-send,
tune.h2.zero-copy-fwd-send, tune.quic.zero-copy-fwd-send tune.h2.zero-copy-fwd-send, tune.quic.zero-copy-fwd-send

View File

@ -95,6 +95,7 @@
#define NO_ZERO_COPY_FWD_QUIC_SND 0x0080 /* disable zero-copy FF for QUIC on send */ #define NO_ZERO_COPY_FWD_QUIC_SND 0x0080 /* disable zero-copy FF for QUIC on send */
#define NO_ZERO_COPY_FWD_FCGI_RCV 0x0100 /* disable zero-copy FF for FCGI on received */ #define NO_ZERO_COPY_FWD_FCGI_RCV 0x0100 /* disable zero-copy FF for FCGI on received */
#define NO_ZERO_COPY_FWD_FCGI_SND 0x0200 /* disable zero-copy FF for FCGI on send */ #define NO_ZERO_COPY_FWD_FCGI_SND 0x0200 /* disable zero-copy FF for FCGI on send */
#define NO_ZERO_COPY_FWD_CACHE 0x0400 /* disable zero-copy FF for cache applet */
extern int cluster_secret_isset; /* non zero means a cluster secret was initialized */ extern int cluster_secret_isset; /* non zero means a cluster secret was initialized */

View File

@ -1797,7 +1797,7 @@ static void http_cache_io_handler(struct appctx *appctx)
applet_have_more_data(appctx); applet_have_more_data(appctx);
if (!(global.tune.no_zero_copy_fwd & NO_ZERO_COPY_FWD) && if (!(global.tune.no_zero_copy_fwd & (NO_ZERO_COPY_FWD|NO_ZERO_COPY_FWD_CACHE)) &&
sc_ep_test(sc, SE_FL_MAY_FASTFWD) && sc_ep_test(sc, SE_FL_MAY_FASTFWD) &&
res->to_forward && res->to_forward &&
ctx->data_sent != cache_ptr->body_size) { ctx->data_sent != cache_ptr->body_size) {
@ -3028,6 +3028,26 @@ parse_cache_flt(char **args, int *cur_arg, struct proxy *px,
return -1; return -1;
} }
/* config parser for global "tune.cache.zero-copy-forwarding" */
static int cfg_parse_cache_zero_copy_fwd(char **args, int section_type, struct proxy *curpx,
const struct proxy *defpx, const char *file, int line,
char **err)
{
if (too_many_args(1, args, err, NULL))
return -1;
if (strcmp(args[1], "on") == 0)
global.tune.no_zero_copy_fwd &= ~NO_ZERO_COPY_FWD_CACHE;
else if (strcmp(args[1], "off") == 0)
global.tune.no_zero_copy_fwd |= NO_ZERO_COPY_FWD_CACHE;
else {
memprintf(err, "'%s' expects 'on' or 'off'.", args[0]);
return -1;
}
return 0;
}
/* It reserves a struct show_cache_ctx for the local variables */ /* It reserves a struct show_cache_ctx for the local variables */
static int cli_parse_show_cache(char **args, char *payload, struct appctx *appctx, void *private) static int cli_parse_show_cache(char **args, char *payload, struct appctx *appctx, void *private)
{ {
@ -3215,6 +3235,15 @@ struct applet http_cache_applet = {
.release = http_cache_applet_release, .release = http_cache_applet_release,
}; };
/* config keyword parsers */
static struct cfg_kw_list cfg_kws = {ILH, {
{ CFG_GLOBAL, "tune.cache.zero-copy-forwarding", cfg_parse_cache_zero_copy_fwd },
{ 0, NULL, NULL }
}};
INITCALL1(STG_REGISTER, cfg_register_keywords, &cfg_kws);
/* config parsers for this section */ /* config parsers for this section */
REGISTER_CONFIG_SECTION("cache", cfg_parse_cache, cfg_post_parse_section_cache); REGISTER_CONFIG_SECTION("cache", cfg_parse_cache, cfg_post_parse_section_cache);
REGISTER_POST_CHECK(post_check_cache); REGISTER_POST_CHECK(post_check_cache);