Enable query classifier cache by default

Enabling it will give a performance improvement and it offloads work from
the CPU. This leads to better and more complete utilization of system
resources.
This commit is contained in:
Markus Mäkelä 2018-08-22 08:52:28 +03:00
parent 13c04324cf
commit 1692765503
No known key found for this signature in database
GPG Key ID: 72D48FCE664F7B19
4 changed files with 64 additions and 17 deletions

View File

@ -552,26 +552,29 @@ _qc_sqlite_ - supports the following arguments:
#### `query_classifier_cache_size`
If present, enables and specifies the maximum size of the query classifier cache.
Specifies the maximum size of the query classifier cache. The default limit is
40% of total system memory.
If the query classifier cache has been enabled, MaxScale will, after a statement
has been parsed, store the classification result using the canonicalized version
of the statement as the key.
When the query classifier cache has been enabled, MaxScale will, after a
statement has been parsed, store the classification result using the
canonicalized version of the statement as the key.
When the classification result for a statement is needed, MaxScale will first
canonicalize the statement and check whether the result can be found in the cache.
If it can, the statement will not be parsed at all but the cached result is used.
If the classification result for a statement is needed, MaxScale will first
canonicalize the statement and check whether the result can be found in the
cache. If it can, the statement will not be parsed at all but the cached result
is used.
The configuration parameter takes one integer that specifies the maximum size of
the cache. The size of the cache can be specifed as explained [here](#sizes).
The configuration parameter takes one integer that specifies the maximum size
of the cache. The size of the cache can be specifed as explained [here](#sizes).
```
# 1MB query classifier cache
query_classifier_cache=1MB
query_classifier_cache_size=1MB
```
Note that MaxScale uses a separate cache for each worker thread. So, the total
amount of memory used at most by the cache is obtained by multiplying the
size specified here, with the number the worker threads used.
amount of memory used at most by the cache is obtained by multiplying the size
specified here, with the value of `threads`.
##### `log_unrecognized_statements`

View File

@ -154,8 +154,20 @@ bool clean_up_pathname(char *path);
bool mxs_mkdir_all(const char *path, int mask);
/**
* Return the number of processors
*
* @return Number of processors or 1 if the information is not available
*/
long get_processor_count();
/**
* Return total system memory
*
* @return Total memory in bytes or 0 if the information is not available
*/
int64_t get_total_memory();
/**
* Store a 4 byte integer
*

View File

@ -1123,6 +1123,22 @@ bool config_load_global(const char *filename)
{
log_config_error(filename, rval);
}
else
{
// Do some post-processing for auto-sized default variables
if (gateway.qc_cache_properties.max_size == -1)
{
int64_t mem_per_thr = get_total_memory() * 0.4 / gateway.n_threads;
mxb_assert(mem_per_thr >= 0);
gateway.qc_cache_properties.max_size = mem_per_thr;
if (mem_per_thr == 0)
{
MXS_WARNING("Could not auto-detect total system memory for the query classifier "
"cache. Manually define `%s` to enable it.", CN_QUERY_CLASSIFIER_CACHE_SIZE);
}
}
}
return rval == 0;
}
@ -2608,6 +2624,9 @@ void config_set_global_defaults()
gateway.passive = false;
gateway.promoted_at = 0;
// Note: This is not a valid cache value: it is used to detect that the default value is used
gateway.qc_cache_properties.max_size = -1;
gateway.thread_stack_size = 0;
gateway.writeq_high_water = 0;
gateway.writeq_low_water = 0;

View File

@ -1119,11 +1119,6 @@ int open_unix_socket(enum mxs_socket_type type, struct sockaddr_un *addr, const
return fd;
}
/**
* Return the number of processors available.
* @return Number of processors or 1 if the required definition of _SC_NPROCESSORS_CONF
* is not found
*/
long get_processor_count()
{
long processors = 1;
@ -1139,6 +1134,24 @@ long get_processor_count()
return processors;
}
int64_t get_total_memory()
{
int64_t pagesize = 0;
int64_t num_pages = 0;
#if defined _SC_PAGESIZE && defined _SC_PHYS_PAGES
if ((pagesize = sysconf(_SC_PAGESIZE)) <= 0 || (num_pages = sysconf(_SC_PHYS_PAGES)) <= 0)
{
MXS_WARNING("Unable to establish total system memory");
pagesize = 0;
num_pages = 0;
}
#else
#error _SC_PAGESIZE and _SC_PHYS_PAGES are not defined
#endif
mxb_assert(pagesize * num_pages > 0);
return pagesize * num_pages;
}
namespace maxscale
{