util/disk_cache: Re-enable multi-file cache by default

Over past months a performance issue was found with the Mesa-DB cache
implementation that results in a too slow cache startup time when cache is
full. A better indexing strategy will need to be invented to mitigate the
issue. Until then, let's default back to the multi-file cache.

Suggested-by: Michel Dänzer <mdaenzer@redhat.com>
Acked-by: Timothy Arceri <tarceri@itsqueeze.com>
Signed-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34199>
This commit is contained in:
Dmitry Osipenko
2025-03-25 23:27:13 +03:00
committed by Marge Bot
parent 9822fa3ef3
commit 300b6f7371
3 changed files with 35 additions and 10 deletions

View File

@@ -201,10 +201,10 @@ Core Mesa environment variables
if set, determines the directory to be used for the on-disk cache of
compiled shader programs. If set then the cache will be stored in
``$MESA_SHADER_CACHE_DIR/mesa_shader_cache_db``. If this variable is not
``$MESA_SHADER_CACHE_DIR/mesa_shader_cache``. If this variable is not
set, then the cache will be stored in
``$XDG_CACHE_HOME/mesa_shader_cache_db`` (if that variable is set), or else
within ``.cache/mesa_shader_cache_db`` within the user's home directory.
``$XDG_CACHE_HOME/mesa_shader_cache`` (if that variable is set), or else
within ``.cache/mesa_shader_cache`` within the user's home directory.
.. envvar:: MESA_SHADER_CACHE_SHOW_STATS
@@ -228,9 +228,9 @@ Core Mesa environment variables
.. envvar:: MESA_DISK_CACHE_MULTI_FILE
if set to 1, enables the multi file on-disk shader cache implementation
instead of the default Mesa-DB cache implementation.
This implementation increases the overall disk usage.
if set to 1 (set by default), enables the multi file on-disk
shader cache implementation. This implementation increases the overall
disk usage.
If :envvar:`MESA_SHADER_CACHE_DIR` is set, the cache will be stored in
``$MESA_SHADER_CACHE_DIR/mesa_shader_cache``, or else within
``$XDG_CACHE_HOME/mesa_shader_cache`` (if that variable is set)
@@ -248,6 +248,18 @@ Core Mesa environment variables
and ``filename1_idx.foz``. A limit of 8 DBs can be loaded and this limit
is shared with :envvar:`MESA_DISK_CACHE_READ_ONLY_FOZ_DBS_DYNAMIC_LIST`.
.. envvar:: MESA_DISK_CACHE_DATABASE
if set to 1, enables the Mesa-DB single file on-disk shader cache
implementation instead of the default multi-file cache implementation.
Like :envvar:`MESA_DISK_CACHE_SINGLE_FILE`, Mesa-DB reduces overall
disk usage but Mesa-DB supports cache size limits via
:envvar:`MESA_SHADER_CACHE_MAX_SIZE`. If
:envvar:`MESA_SHADER_CACHE_DIR` is not set, the cache will be stored
in ``$XDG_CACHE_HOME/mesa_shader_cache_db`` (if that variable is set)
or else within ``.cache/mesa_shader_cache_db`` within the user's home
directory.
.. envvar:: MESA_DISK_CACHE_DATABASE_NUM_PARTS
specifies number of mesa-db cache parts, default is 50.

View File

