On Wed, Apr 16, 2025 at 05:18:17PM +0200, Miklos Szeredi wrote: > On Tue, 15 Apr 2025 at 19:22, Andreas Dilger <adilger@xxxxxxxxx> wrote: > > > If the negative dentry count exceeds the actual entry count, it would > > be more efficient to just cache all of the positive dentries and mark > > the directory with a "full dentry list" flag that indicates all of the > > names are already present in dcache and any miss is authoritative. > > In essence that gives an "infinite" negative lookup cache instead of > > explicitly storing all of the possible negative entries. > > This sounds nice in theory, but there are quite a number of things to sort out: > > - The "full dir read" needs to be done in the background to avoid > large latencies, right? > > - Instantiate inodes during this, or have some dentry flag indicating > that it's to be done later? > > - When does the whole directory get reclaimed? > > - What about revalidation in netfs? How often should a "full dir > read" get triggered? > > I feel that it's just too complex. > > What's wrong with just trying to get rid of the bad effects of > negative dentries, instead of getting rid of the dentries themselves ? > > Lack of memory pressure should mean that nobody else needs that > memory, so it should make no difference if it's used up in negative > dentries instead of being free memory. Maybe I'm missing something > fundamental? There is no issue with the existence of huge numbers of negative dentries. The issue is the overhead and latency of reclaiming hundreds of millions of tiny objects to release the memory is prohibitive. Dentry reclaim is generally pretty slow, especially if it is being done by a single background thread like kswapd. FWIW, I think there is a simpler version of this "per-directory dentry count" heuristic that might work well enough to bound the upper maximum: apply the same hueristic to the entire dentry cache. I'm pretty sure this has been proposed in the past, but we should probably revisit it anyway because this problem hasn't gone away. i.e. if the number of negative dentries exceeds the number of positive dentries and the total number of dentries exceeds a certain amount of memory, kick a background thread to reap some negative dentries from the LRU. e.g. every 30s check if dentries exceed 10% of memory and negative dentries exceed positive. If so, reap the oldest 10% of negative dentries. That will still allow a system with free memory to build up a -lot- of negative dentries, but also largely bound the amount of free memory that can be consumed by negative dentries to around 5% of total memory. -Dave. -- Dave Chinner david@xxxxxxxxxxxxx