Manjaro Difference between revisions of "Swap"

Difference between revisions of "Swap"

From Manjaro
m (Improved readability)
m (Prepared for translation)
Line 1: Line 1:
__TOC__
__TOC__
 
<languages />
<translate>
=Overview=
=Overview=


Swap space is used to extend the amount of memory(RAM) available for running programs.
Swap space is used to extend the amount of memory(RAM) available for running programs.</translate>
* Without swap space, if you run out of memory, applications ''will'' be terminated up to and including the entire system crashing.
* <translate>Without swap space, if you run out of memory, applications ''will'' be terminated up to and including the entire system crashing.</translate>
* With swap space available to the system, the kernel can take less frequently accessed memory pages from inactive applications / services and write them to disk ("swapping" them), allowing more actual RAM to be available for active applications.
* <translate>With swap space available to the system, the kernel can take less frequently accessed memory pages from inactive applications / services and write them to disk ("swapping" them), allowing more actual RAM to be available for active applications.</translate>




There are three different ways in which swap can be managed in Manjaro:
<translate>There are three different ways in which swap can be managed in Manjaro:</translate>
* A swap partition
* <translate>A swap partition</translate>
* A swap file
* <translate>A swap file</translate>
* zswap
* <translate>zswap</translate>




This article tries to be as comprehensive as possible but even more information can be found in the [[#See_Also|articles linked below]]
<translate>This article tries to be as comprehensive as possible but even more information can be found in the [[<tvar|link>Special:MyLanguage/#See_Also</>|articles linked below]]</translate>
 
<translate>
=Do I Need Swap=
=Do I Need Swap=


That is a question that cannot be answerd without having a look at your configuration and even with plenty of available memory, it is often used as a safety net or even sometimes due to specific application requirements so have a look at the following non-exhaustive list:
That is a question that cannot be answerd without having a look at your configuration and even with plenty of available memory, it is often used as a safety net or even sometimes due to specific application requirements so have a look at the following non-exhaustive list:</translate>
* If you use hibernation: ''yes, you need swap!''
* <translate>If you use hibernation: ''yes, you need swap!''</translate>
* If you have services that are not always active, but are still running all the time: ''yes, you need swap!''
* <translate>If you have services that are not always active, but are still running all the time: ''yes, you need swap!''</translate>
* If you have an application that allocates virtual memory directly for temporary storage instead of RAM: ''yes, you need swap!''
* <translate>If you have an application that allocates virtual memory directly for temporary storage instead of RAM: ''yes, you need swap!''</translate>
* If you have an application that has a memory leak: ''yes, you need swap!''
* <translate>If you have an application that has a memory leak: ''yes, you need swap!''</translate>
* If you have a server with 1TB of RAM that you're using as a desktop without applications allocating virtual memory or having memory leaks: ''No, you don't need swap!''
* <translate>If you have a server with 1TB of RAM that you're using as a desktop without applications allocating virtual memory or having memory leaks: ''No, you don't need swap!''</translate>
 
<translate>
=How Much Swap do I Need=
=How Much Swap do I Need=


The amount of swap you need is highly variable based on ''your'' specific applications and workload.  There is no universal formula on swap size without monitoring usage over a period of time.  A reasonable place to start would be:
The amount of swap you need is highly variable based on ''your'' specific applications and workload.  There is no universal formula on swap size without monitoring usage over a period of time.  A reasonable place to start would be:</translate>
* For less then 4GB of physical memory (RAM), it's highly recommended that the swap space should, as a base minimum, be equal to the amount of RAM. Also, it's recommended that the swap space is maximum twice the amount of RAM depending upon the amount of disk space available for the system because of diminishing returns.  
* <translate>For less then 4GB of physical memory (RAM), it's highly recommended that the swap space should, as a base minimum, be equal to the amount of RAM. Also, it's recommended that the swap space is maximum twice the amount of RAM depending upon the amount of disk space available for the system because of diminishing returns.</translate>
* For more modern systems (>4GB), your swap space should be at a minimum be equal to your physical memory (RAM) size '''if you use hibernation''', otherwise you need a minimum of ROUNDUP(SQRT(RAM)) I.E. the square root of your RAM size rounded up to the next GB. The maximum, is again twice the amount of RAM, again because of diminishing returns.  
* <translate>For more modern systems (>4GB), your swap space should be at a minimum be equal to your physical memory (RAM) size '''if you use hibernation''', otherwise you need a minimum of ROUNDUP(SQRT(RAM)) I.E. the square root of your RAM size rounded up to the next GB. The maximum, is again twice the amount of RAM, again because of diminishing returns.</translate>
* The only downside to having more swap space than you will actually use, is the disk space you will be reserving for it cannot be used for application or system data.
* <translate>The only downside to having more swap space than you will actually use, is the disk space you will be reserving for it cannot be used for application or system data.</translate>


The "diminishing returns" means that if you need more swap space than twice your RAM size, you would be better off adding more RAM as Hard Disk Drive (HDD) access is about 10³ slower then RAM access, so something that would take 1 second, suddenly takes more then 15 minutes! And on a Solid State Drive (SSD) the same operation that took 1 second in RAM will still take about 1 minute on that SSD!
<translate>The "diminishing returns" means that if you need more swap space than twice your RAM size, you would be better off adding more RAM as Hard Disk Drive (HDD) access is about 10³ slower then RAM access, so something that would take 1 second, suddenly takes more then 15 minutes! And on a Solid State Drive (SSD) the same operation that took 1 second in RAM will still take about 1 minute on that SSD!</translate>


Taking into accound all of the above, this brings us to the following table:
<translate>Taking into accound all of the above, this brings us to the following table:
(last 3 columns denote swap space)  
(last 3 columns denote swap space)</translate>


         RAM  No hibernation    With Hibernation  Maximum
         <translate>RAM  No hibernation    With Hibernation  Maximum</translate>
         1GB              1GB                2GB      2GB
         1GB              1GB                2GB      2GB
         2GB              2GB                3GB      4GB
         2GB              2GB                3GB      4GB
Line 43: Line 44:
         4GB              4GB                6GB      8GB
         4GB              4GB                6GB      8GB


         RAM  No hibernation    With Hibernation  Maximum
         <translate>RAM  No hibernation    With Hibernation  Maximum</translate>
         5GB              2GB                7GB    10GB
         5GB              2GB                7GB    10GB
         6GB              2GB                8GB    12GB
         6GB              2GB                8GB    12GB
Line 59: Line 60:
         4TB            64GB              4160GB      8TB
         4TB            64GB              4160GB      8TB
         8TB            91GB              8283GB    16TB
         8TB            91GB              8283GB    16TB
{{note|The largest server one of the authors of this wiki has ever installed had, indeed, 8TB of RAM}}
{{note|<translate>The largest server one of the authors of this wiki has ever installed had, indeed, 8TB of RAM</translate>}}
 
<translate>
=Displaying Swap Information=
=Displaying Swap Information=


The command {{ic|swapon}} will display your current swap information.  For example:
The command {{ic|swapon}} will display your current swap information.  For example:</translate>
  swapon
  swapon
  NAME      TYPE      SIZE  USED PRIO
  NAME      TYPE      SIZE  USED PRIO
  /dev/sda7 partition  20G  44.3M  -2
  /dev/sda7 partition  20G  44.3M  -2


The following script will:
<translate>The following script will:</translate>
* show whether zswap is active or not and if active, give zswap parameters if run with the `sudo` command
* <translate>show whether zswap is active or not and if active, give zswap parameters if run with the `sudo` command</translate>
* display a list of all applications / services that take up swap and how much they take up in descending order
* <translate>display a list of all applications / services that take up swap and how much they take up in descending order</translate>


  #!/bin/bash
  #!/bin/bash
Line 90: Line 91:
   awk '/VmSwap|Name/{printf $2 "\t" $3}END{ print "" }' "$szFile"
   awk '/VmSwap|Name/{printf $2 "\t" $3}END{ print "" }' "$szFile"
  done | sort --key 2 --numeric --reverse | more
  done | sort --key 2 --numeric --reverse | more
 
<translate>
=Using a Swap Partition=
=Using a Swap Partition=


A swap partition is the traditional way of managing swap.  In this scenario, a dedicated partition (or partitions) are created for holding swap.
A swap partition is the traditional way of managing swap.  In this scenario, a dedicated partition (or partitions) are created for holding swap.</translate>
 
<translate>
==Creating and Enabling a Swap Partition==
==Creating and Enabling a Swap Partition==


To create a swap partition, you need enough unallocated disk space to create an additional partition. If you do not have enough space, skip to the next section [[#Using_a_swap_file]]. A swap partition can be created in any disk management / partition management tool and should be set as type `linuxswap`.
To create a swap partition, you need enough unallocated disk space to create an additional partition. If you do not have enough space, skip to the next section [[<tvar|link>Special:MyLanguage/#Using_a_swap_file</>|#Using_a_swap_file]]. A swap partition can be created in any disk management / partition management tool and should be set as type `linuxswap`.</translate>


Once you have a swap partition you will need to initialize the swap partition with {{ic|mkswap}}.  For example, if your swap partition is {{ic|/dev/sda3}}, you could use the command:
<translate>Once you have a swap partition you will need to initialize the swap partition with {{ic|mkswap}}.  For example, if your swap partition is {{ic|/dev/sda3}}, you could use the command:</translate>
  sudo mkswap /dev/sda3
  sudo mkswap /dev/sda3


Next we need to enable the swap partition with the {{ic|swapon}} command. Following our example above this could be done with:
<translate>Next we need to enable the swap partition with the {{ic|swapon}} command. Following our example above this could be done with:</translate>
  sudo swapon /dev/sda3
  sudo swapon /dev/sda3


In order to ensure that the swap is enabled at boot we can add an entry to {{ic|/etc/fstab}}.  It is best to use the UUID instead of the device name for this purpose.  You can add the line to fstab manually or using the command:
<translate>In order to ensure that the swap is enabled at boot we can add an entry to {{ic|/etc/fstab}}.  It is best to use the UUID instead of the device name for this purpose.  You can add the line to fstab manually or using the command:</translate>
  sudo bash -c "echo UUID=$(lsblk -no UUID /dev/sda3) none swap defaults 0 0 >> /etc/fstab"
  sudo bash -c "echo UUID=$(lsblk -no UUID /dev/sda3) none swap defaults 0 0 >> /etc/fstab"


Line 112: Line 113:
{{note|Be sure to replace /dev/sda3 in the above commands with your actual swap partition.}}
{{note|Be sure to replace /dev/sda3 in the above commands with your actual swap partition.}}
{{tip|''If you're using a HDD'' (spinning rust) put the swap partition *at the beginning of the disk* as the speed of the disk is higher on the inside tracks. On an SSD this doesn't matter.}}
{{tip|''If you're using a HDD'' (spinning rust) put the swap partition *at the beginning of the disk* as the speed of the disk is higher on the inside tracks. On an SSD this doesn't matter.}}
 
<translate>
=Using a Swapfile=
=Using a Swapfile=


Using a swap partition has one major disadvantage:  Changing the size of swap or adding swap requires repartitioning the disk.  In current Linux kernels, it is possible to use a swap file instead of a dedicated partition and as from kernel 2.6 onwards there is no performance difference any more between the two.  
Using a swap partition has one major disadvantage:  Changing the size of swap or adding swap requires repartitioning the disk.  In current Linux kernels, it is possible to use a swap file instead of a dedicated partition and as from kernel 2.6 onwards there is no performance difference any more between the two.</translate>
 


<translate>
==Creating and Enabling a Static Swapfile==
==Creating and Enabling a Static Swapfile==
</translate>
{{tip|<translate>There is no reason you can't have both a swap partition and a swapfile.  This is an easy way to add more swap without repartitioning</translate>}}


{{tip|There is no reason you can't have both a swap partition and a swapfile.  This is an easy way to add more swap without repartitioning}}


 
<translate>First create and intialize the file to hold the swap.  For example, to create a 4GB swapfile, you could use the command:</translate>
First create and intialize the file to hold the swap.  For example, to create a 4GB swapfile, you could use the command:
  sudo fallocate -l 4G /swapfile
  sudo fallocate -l 4G /swapfile
  sudo mkswap /swapfile
  sudo mkswap /swapfile




Set the appropriate permissions on the file.  It should be readable and writable only by {{ic|root}}.  This can be done with the command:
<translate>Set the appropriate permissions on the file.  It should be readable and writable only by {{ic|root}}.  This can be done with the command:</translate>
  sudo chmod u=rw,go= /swapfile
  sudo chmod u=rw,go= /swapfile




Next we need to enable the swapfile with the {{ic|swapon}} command.  Following our example above this could be done with:
<translate>Next we need to enable the swapfile with the {{ic|swapon}} command.  Following our example above this could be done with:</translate>
  sudo swapon /swapfile
  sudo swapon /swapfile




In order to ensure that the swap is enabled at boot we can add an entry to {{ic|/etc/fstab}}.  You can add the line to ftab manually or using the command:
<translate>In order to ensure that the swap is enabled at boot we can add an entry to {{ic|/etc/fstab}}.  You can add the line to ftab manually or using the command:</translate>
  sudo bash -c "echo /swapfile none swap defaults 0 0 >> /etc/fstab"
  sudo bash -c "echo /swapfile none swap defaults 0 0 >> /etc/fstab"


 
<translate>
==Swapfiles on BTRFS==
==Swapfiles on BTRFS==


As of kernel 5.0 and higher, swapfiles are supported on btfrs.  They still require some special handling in addition to the above steps.
As of kernel 5.0 and higher, swapfiles are supported on btfrs.  They still require some special handling in addition to the above steps.</translate>


 
<translate>Prior to running the {{ic|fallocate}} step above, you should run these commands:</translate>
Prior to running the {{ic|fallocate}} step above, you should run these commands:
  sudo truncate -s 0 /swapfile
  sudo truncate -s 0 /swapfile
  sudo chattr +C /swapfile
  sudo chattr +C /swapfile
Line 151: Line 151:




These commands create an empty swapfile, disable COW for that file and ensure that compression is disabled.
<translate>These commands create an empty swapfile, disable COW for that file and ensure that compression is disabled.</translate>
 


<translate>
==Swapfiles on ZFS==
==Swapfiles on ZFS==


Line 159: Line 159:




Detailed instructions on how to accomplish this can be found in this [https://github.com/zfsonlinux/pkg-zfs/wiki/HOWTO-use-a-zvol-as-a-swap-device ZoL guide].
Detailed instructions on how to accomplish this can be found in this [<tvar|link>https://github.com/zfsonlinux/pkg-zfs/wiki/HOWTO-use-a-zvol-as-a-swap-device</> ZoL guide].
 
</translate>
 
<translate>
=Automated Swap Management with systemd-swap=
=Automated Swap Management with systemd-swap=
</translate>
{{note|<translate>Using systemd-swap with on btrfs/zfs or with hibernation support requires special handling beyond the scope of this article</translate>}}


{{note|Using systemd-swap with on btrfs/zfs or with hibernation support requires special handling beyond the scope of this article}}
<translate>It is possible to automatically manage the size of your swapfile using {{ic|systemd-swap}}.  It can create swap files dynamically based on memory needs.  It is also an easy way to enable/manage [[<tvar|link>#Using_zswap_with_systemd-swap</>|zswap]]</translate>
 
 
It is possible to automatically manage the size of your swapfile using {{ic|systemd-swap}}.  It can create swap files dynamically based on memory needs.  It is also an easy way to enable/manage [[#Using_zswap_with_systemd-swap|zswap]]
 


<translate>
==Installing and Configuring systemd-swap==
==Installing and Configuring systemd-swap==


First, install and enable {{ic|systemd-swap}}
First, install and enable {{ic|systemd-swap}}</translate>
  pamac install systemd-swap
  pamac install systemd-swap
  sudo systemctl enable systemd-swap.service
  sudo systemctl enable systemd-swap.service




Next enable dynamic swap management by creating a file {{ic|/etc/systemd/swap.conf.d/myswap.conf}} with the following parameters:
<translate>Next enable dynamic swap management by creating a file {{ic|/etc/systemd/swap.conf.d/myswap.conf}} with the following parameters:</translate>
  zswap_enabled=0
  zswap_enabled=0
  zram_enabled=0
  zram_enabled=0
Line 183: Line 182:




If you would prefer a single command to create this file you could use:
<translate>If you would prefer a single command to create this file you could use:</translate>
  sudo bash -c 'echo -e "zswap_enabled=0\nzram_enabled=0\nswapfc_enabled=1" > /etc/systemd/swap.conf.d/myswap.conf'
  sudo bash -c 'echo -e "zswap_enabled=0\nzram_enabled=0\nswapfc_enabled=1" > /etc/systemd/swap.conf.d/myswap.conf'


 
<translate>
==Remove Other Swap==
==Remove Other Swap==


In order for systemd_swap to be effective you need to remove any traditional swap devices you have.
In order for systemd_swap to be effective you need to remove any traditional swap devices you have.</translate>




To display your current swap devices you can use the command {{ic|swapon}}.  For example, my test machine displays the following:
<translate>To display your current swap devices you can use the command {{ic|swapon}}.  For example, my test machine displays the following:</translate>
  swapon
  swapon
  NAME      TYPE      SIZE USED PRIO
  NAME      TYPE      SIZE USED PRIO
Line 199: Line 198:




In this example there are two swap devices.  A swapfile and a swap partition.  To turn them off we can use the command {{ic|swapoff}}.
<translate>In this example there are two swap devices.  A swapfile and a swap partition.  To turn them off we can use the command {{ic|swapoff}}.</translate>
  sudo swapoff /swapfile
  sudo swapoff /swapfile
  sudo swapoff /dev/sda3
  sudo swapoff /dev/sda3




Next we need to remove them.   
<translate>Next we need to remove them.   
The swap partition will need to be deleted using your favorite partitioning tool.  You can remove the swapfile by simply deleting it.
The swap partition will need to be deleted using your favorite partitioning tool.  You can remove the swapfile by simply deleting it.</translate>
  sudo rm /swapfile
  sudo rm /swapfile




We need to also remove any lines related to swap from {{ic|/etc/fstab}}.  Edit the file with an [[Viewing_and_editing_configuration_files|appropriate text editor]] and remove or comment out the lines for the swap space.  In the example above, we would remove these lines:
<translate>We need to also remove any lines related to swap from {{ic|/etc/fstab}}.  Edit the file with an [[<tvar|link>Special:MyLanguage/Viewing_and_editing_configuration_files</>|appropriate text editor]] and remove or comment out the lines for the swap space.  In the example above, we would remove these lines:</translate>
  UUID=c2430cf1-8ea9-4422-a5c5-5a38779194c3 swap          swap    defaults,noatime 0 2
  UUID=c2430cf1-8ea9-4422-a5c5-5a38779194c3 swap          swap    defaults,noatime 0 2
  /swapfile none swap defaults 0 0
  /swapfile none swap defaults 0 0




Next reboot.  After the reboot you should see something similiar to the following when running {{ic|swapon}}
<translate>Next reboot.  After the reboot you should see something similiar to the following when running {{ic|swapon}}</translate>
  NAME                          TYPE SIZE USED PRIO
  NAME                          TYPE SIZE USED PRIO
  /var/lib/systemd-swap/swapfc/1 file 512M  0B  -2
  /var/lib/systemd-swap/swapfc/1 file 512M  0B  -2




systemd-swap will add and remove swapfiles as your memory usage dictates.
<translate>systemd-swap will add and remove swapfiles as your memory usage dictates.</translate>
 
 
{{note|If you don't delete your existing swap partition it will be automatically activated by systemd even though you have removed it from fstab}}


{{note|<translate>If you don't delete your existing swap partition it will be automatically activated by systemd even though you have removed it from fstab</translate>}}


<translate>
==Using zswap with systemd-swap==
==Using zswap with systemd-swap==


zswap is compressed swap kept in RAM. zswap keeps the most frequently used pages in RAM and writes less frequently used pages to the swap space on disk.  In many workloads, this will result in increased swap performance and less wear and tear on SSDs.
zswap is compressed swap kept in RAM. zswap keeps the most frequently used pages in RAM and writes less frequently used pages to the swap space on disk.  In many workloads, this will result in increased swap performance and less wear and tear on SSDs.


To enable zswap with systemd-swap, simply alter the instructions above and set {{ic|zswap_enabled to 1}}
To enable zswap with systemd-swap, simply alter the instructions above and set {{ic|zswap_enabled to 1}}</translate>
 
<translate>
=Tuning & Performance Considerations=
=Tuning & Performance Considerations=


Although swap seems like a great way to expand memory, excessive swap use will cause severe performance degradation, as mentioned before.
Although swap seems like a great way to expand memory, excessive swap use will cause severe performance degradation, as mentioned before.</translate>


There are couple of parameters that can be used to tune swap utilization.  These are swappiness and vfs_cache_pressure.  To see your current settings for these you can use the following commands:
<translate>There are couple of parameters that can be used to tune swap utilization.  These are swappiness and vfs_cache_pressure.  To see your current settings for these you can use the following commands:</translate>
  cat /proc/sys/vm/swappiness
  cat /proc/sys/vm/swappiness
  cat /proc/sys/vm/vfs_cache_pressure
  cat /proc/sys/vm/vfs_cache_pressure


{{ic|swappiness}} controls how likely a page is to be transferred to swap.  This value represents the percentage of the free memory before activating swap. The lower the value, the less swapping is used and the more memory pages are kept in physical memory where:
<translate>{{ic|swappiness}} controls how likely a page is to be transferred to swap.  This value represents the percentage of the free memory before activating swap. The lower the value, the less swapping is used and the more memory pages are kept in physical memory where:</translate>
* 0 disables swap
* <translate>0 disables swap</translate>
* 60 is the default value which is ideal for a server running a lot of services
* <translate>60 is the default value which is ideal for a server running a lot of services</translate>
* 100 is very aggressive swapping.
* <translate>100 is very aggressive swapping.</translate>


For ''most'' desktops/laptops the recommended value is 10: Theoretically, this means to only start swapping when RAM usage reaches around 90 percent.
<translate>For ''most'' desktops/laptops the recommended value is 10: Theoretically, this means to only start swapping when RAM usage reaches around 90 percent.</translate>


{{ic|vfs_cache_pressure}} is a percentage value that controls the tendency of the kernel to *reclaim* the memory which is used for caching of directory and inode objects.  The default value is 100.  Increasing this value will increase the rate in which these objects are removed from the RAM cache.  Decreasing it will allow these objects to be cached in memory longer, consuming additional RAM over time.  Depending on your specific workload, increasing or decreasing this value too far can have significant negative impacts on system performance.  Experimentation is needed to find the appropriate balance and the default value is reasonable.  In general, it is more common to optimize swappiness before experimenting with vfs_cache_pressure.
<translate>{{ic|vfs_cache_pressure}} is a percentage value that controls the tendency of the kernel to *reclaim* the memory which is used for caching of directory and inode objects.  The default value is 100.</translate> <translate>Increasing this value will increase the rate in which these objects are removed from the RAM cache.  Decreasing it will allow these objects to be cached in memory longer, consuming additional RAM over time.</translate> <translate>Depending on your specific workload, increasing or decreasing this value too far can have significant negative impacts on system performance.</translate> <translate>Experimentation is needed to find the appropriate balance and the default value is reasonable.  In general, it is more common to optimize swappiness before experimenting with vfs_cache_pressure.</translate>


To set these values you can use the command {{ic|sysctl}}.  For example, to set the swappiness value to 10 you could use:
<translate>To set these values you can use the command {{ic|sysctl}}.  For example, to set the swappiness value to 10 you could use:</translate>
  sudo sysctl vm.swappiness=10
  sudo sysctl vm.swappiness=10




'''There is no preset defined answer on the optimal values for these parameters.'''  Experimentation is needed to find the optimum configuration for your specific hardware and workload.
'''<translate>There is no preset defined answer on the optimal values for these parameters.</translate>'''  <translate>Experimentation is needed to find the optimum configuration for your specific hardware and workload.</translate>




<translate>
=See Also=
=See Also=
* The Arch Wiki page on [https://wiki.archlinux.org/index.php/Swap swap]
</translate>
* The Arch Wiki page on [https://wiki.archlinux.org/index.php/Zswap zswap]
* <translate>The Arch Wiki page on [<tvar|link>https://wiki.archlinux.org/index.php/Swap</> swap]</translate>
* The Linux kernel documentation on [https://www.kernel.org/doc/Documentation/vm/zswap.txt zswap]
* <translate>The Arch Wiki page on [<tvar|link>https://wiki.archlinux.org/index.php/Zswap</> zswap]</translate>
* The Linux kernel documentation on [https://www.kernel.org/doc/Documentation/sysctl/vm.txt swappiness and vfs_cache_pressure]
* <translate>The Linux kernel documentation on [<tvar|link>https://www.kernel.org/doc/Documentation/vm/zswap.txt</> zswap]</translate>
* The opensuse guide to [https://doc.opensuse.org/documentation/leap/tuning/html/book.sle.tuning/cha.tuning.memory.html tuning memory]
* <translate>The Linux kernel documentation on [<tvar|link>https://www.kernel.org/doc/Documentation/sysctl/vm.txt</> swappiness and vfs_cache_pressure]</translate>
* The [https://github.com/Nefelim4ag/systemd-swap systemd-swap page]
* <translate>The opensuse guide to [<tvar|link>https://doc.opensuse.org/documentation/leap/tuning/html/book.sle.tuning/cha.tuning.memory.html</> tuning memory]</translate>
* The ZFS on Linux guide on [https://github.com/zfsonlinux/pkg-zfs/wiki/HOWTO-use-a-zvol-as-a-swap-device Swap Volumes]
* <translate>The [<tvar|link>https://github.com/Nefelim4ag/systemd-swap</> systemd-swap page]</translate>
* <translate>The ZFS on Linux guide on [<tvar|link>https://github.com/zfsonlinux/pkg-zfs/wiki/HOWTO-use-a-zvol-as-a-swap-device</> Swap Volumes]</translate>




[[Category:Contents Page]]
[[Category:Contents Page]]

Revision as of 11:11, 31 March 2021

Other languages:
Deutsch • ‎English • ‎français • ‎русский

Overview

Swap space is used to extend the amount of memory(RAM) available for running programs.

  • Without swap space, if you run out of memory, applications will be terminated up to and including the entire system crashing.
  • With swap space available to the system, the kernel can take less frequently accessed memory pages from inactive applications / services and write them to disk ("swapping" them), allowing more actual RAM to be available for active applications.


There are three different ways in which swap can be managed in Manjaro:

  • A swap partition
  • A swap file
  • zswap


This article tries to be as comprehensive as possible but even more information can be found in the articles linked below

Do I Need Swap

That is a question that cannot be answerd without having a look at your configuration and even with plenty of available memory, it is often used as a safety net or even sometimes due to specific application requirements so have a look at the following non-exhaustive list:

  • If you use hibernation: yes, you need swap!
  • If you have services that are not always active, but are still running all the time: yes, you need swap!
  • If you have an application that allocates virtual memory directly for temporary storage instead of RAM: yes, you need swap!
  • If you have an application that has a memory leak: yes, you need swap!
  • If you have a server with 1TB of RAM that you're using as a desktop without applications allocating virtual memory or having memory leaks: No, you don't need swap!

How Much Swap do I Need

The amount of swap you need is highly variable based on your specific applications and workload. There is no universal formula on swap size without monitoring usage over a period of time. A reasonable place to start would be:

  • For less then 4GB of physical memory (RAM), it's highly recommended that the swap space should, as a base minimum, be equal to the amount of RAM. Also, it's recommended that the swap space is maximum twice the amount of RAM depending upon the amount of disk space available for the system because of diminishing returns.
  • For more modern systems (>4GB), your swap space should be at a minimum be equal to your physical memory (RAM) size if you use hibernation, otherwise you need a minimum of ROUNDUP(SQRT(RAM)) I.E. the square root of your RAM size rounded up to the next GB. The maximum, is again twice the amount of RAM, again because of diminishing returns.
  • The only downside to having more swap space than you will actually use, is the disk space you will be reserving for it cannot be used for application or system data.

The "diminishing returns" means that if you need more swap space than twice your RAM size, you would be better off adding more RAM as Hard Disk Drive (HDD) access is about 10³ slower then RAM access, so something that would take 1 second, suddenly takes more then 15 minutes! And on a Solid State Drive (SSD) the same operation that took 1 second in RAM will still take about 1 minute on that SSD!

Taking into accound all of the above, this brings us to the following table: (last 3 columns denote swap space)

       RAM   No hibernation    With Hibernation  Maximum
       1GB              1GB                 2GB      2GB
       2GB              2GB                 3GB      4GB
       3GB              3GB                 5GB      6GB
       4GB              4GB                 6GB      8GB
       RAM   No hibernation    With Hibernation  Maximum
       5GB              2GB                 7GB     10GB
       6GB              2GB                 8GB     12GB
       8GB              3GB                11GB     16GB
      12GB              3GB                15GB     24GB
      16GB              4GB                20GB     32GB
      24GB              5GB                29GB     48GB
      32GB              6GB                38GB     64GB
      64GB              8GB                72GB    128GB
     128GB             11GB               139GB    256GB
     256GB             16GB               272GB    512GB
     512GB             23GB               535GB      1TB
       1TB             32GB              1056GB      2TB
       2TB             46GB              2094GB      4TB
       4TB             64GB              4160GB      8TB
       8TB             91GB              8283GB     16TB
Note
The largest server one of the authors of this wiki has ever installed had, indeed, 8TB of RAM

Displaying Swap Information

The command swapon will display your current swap information. For example:

swapon
NAME      TYPE      SIZE   USED PRIO
/dev/sda7 partition  20G  44.3M   -2

The following script will:

  • show whether zswap is active or not and if active, give zswap parameters if run with the `sudo` command
  • display a list of all applications / services that take up swap and how much they take up in descending order
#!/bin/bash
#Check whether running as root
if [ "$(whoami)" = 'root' ]; then
  dmesg | grep "zswap:" | grep --silent "load"
  if $? -eq 0 ; then
    # zswap is active
    echo "zswap information:"
    grep --recursive --color=none . /sys/kernel/debug/zswap/
    read -n 1 -s -r -p "Press any key to continue"
  else
    echo "[warning] zwap not active. Continuing"
  fi
else
  echo "[warning] Not running as root: skipping zswap info"
fi
for szFile in /proc/*/status ; do
  awk '/VmSwap|Name/{printf $2 "\t" $3}END{ print "" }' "$szFile"
done | sort --key 2 --numeric --reverse | more

Using a Swap Partition

A swap partition is the traditional way of managing swap. In this scenario, a dedicated partition (or partitions) are created for holding swap.

Creating and Enabling a Swap Partition

To create a swap partition, you need enough unallocated disk space to create an additional partition. If you do not have enough space, skip to the next section #Using_a_swap_file. A swap partition can be created in any disk management / partition management tool and should be set as type `linuxswap`.

Once you have a swap partition you will need to initialize the swap partition with mkswap. For example, if your swap partition is /dev/sda3, you could use the command:

sudo mkswap /dev/sda3

Next we need to enable the swap partition with the swapon command. Following our example above this could be done with:

sudo swapon /dev/sda3

In order to ensure that the swap is enabled at boot we can add an entry to /etc/fstab. It is best to use the UUID instead of the device name for this purpose. You can add the line to fstab manually or using the command:

sudo bash -c "echo UUID=$(lsblk -no UUID /dev/sda3) none swap defaults 0 0 >> /etc/fstab"

If you would like to have more than one swap partition, simply repeat the steps above for any additional partitions.


Note
Be sure to replace /dev/sda3 in the above commands with your actual swap partition.


Tip
If you're using a HDD (spinning rust) put the swap partition *at the beginning of the disk* as the speed of the disk is higher on the inside tracks. On an SSD this doesn't matter.

Using a Swapfile

Using a swap partition has one major disadvantage: Changing the size of swap or adding swap requires repartitioning the disk. In current Linux kernels, it is possible to use a swap file instead of a dedicated partition and as from kernel 2.6 onwards there is no performance difference any more between the two.

Creating and Enabling a Static Swapfile

Tip
There is no reason you can't have both a swap partition and a swapfile. This is an easy way to add more swap without repartitioning


First create and intialize the file to hold the swap. For example, to create a 4GB swapfile, you could use the command:

sudo fallocate -l 4G /swapfile
sudo mkswap /swapfile


Set the appropriate permissions on the file. It should be readable and writable only by root. This can be done with the command:

sudo chmod u=rw,go= /swapfile


Next we need to enable the swapfile with the swapon command. Following our example above this could be done with:

sudo swapon /swapfile


In order to ensure that the swap is enabled at boot we can add an entry to /etc/fstab. You can add the line to ftab manually or using the command:

sudo bash -c "echo /swapfile none swap defaults 0 0 >> /etc/fstab"

Swapfiles on BTRFS

As of kernel 5.0 and higher, swapfiles are supported on btfrs. They still require some special handling in addition to the above steps.

Prior to running the fallocate step above, you should run these commands:

sudo truncate -s 0 /swapfile
sudo chattr +C /swapfile
sudo btrfs property set /swapfile compression none


These commands create an empty swapfile, disable COW for that file and ensure that compression is disabled.

Swapfiles on ZFS

zfs doesn't support swapfiles, however you can achieve a similar benefit using a zvol as a swap volume.


Detailed instructions on how to accomplish this can be found in this ZoL guide.

Automated Swap Management with systemd-swap

Note
Using systemd-swap with on btrfs/zfs or with hibernation support requires special handling beyond the scope of this article

It is possible to automatically manage the size of your swapfile using systemd-swap. It can create swap files dynamically based on memory needs. It is also an easy way to enable/manage zswap

Installing and Configuring systemd-swap

First, install and enable systemd-swap

pamac install systemd-swap
sudo systemctl enable systemd-swap.service


Next enable dynamic swap management by creating a file /etc/systemd/swap.conf.d/myswap.conf with the following parameters:

zswap_enabled=0
zram_enabled=0
swapfc_enabled=1


If you would prefer a single command to create this file you could use:

sudo bash -c 'echo -e "zswap_enabled=0\nzram_enabled=0\nswapfc_enabled=1" > /etc/systemd/swap.conf.d/myswap.conf'

Remove Other Swap

In order for systemd_swap to be effective you need to remove any traditional swap devices you have.


To display your current swap devices you can use the command swapon. For example, my test machine displays the following:

swapon
NAME      TYPE      SIZE USED PRIO
/swapfile file        4G   0B   -2
/dev/sda3 partition 8.4G   0B   -3


In this example there are two swap devices. A swapfile and a swap partition. To turn them off we can use the command swapoff.

sudo swapoff /swapfile
sudo swapoff /dev/sda3


Next we need to remove them. The swap partition will need to be deleted using your favorite partitioning tool. You can remove the swapfile by simply deleting it.

sudo rm /swapfile


We need to also remove any lines related to swap from /etc/fstab. Edit the file with an appropriate text editor and remove or comment out the lines for the swap space. In the example above, we would remove these lines:

UUID=c2430cf1-8ea9-4422-a5c5-5a38779194c3 swap           swap    defaults,noatime 0 2
/swapfile none swap defaults 0 0


Next reboot. After the reboot you should see something similiar to the following when running swapon

NAME                           TYPE SIZE USED PRIO
/var/lib/systemd-swap/swapfc/1 file 512M   0B   -2


systemd-swap will add and remove swapfiles as your memory usage dictates.


Note
If you don't delete your existing swap partition it will be automatically activated by systemd even though you have removed it from fstab

Using zswap with systemd-swap

zswap is compressed swap kept in RAM. zswap keeps the most frequently used pages in RAM and writes less frequently used pages to the swap space on disk. In many workloads, this will result in increased swap performance and less wear and tear on SSDs.

To enable zswap with systemd-swap, simply alter the instructions above and set zswap_enabled to 1

Tuning & Performance Considerations

Although swap seems like a great way to expand memory, excessive swap use will cause severe performance degradation, as mentioned before.

There are couple of parameters that can be used to tune swap utilization. These are swappiness and vfs_cache_pressure. To see your current settings for these you can use the following commands:

cat /proc/sys/vm/swappiness
cat /proc/sys/vm/vfs_cache_pressure

swappiness controls how likely a page is to be transferred to swap. This value represents the percentage of the free memory before activating swap. The lower the value, the less swapping is used and the more memory pages are kept in physical memory where:

  • 0 disables swap
  • 60 is the default value which is ideal for a server running a lot of services
  • 100 is very aggressive swapping.

For most desktops/laptops the recommended value is 10: Theoretically, this means to only start swapping when RAM usage reaches around 90 percent.

vfs_cache_pressure is a percentage value that controls the tendency of the kernel to *reclaim* the memory which is used for caching of directory and inode objects. The default value is 100. Increasing this value will increase the rate in which these objects are removed from the RAM cache. Decreasing it will allow these objects to be cached in memory longer, consuming additional RAM over time. Depending on your specific workload, increasing or decreasing this value too far can have significant negative impacts on system performance. Experimentation is needed to find the appropriate balance and the default value is reasonable. In general, it is more common to optimize swappiness before experimenting with vfs_cache_pressure.

To set these values you can use the command sysctl. For example, to set the swappiness value to 10 you could use:

sudo sysctl vm.swappiness=10


There is no preset defined answer on the optimal values for these parameters. Experimentation is needed to find the optimum configuration for your specific hardware and workload.


See Also

Cookies help us deliver our services. By using our services, you agree to our use of cookies.