@@ -223,17 +223,19 @@ disk_cache_create(const char *gpu_name, const char *driver_id,
uint64_t max_size = 0;
char *max_size_str;
if (debug_get_bool_option("MESA_DISK_CACHE_SINGLE_FILE", false))
if (debug_get_bool_option("MESA_DISK_CACHE_SINGLE_FILE", false)) {
cache_type = DISK_CACHE_SINGLE_FILE;
else if (debug_get_bool_option("MESA_DISK_CACHE_MULTI_FILE", false))
cache_type = DISK_CACHE_MULTI_FILE;
else {
} else if (debug_get_bool_option("MESA_DISK_CACHE_DATABASE", false)) {
cache_type = DISK_CACHE_DATABASE;
/* Since switching the default cache to <mesa_shader_cache_db>, remove the
* old cache folder if it hasn't been modified for more than 7 days.
*/
if (!getenv("MESA_SHADER_CACHE_DIR") && !getenv("MESA_GLSL_CACHE_DIR") && disk_cache_enabled())
disk_cache_delete_old_cache();
} else if (debug_get_bool_option("MESA_DISK_CACHE_MULTI_FILE", true)) {
cache_type = DISK_CACHE_MULTI_FILE;
} else {
return NULL;
}
max_size_str = getenv("MESA_SHADER_CACHE_MAX_SIZE");

View File

@@ -819,7 +819,9 @@ TEST_F(Cache, Database)
#ifndef ENABLE_SHADER_CACHE
GTEST_SKIP() << "ENABLE_SHADER_CACHE not defined.";
#else
setenv("MESA_DISK_CACHE_MULTI_FILE", "false", 1);
setenv("MESA_DISK_CACHE_DATABASE_NUM_PARTS", "1", 1);
setenv("MESA_DISK_CACHE_DATABASE", "true", 1);
test_disk_cache_create(mem_ctx, CACHE_DIR_NAME_DB, driver_id);
@@ -845,6 +847,7 @@ TEST_F(Cache, Database)
test_put_big_sized_entry_to_empty_cache(driver_id);
setenv("MESA_DISK_CACHE_DATABASE", "false", 1);
unsetenv("MESA_DISK_CACHE_DATABASE_NUM_PARTS");
err = rmrf_local(CACHE_TEST_TMP);
@@ -872,6 +875,7 @@ TEST_F(Cache, Combined)
#else
setenv("MESA_DISK_CACHE_SINGLE_FILE", "true", 1);
setenv("MESA_DISK_CACHE_MULTI_FILE", "true", 1);
setenv("MESA_DISK_CACHE_DATABASE", "false", 1);
#ifdef SHADER_CACHE_DISABLE_BY_DEFAULT
setenv("MESA_SHADER_CACHE_DISABLE", "false", 1);
@@ -942,6 +946,7 @@ TEST_F(Cache, Combined)
setenv("MESA_DISK_CACHE_SINGLE_FILE", "false", 1);
setenv("MESA_DISK_CACHE_MULTI_FILE", "false", 1);
setenv("MESA_DISK_CACHE_DATABASE", "true", 1);
/* Create MESA-DB cache with enabled retrieval from the read-only
* cache. */
@@ -1010,6 +1015,7 @@ TEST_F(Cache, Combined)
disk_cache_destroy(cache_mesa_db);
/* Create default multi-file cache. */
setenv("MESA_DISK_CACHE_DATABASE", "false", 1);
setenv("MESA_DISK_CACHE_MULTI_FILE", "true", 1);
/* Enable read-only cache. */
@@ -1068,7 +1074,9 @@ TEST_F(Cache, Combined)
disk_cache_destroy(cache_multifile);
unsetenv("MESA_DISK_CACHE_SINGLE_FILE");
unsetenv("MESA_DISK_CACHE_MULTI_FILE");
unsetenv("MESA_DISK_CACHE_DATABASE");
int err = rmrf_local(CACHE_TEST_TMP);
EXPECT_EQ(err, 0) << "Removing " CACHE_TEST_TMP " again";
@@ -1325,13 +1333,16 @@ TEST_F(Cache, DatabaseMultipartEviction)
#ifndef ENABLE_SHADER_CACHE
GTEST_SKIP() << "ENABLE_SHADER_CACHE not defined.";
#else
setenv("MESA_DISK_CACHE_MULTI_FILE", "false", 1);
setenv("MESA_DISK_CACHE_DATABASE_NUM_PARTS", "3", 1);
setenv("MESA_DISK_CACHE_DATABASE", "true", 1);
test_disk_cache_create(mem_ctx, CACHE_DIR_NAME_DB, driver_id);
test_multipart_eviction(driver_id);
unsetenv("MESA_DISK_CACHE_DATABASE_NUM_PARTS");
unsetenv("MESA_DISK_CACHE_DATABASE");
int err = rmrf_local(CACHE_TEST_TMP);
EXPECT_EQ(err, 0) << "Removing " CACHE_TEST_TMP " again";