lvmcache not promoting blocks when there's free RAM

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

I have an x86-64 PC acting as a NAS, it has 2x 3TB HDDs in md(4) RAID1,
with LVM on top, and LVs for various types of data. It also has
an NVME SSD with rootfs and 16GB of RAM. I spin down the HDDs to
minimize idle power draw, and to make them spin up less often I tried
to use lvmcache for one of the LVs, with cache volume on the SSD.

However, barely anything gets cached in the lvmcache. Blocks aren't
getting promoted (based on dmsetup status), despite the cache volume
being mostly empty.

When a file is read for the first time, it gets cached in RAM
by page cache, but not on SSD by lvmcache. Subsequent reads never hit
the block layer, because the data is already in RAM, until I need to
reboot the machine. After a reboot, when something tries to read
that file again, HDDs will have to be spun up again, because it never
got promoted to SSD by lvmcache.

I looked into dm-cache's smq policy code[1], and it looks like
for a block to be promoted to the cache volume, it needs to be read
at least twice:

- first read - block gets added to the bottom of the hotspot queue
- some time passes, queue tick triggers a redistribute, some blocks
  get moved to the top of the queue
- second read - block is found to be on top of the queue, gets promoted

Unfortunately in my case the second read never comes.

I'm working it around by setting very low memory limit in cgroups that
often read small files, but I'm curious if a better solution exists.

Also, I'm guessing I'm not the first one discovering this - is there
any bugtracker where I can find or submit an issue like this?

I have a few ideas on how this could be fixed in the kernel, but
I don't know if such patches would be welcome or where to reach
device-mapper developers to ask them about it.

I'd be thankful for guidance on how to proceed with this.

Here are more details about the setup:

    $ uname -a
    Linux roy 5.10.0-20-amd64 #1 SMP Debian 5.10.158-2 (2022-12-13) x86_64 GNU/Linux
    $ head -n1 /etc/os-release
    PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
    $ sudo lvs -a
      LV                     VG    Attr       LSize   Pool                 Origin          Data%  Meta%  Move Log Cpy%Sync Convert
      archive                greed Cwi-aoC--- 250,00g [archive_cache_cvol] [archive_corig] 1,83   24,09           0,00
      [archive_cache_cvol]   greed Cwi-aoC---  50,00g
      [archive_corig]        greed owi-aoC--- 250,00g
    [...]
    $ sudo pvs
      PV             VG    Fmt  Attr PSize    PFree
      /dev/md126     greed lvm2 a--    <2,00t <473,00g
      /dev/nvme0n1p3 greed lvm2 a--  <200,00g <150,00g


I have graphs showing IO metrics from /proc/diskstats
and `dmsetup status`, but I don't know if/how one should send pictures
to the list.

This is my first time posting to the list so please let me know
if I made any mistakes. I can provide more details about my usecase,
or my ideas for fixes, but I wasn't sure if this is the right place or
how much detail is appropriate. I'll appreciate any guidance.

Regards

Wolf480pl

[1]: https://elixir.bootlin.com/linux/v5.10.200/source/drivers/md/dm-cache-policy-smq.c




[Index of Archives]     [Gluster Users]     [Kernel Development]     [Linux Clusters]     [Device Mapper]     [Security]     [Bugtraq]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]

  Powered by Linux