Difference between revisions of "Swap"

4,822 bytes added ,  3 years ago
Professionalised the entire document
imported>DeMus
(Professionalised the entire document)
Line 1: Line 1:
__TOC__
__TOC__


=Overview=
=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 fail or be terminated.  With available swap space, Linux can take less frequently accessed memory pages and write them to disk, allowing more space for running applications.
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 two different ways in which swap can be managed in Manjaro
There are three different ways in which swap can be managed in Manjaro:
* A swap partition
* A swap partition
* A swap file
* A swap file
* zswap




This article is not a comprehensive guide to swap.  It is intended to serve as a basic primer.  More detailed information can be found in the [[#See_Also|articles linked below]]
This article tries to be as comprehensive as possible but even more information can be found in the [[#See_Also|articles linked below]]


=Do I Need Swap=
=Do I Need Swap=


In most circumstances swap is not absolutely required unless you are running out of memory(RAM).  However, even with plenty of available memory, it is often used as a safety net or due to specific application requirements.
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=
=How Much Swap do I Need=


The amount of swap you need is highly variable based on the specific applications and workload.  There is no way to provide a universal on swap size recommendation without monitoring usage over a period of time.  A reasonable place to start would be the smaller of your total system memory(RAM) or 8GiB.
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 ROUND(SQRT(RAM)) and a maximum of twice the amount of RAM (this maximum 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 data.


The "diminishing returns" means that if you need more swap space than twice your RAM size, you'd better add 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 an SSD!


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


If you plan to enable hibernation it is recommended to have at least as much swap as you have RAM.
        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 this author has ever installed had, indeed, 8TB of RAM}}


=Displaying Swap Information=
=Displaying Swap Information=
Line 33: Line 64:
The command {{ic|swapon}} will display your current swap information.  For example:
The command {{ic|swapon}} will display your current swap information.  For example:
  swapon
  swapon
  NAME      TYPE      SIZE USED PRIO
  NAME      TYPE      SIZE   USED PRIO
  /dev/sda3 partition 8.4G  0B   -2
  /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=
=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.
 


==Creating and Enabling a Swap Partition==
==Creating and Enabling a Swap Partition==


To create a swap partition, you first need an available partition. This can be created in any disk management tool and should be set as type Linux Swap.
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 {{ic|mkswap}}.  For example, if your swap partition is {{ic|/dev/sda3}}, you could use the command:
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:
  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:
Next we need to enable the swap partition with the {{ic|swapon}} command.  Following our example above this could be done with:
  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:
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:
  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"


If you would like to have more than one swap partition, simply repeat the steps above for any additional partitions.
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.}}
{{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 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.
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.  




Line 94: Line 141:
==Swapfiles on BTRFS==
==Swapfiles on BTRFS==


As of kernel 5.0, 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.




Line 179: Line 226:
==Using zswap with systemd-swap==
==Using zswap with systemd-swap==


zswap is compressed swap kept in memory(RAM). It 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.
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}}
Line 186: Line 232:
=Tuning & Performance Considerations=
=Tuning & Performance Considerations=


Although swap seems like a great way to expand memory, excessive swap use will cause severe performance degradation.
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:
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:
Line 193: Line 238:
  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:
* 0 disables swap
* 60 is the default value which is ideal for a server running a lot of services 
* 100 is very aggressive swapping. 


{{ic|swappiness}} controls how likely a page is to be transferred to swap.  The valid range is 0-200 and higher numbers indicate more frequent swaps.
For ''most'' desktops/laptops the recommended value is 10: Theoretically, this means to only start swapping when RAM usage reaches around 90 percent.
 
 
{{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.


{{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.


To set these values you can use the command {{ic|sysctl}}.  For example, to set the swappiness value to 20 you could use:
To set these values you can use the command {{ic|sysctl}}.  For example, to set the swappiness value to 10 you could use:
  sudo sysctl vm.swappiness=20
  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 hardware and workload.
'''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.




Moderators, translator
286

edits