[squid-dev] RFC: Transitioning ipcache and fqdncache to ClpMap
Alex Rousskov
rousskov at measurement-factory.com
Tue Jul 11 13:50:27 UTC 2023
On 7/11/23 03:35, Francesco Chemolli wrote:
> I'd like to start working on transitioning ipcache and fqdncache to
> ClpMap.
Thank you. Please _plan_ to convert them both (as you are already doing
here!), but then convert them one at a time (to avoid duplicating
review/modification efforts). I bet we will need at least 6 "minimal"
PRs here.
> There is only one snag,
FWIW, I did not check all the details, but I see two more snags,
including a very important/difficult one:
2. ipcache.cc code "locks" entries to prevent their removal from the
cache in certain cases. See ipcache_entry::locks. The corresponding code
already has serious problems, but the approach itself needs to be
refactored using RefCount, so that a cache entry can be removed from the
cache at any time. This is not going to be easy and will require at
least one dedicated PR, but I believe it is an essential preliminary step.
3. We should also remove ipcache_low and ipcache_high directives before
the conversion. Those two parameters do not make sense for an
instant-removal cache: They are not needed for anything useful, create
performance anomalies, and increase code/configuration complexity. The
corresponding logic is not supported by ClpMap.
Now back to your snag #1:
> the current configuration directives specify a cache
> size in number of entries, where ClpMap specifies a max size.
>
> I can see two ways forward:
> 1. Add a second max-size parameter to ClpMap, ensuring that it starts
> expunging entries when the maximum capacity in either memory use or
> number of entries is reached
I am not against this option, especially if we deprecate/remove existing
count-based configuration (ipcache_size and friends) and add byte-based
configuration to replace it (the directive name is to be determined).
> 2. guesstimate how many bytes of memory an ipcache/fqdncache uses, and
> convert
I support this option if we deprecate/remove existing counter-based
configuration (ipcache_size and friends) and add bytes-based
configuration (the directive name is to be determined). I prefer this
option in this case because it avoids making ClpMap code more complex
long-term just to accommodate a short-term deprecation need. The extra
code complexity is not huge, but cache limit enforcement is tricky, and
the history of the related ClpMap code suggests that adding a new limit
vector will take several (likely painful) iterations.
> Regardless, I believe that from the user-facing perspective, a solid way
> forward is to give to the ipcache_size and fqdncache_size directives an
> option to specify a max size in entries or, by adding a memory-size
> suffix, in used memory, and possibly deprecate the max-size-in-entries
> option in Squid 7 and retire it in squid 8.
In the vast majority of deployments, the existing count-based limit is
inferior to the byte-based limit because memory bytes is a real resource
that admins understand and have to optimize/ration/limit (while the
number of entries has no direct relationship to anything most admins
should care about). Thus, long-term, we should provide byte-based
configuration options.
To keep things simple and to facilitate deprecation, I recommend adding
two new directives instead of making the existing directives more
complex. Naming is a separate/secondary issue, but we can model the new
names based on the two existing primary caches (cache_dir and
cache_mem). Alternatively, we can use a more natural(?) word order.
Here are a few variants (from most to least preferred by me):
* dns_cache and reverse_dns_cache
* cache_dns and cache_dns_reverse
* cache_ip and cache_domain
HTH,
Alex.
More information about the squid-dev
mailing list