From 300b6f73714fd7e82491eb49db283d78495c4421 Mon Sep 17 00:00:00 2001 From: Dmitry Osipenko Date: Tue, 25 Mar 2025 23:27:13 +0300 Subject: [PATCH] util/disk_cache: Re-enable multi-file cache by default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Acked-by: Timothy Arceri Signed-off-by: Dmitry Osipenko Part-of: --- docs/envvars.rst | 24 ++++++++++++++++++------ src/util/disk_cache.c | 10 ++++++---- src/util/tests/cache_test.cpp | 11 +++++++++++ 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/docs/envvars.rst b/docs/envvars.rst index 90f856566ea..bf3effa66dc 100644 --- a/docs/envvars.rst +++ b/docs/envvars.rst @@ -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. diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c index 9bcfde6907a..3dfde287dc0 100644 --- a/src/util/disk_cache.c +++ b/src/util/disk_cache.c @@ -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 , 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"); diff --git a/src/util/tests/cache_test.cpp b/src/util/tests/cache_test.cpp index f181178c809..d1772f3240f 100644 --- a/src/util/tests/cache_test.cpp +++ b/src/util/tests/cache_test.cpp @@ -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";