mm: swap: properly update readahead statistics in unuse_pte_range()
Subsystems (2)
PATCH v4 1/1 mm: swap: properly update readahead statistics in unuse_pte_range()
In unuse_pte_range() we blindly swap-in pages without checking if the swap entry is already present in the swap cache.
By doing this, the hit/miss ratio used by the swap readahead heuristic is not properly updated and this leads to non-optimal performance during swapoff.
Tracing the distribution of the readahead size returned by the swap readahead heuristic during swapoff shows that a small readahead size is used most of the time as if we had only misses (this happens both with cluster and vma readahead), for example:
r::swapin_nr_pages(unsigned long offset):unsigned long:$retval
COUNT EVENT
36948 $retval = 8
44151 $retval = 4
49290 $retval = 1
527771 $retval = 2Checking if the swap entry is present in the swap cache, instead, allows to properly update the readahead statistics and the heuristic behaves in a better way during swapoff, selecting a bigger readahead size:
r::swapin_nr_pages(unsigned long offset):unsigned long:$retval
COUNT EVENT
1618 $retval = 1
4960 $retval = 2
41315 $retval = 4
103521 $retval = 8In terms of swapoff performance the result is the following:
Testing environment
===================
- Host:
CPU: 1.8GHz Intel Core i7-8565U (quad-core, 8MB cache) HDD: PC401 NVMe SK hynix 512GB MEM: 16GB
- Guest (kvm):
8GB of RAM
virtio block driver
16GB swap file on ext4 (/swapfile)
Test case
=========
- allocate 85% of memory
- systemctl hibernate to force all the pages to be swapped-out to the swap file
- resume the system
- measure the time that swapoff takes to complete:
# /usr/bin/time swapoff /swapfile
Result (swapoff time)
======
5.6 vanilla 5.6 w/ this patch
----------- -----------------
cluster-readahead 22.09s 12.19s
vma-readahead 18.20s 15.33sConclusion
==========
The specific use case this patch is addressing is to improve swapoff performance in cloud environments when a VM has been hibernated, resumed and all the memory needs to be forced back to RAM by disabling swap.
This change allows to better exploits the advantages of the readahead heuristic during swapoff and this improvement allows to to speed up the resume process of such VMs.
---
Changes in v4:
- added a "conclusion" section in the patch description to better explain the importance of this change (no functional changes)
mm/swapfile.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
mm/swapfile.c +8 -4
@@ -1937,10 +1937,14 @@ static int unuse_pte_range(struct vm_area_struct *vma, pmd_t *pmd,pte_unmap (pte); swap_map = &si->swap_map[offset]; - vmf.vma = vma; - vmf.address = addr; - vmf.pmd = pmd; - page =swapin_readahead (entry,GFP_HIGHUSER_MOVABLE , &vmf); + page =lookup_swap_cache (entry, vma, addr); +if (!page) { + vmf.vma = vma; + vmf.address = addr; + vmf.pmd = pmd; + page =swapin_readahead (entry,GFP_HIGHUSER_MOVABLE , + &vmf); + }if (!page) {if (*swap_map ==0 || *swap_map ==SWAP_MAP_BAD ) goto try_next;
Signature · 1 line
2.25.1
Quoted 68 lines · Andrea Righi
In
unuse_pte_range()we blindly swap-in pages without checking if the swap entry is already present in the swap cache.By doing this, the hit/miss ratio used by the swap readahead heuristic is not properly updated and this leads to non-optimal performance during swapoff.
Tracing the distribution of the readahead size returned by the swap readahead heuristic during swapoff shows that a small readahead size is used most of the time as if we had only misses (this happens both with cluster and vma readahead), for example:
r::swapin_nr_pages(unsigned long offset):unsigned long:$retvalCOUNT EVENT 36948 $retval = 8 44151 $retval = 4 49290 $retval = 1 527771 $retval = 2Checking if the swap entry is present in the swap cache, instead, allows to properly update the readahead statistics and the heuristic behaves in a better way during swapoff, selecting a bigger readahead size:
r::swapin_nr_pages(unsigned long offset):unsigned long:$retvalCOUNT EVENT 1618 $retval = 1 4960 $retval = 2 41315 $retval = 4 103521 $retval = 8In terms of swapoff performance the result is the following:
Testing environment
===================- Host:
CPU: 1.8GHz Intel Core i7-8565U (quad-core, 8MB cache) HDD: PC401 NVMe SK hynix 512GB MEM: 16GB- Guest (kvm):
8GB of RAM
virtio block driver
16GB swap file on ext4 (/swapfile)Test case
=========
- allocate 85% of memory
-systemctl hibernateto force all the pages to be swapped-out to the swap file
- resume the system
- measure the time that swapoff takes to complete:# /usr/bin/time swapoff /swapfileResult (swapoff time)
======
5.6 vanilla 5.6 w/ this patch
----------- -----------------cluster-readahead 22.09s 12.19s vma-readahead 18.20s 15.33sConclusion
==========The specific use case this patch is addressing is to improve swapoff performance in cloud environments when a VM has been hibernated, resumed and all the memory needs to be forced back to RAM by disabling swap.
Quoted 6 lines
This change allows to better exploits the advantages of the readahead heuristic during swapoff and this improvement allows to to speed up the resume process of such VMs.
Reviewed-by "Huang, Ying" <[email protected]>Signed-off-by Andrea Righi <[email protected]>
Looks good to me, Thanks!
Best Regards,
Huang, Ying
Quoted 31 lines
---
Changes in v4:
- added a "conclusion" section in the patch description to better explain the importance of this change (no functional changes)mm/swapfile.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)mm/swapfile.c +8
-4@@ -1937,10 +1937,14 @@ static int unuse_pte_range(struct vm_area_struct *vma, pmd_t *pmd,pte_unmap (pte); swap_map = &si->swap_map[offset]; - vmf.vma = vma; - vmf.address = addr; - vmf.pmd = pmd; - page =swapin_readahead (entry,GFP_HIGHUSER_MOVABLE , &vmf); + page =lookup_swap_cache (entry, vma, addr); +if (!page) { + vmf.vma = vma; + vmf.address = addr; + vmf.pmd = pmd; + page =swapin_readahead (entry,GFP_HIGHUSER_MOVABLE , + &vmf); + }if (!page) {if (*swap_map ==0 || *swap_map ==SWAP_MAP_BAD ) goto try_next;