我有一个 200GB LVM 卷,由 60GB SSD 支持,使用lvmcache(7)
,在 Linux 内核版本 4.7.2 上。我一直在尝试fstrim
,在我看来,丢弃没有按应有的方式(或根本没有)工作:
$ df /dev/mapper/vg0-test
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg0-test 199G 46G 143G 25% /media/test
# lsblk -D /dev/mapper/vg0-test
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
vg0-test 0 16M 16G 0
# fstrim -v /media/test
/media/test: 132.4 GiB (142170128384 bytes) trimmed
# lvs -o+devices,cache_total_blocks,cache_used_blocks,cache_dirty_blocks,cache_read_hits,cache_read_misses,cache_write_hits,cache_write_misses,segtype,discards
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices CacheTotalBlocks CacheUsedBlocks CacheDirtyBlocks CacheReadHits CacheReadMisses CacheWriteHits CacheWriteMisses Type Discards
test vg0 Cwc-aoC--- 200.00g [test-cache] 100.00 23.83 0.00 test_corig(0) 983040 983040 39 44554204 5209836 79687783 2798870 cache
我希望,由于实际使用的空间小于缓存的大小,因此使用fstrim
lvmcache可以摆脱未使用的缓存数据块并修剪底层SSD。但这似乎并没有发生。
我所拥有的内核版本是否支持我所期望的功能?读取 DM 和块层代码并不简单,所以如果可能的话,我宁愿不要以困难的方式解决这个问题。
如果支持,我的 LVM 设置是否有问题?我相信默认的 LVM 行为 wrt 丢弃是将它们传递到底层设备,但也许我遗漏了一些东西?