On Tue, Jul 03, 2018 at 01:30:20PM +0200, Maximilian Pichler wrote:
> On Tue, Jul 3, 2018 at 11:47 AM, Janne Johansson <icepic...@gmail.com> wrote:
> > https://www.tedunangst.com/flak/post/2Q-buffer-cache-algorithm
> 
> Thanks. If I'm reading this correctly upon access (read or write), an
> action is performed depending on what queue a buffer is in:
> - none: Take a buffer from the tail of the cold queue and insert it at
> the front of the hot queue.
> - hot: Keep it there, but move to the front.
> - cold: Move it to the front of the warm queue.
> - warm: Keep it there, but move to the front.
> 
> If a buffer reaches the tail of a queue it moves on like this:
> hot -> cold
> cold -> (delete)
> warm -> cold
> 
> Based on this understanding, let me describe my (failed) attempt to
> remove a file from cache.
> 
> First, let's use 90%:
> $ doas sysctl kern.bufcachepercent
> kern.bufcachepercent=90
> 
> My machine has 16GB of RAM, but the end of the blog post says
> something about himem, so maybe this means only 0.9*4GB=3.6GB are
> used.
> 
> Now let's create a new file t1, of size 512MB:
> $ dd bs=1m count=512 if=/dev/zero of=t1
> 536870912 bytes transferred in 3.458 secs (155210354 bytes/sec)
> 
> t1 should be in the hot queue now. It can be read at 2GB/s (way faster
> than disk), so at least we can be sure it is in *some* queue:
> $ dd bs=1m if=t1 of=/dev/null
> 536870912 bytes transferred in 0.263 secs (2036532935 bytes/sec)
> 
> Now let's fill the hot and cold queues with something else:
> $ dd bs=1m count=16384 if=/dev/zero of=t2
> 17179869184 bytes transferred in 57.210 secs (300290968 bytes/sec)
> 
> This should have moved t1 first from the warm to the cold queue and
> then removed it from the cold queue. But strangely it can still be
> read at 2GB/s:
> $ dd bs=1m if=t1 of=/dev/null
> 536870912 bytes transferred in 0.251 secs (2135681199 bytes/sec)
> 
> Why is this? How come t1 is still in the cache?
> 

Because it is more complicated. Because buffers are flipped from DMA mem
high mem in some situations. IIRC if the DMA hot queue is full the tail
buffers are flipped. Also just doing one dd is not enough to move buffers
between queues. For that they need to be read multiple times. Also write
buffers are never put in high mem or actually flipped down when written.

In short the buffer cache is a complex beast and the few statistic numbers
systat are not enough to correctly understand the various states buffers
can be in.

-- 
:wq Claudio

Reply via email to