Manjaro Difference between revisions of "Swap/ru"

Difference between revisions of "Swap/ru"

From Manjaro
(Created page with "При наличии в системе пространства подкачки ядро может забирать у неактивных приложений/служб...")
Tags: Mobile web edit Mobile edit
(Updating to match new version of source page)
 
(118 intermediate revisions by 2 users not shown)
Line 10: Line 10:




There are three different ways in which swap can be managed in Manjaro:
В Manjaro существует три различных способа управления свопом:
* A swap partition
* Раздел подкачки
* A swap file
* Файл подкачки
* zswap
* zswap




This article tries to be as comprehensive as possible but even more information can be found in the [[Special:MyLanguage/#See_Also|articles linked below]]
Эта статья старается быть максимально полной, но еще больше информации можно найти в [[Swap#See_Also|articles linked below]].
=Do I Need Swap=
=Нужна ли мне подкачка=


That is a question that cannot be answered 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!''
* Если у вас есть сервер с 1 ТБ оперативной памяти, который вы используете в качестве рабочего стола без приложений, выделяющих виртуальную память или имеющих утечки памяти: ''нет - Вам не нужна подкачка!''.
=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.
* При объеме физической памяти (RAM) менее 4 ГБ настоятельно рекомендуется чтобы пространство подкачки, как минимум, было равно объему RAM. Также рекомендуется, чтобы пространство подкачки было максимум в два раза больше объема оперативной памяти, в зависимости от объема дискового пространства, доступного для системы, из-за уменьшающейся отдачи.
* For more modern systems (>4GB), your swap space should be at a minimum be ROUNDUP(SQRT(RAM)) I.E. the square root of your RAM size rounded up to the next GB'''However, if you use hibernation''', you need a minimum of physical memory (RAM) size '''plus''' ROUNDUP(SQRT(RAM)). The maximum, is again twice the amount of RAM, again because of diminishing returns.
* Для более современных систем (>4 ГБ) пространство подкачки должно быть как минимум равно ROUNDUP(SQRT(RAM)). Т.е. квадратный корень из объема вашей оперативной памяти, округленный до следующего ГБОднако, если вы используете спящий режим, вам нужен минимум размер физической памяти (RAM) ''плюс'' ROUNDUP(SQRT(RAM)). Максимум, опять же, вдвое больше объема ОЗУ, опять же из-за убывающей отдачи.
* 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!
"Уменьшающаяся отдача" означает, что если Вам нужно под подкачку больше места чем в два раза по отношению к оперативной памяти, то лучше добавить больше оперативной памяти, так как доступ к жесткому диску (HDD) примерно на 10³ медленнее, чем к оперативной памяти, поэтому то, что заняло бы 1 секунду, может занять более 15 минут! А на твердотельном накопителе (SSD) та же операция, которая заняла бы 1 секунду в оперативной памяти, займет около 1 минуты!


Taking into account all of the above, this brings us to the following table:
Принимая во внимание все вышеперечисленное - мы получаем следующую таблицу:
(last 3 columns denote swap space)
(последние 3 столбца обозначают пространство подкачки)


         RAM  No hibernation    With Hibernation  Maximum
         RAM  Без гибернации      С гибернацией Максимум
         1GB              1GB                2GB      2GB
         1GB              1GB                2GB      2GB
         2GB              2GB                3GB      4GB
         2GB              2GB                3GB      4GB
Line 43: Line 43:
         4GB              4GB                6GB      8GB
         4GB              4GB                6GB      8GB


         RAM  No hibernation    With Hibernation  Maximum
         RAM  Без гибернации      С гибернацией Максимум
         5GB              2GB                7GB    10GB
         5GB              2GB                7GB    10GB
         6GB              2GB                8GB    12GB
         6GB              2GB                8GB    12GB
Line 59: Line 59:
         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 article has ever installed had, indeed, 8TB of RAM and even that machine has the above swap settings, so why not your machine?}}
{{note|Самый большой сервер, который когда-либо устанавливал один из авторов этой вики-статьи, действительно имел 8 ТБ оперативной памяти и даже эта машина имеет указанные выше настройки подкачки, так почему бы и вашей машине не быть такой?}}
=Displaying Swap Information=
=Отображение информации о подкачке=


The command {{ic|swapon}} will display your current swap information. For example:
Команда {{ic|swapon}} отобразит текущую информацию о подкачке. Например:
  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:
Следующий сценарий будет:
* show whether zswap is active or not and if active, give zswap parameters if run with the  {{ic|sudo}} command
* показать, активен zswap или нет, и если активен, указать параметры zswap при запуске с помощью команды {{ic|sudo}}.
* display a list of all applications / services that take up swap and how much they take up in descending order
* отобразить список всех приложений / служб, занимающих подкачку, и их объем в порядке убывания


  #!/bin/bash
  #!/bin/bash
Line 75: Line 75:
  if [ "$(whoami)" = 'root' ]; then
  if [ "$(whoami)" = 'root' ]; then
   dmesg | grep "zswap:" | grep --silent "load"
   dmesg | grep "zswap:" | grep --silent "load"
   if [[ $? -eq 0 ]]; then
   if [ $? -eq 0 ]; then
     # zswap is active
     # zswap is active
     echo "zswap information:"
     echo "zswap information:"
Line 81: Line 81:
     read -n 1 -s -r -p "Press any key to continue"
     read -n 1 -s -r -p "Press any key to continue"
   else
   else
     echo "[warning] zwap not active. Continuing"
     echo "[warning] zswap not active. Continuing"
   fi
   fi
  else
  else
Line 89: Line 89:
   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
=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 [[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 {{ic|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:
Чтобы создать раздел подкачки - необходимо достаточно нераспределенного дискового пространства для создания дополнительного раздела. Если у вас недостаточно места - перейдите к следующему разделу [[#Using_a_Swapfile|Использование_файла_подкачки]]. Раздел подкачки может быть создан в любом инструменте управления дисками / разделами и должен быть установлен как тип {{ic|linuxswap}}.
 
После создания раздела подкачки Вам нужно инициализировать раздел подкачки с помощью команды {{ic|mkswap}}. Например, если ваш раздел подкачки {{ic|/dev/sda3}} - Вы можете использовать команду:
  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:
Далее необходимо включить раздел подкачки с помощью команды {{ic|swapon}}. Следуя нашему примеру выше это можно сделать следующим образом:
  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:
Чтобы гарантировать, что подкачка будет включена при загрузке, мы должны добавить запись в {{ic|/etc/fstab}}. Для этого лучше всего использовать UUID вместо имени устройства. Вы должны добавить строку в fstab вручную или с помощью команды:
  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.
Если Вы хотите иметь более одного раздела подкачки - просто повторите описанные выше шаги для всех дополнительных разделов.
 
{{note|Обязательно замените /dev/sda3 в приведенных выше командах на ваш реальный раздел подкачки.}}
{{tip|''Если вы используете HDD'' (вращающийся диск) - поместите раздел подкачки '''в начало диска''', поскольку скорость диска выше на внешних дорожках. На SSD это не имеет значения.}}


{{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 disadvantageChanging 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.
Использование раздела подкачки имеет один существенный недостатокИзменение размера swap или добавление swap требует переразметки диска. В текущих ядрах Linux можно использовать файл подкачки вместо выделенного раздела и начиная с ядра 2.6 разница в производительности между ними больше не ощущается.


==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.}}
{{tip|Нет причин, по которым вы не можете иметь как раздел подкачки, так и файл подкачки. Это простой способ добавить дополнительный раздел подкачки без переразметки.}}




First create and intialize the file to hold the swap. For example, to create a 4GB swapfile, you could use the command:
Сначала создайте и инциализируйте файл для подкачки. Например, чтобы создать файл подкачки размером 4 ГБ необходимо использовать команду:


  sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress
  sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress




Set the appropriate permissions on the file. It should be readable and writable only by {{ic|root}}. This can be done with the command:
Установите соответствующие разрешения на файл. Он должен быть доступен для чтения и записи только {{ic|root}}. Это можно сделать с помощью команды:


  sudo chmod 600 /swapfile
  sudo chmod 600 /swapfile




Next we need to format and enable the swapfile:
Далее нам нужно отформатировать и включить файл подкачки:


  sudo mkswap /swapfile
  sudo mkswap /swapfile
Line 134: Line 136:




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 fstab manually or using the command:
Чтобы гарантировать, что подкачка будет включена при загрузке - мы должны добавить запись в {{ic|/etc/fstab}}. Вам нужно добавить строку в fstab вручную или с помощью команды:


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




==Swapfiles on BTRFS==
==Файл подкачки на 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.
Начиная с ядра 5.0 и выше, файлы подкачки поддерживаются на btfrs.  Они все еще требуют некоторых специальных действий в дополнение к описанным выше.


Prior to running the {{ic|fallocate}} step above, you should run these commands:
Перед выполнением шага {{ic|dd}}, описанного выше, Вы должны выполнить эти команды:
  sudo truncate -s 0 /swapfile
  sudo truncate -s 0 /swapfile
  sudo chattr +C /swapfile
  sudo chattr +C /swapfile
Line 149: Line 151:




These commands create an empty swapfile, disable COW for that file and ensure that compression is disabled.
Эти команды создают пустой файл подкачки, отключают COW для этого файла и обеспечивают отключение сжатия.


{{tip|To stay compatible with Timeshift, it is necessary to create the swapfile outside the root subvolume "@".
{{tip|Чтобы сохранить совместимость с Timeshift, необходимо создать файл подкачки вне корневого подтома "@".
{{RootCmd|command=btrfs subvolume create /@swapfile}}
{{RootCmd|command=btrfs subvolume create /@swapfile}}
Just replace /swapfile with /@swapfile/swapfile.}}
Просто замените /swapfile на /@swapfile/swapfile.}}
 
 
==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 [https://github.com/zfsonlinux/pkg-zfs/wiki/HOWTO-use-a-zvol-as-a-swap-device 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 {{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]]
 
==Installing and Configuring systemd-swap==
 
First, install and enable {{ic|systemd-swap}}:
pamac install systemd-swap
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:
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 {{ic|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 {{ic|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 {{ic|/etc/fstab}}.  Edit the file with an [[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:
UUID=c2430cf1-8ea9-4422-a5c5-5a38779194c3 swap          swap    defaults,noatime 0 2
/swapfile none swap defaults 0 0
 
 
With hibernation configured it will also be necessary to edit {{ic|/etc/default/grub}}. Find and remove option {{ic|<nowiki>resume=UUID=...</nowiki>}} or replace the UUID with a new proper value.  In the example above, we would remove this text:
resume=UUID=c2430cf1-8ea9-4422-a5c5-5a38779194c3
Then run:
sudo update-grub
If removing hibernation entirely then also delete {{ic|resume}} from the {{ic|HOOKS}} line in {{ic|/etc/mkinitpcio.conf}} and run:
sudo mkinitpcio -P
 
 
Next reboot.  After the reboot, when running {{ic|swapon}} you should see something similiar to the following:
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}}


==Файл подкачки на ZFS==


==Using zswap with systemd-swap==
zfs не поддерживает файлы подкачки, однако вы можете добиться аналогичного преимущества, используя zvol в качестве тома подкачки.


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 Linux Kernel parameter  zswap_enabled=1
Подробные инструкции о том, как это сделать, можно найти в этом [https://github.com/zfsonlinux/pkg-zfs/wiki/HOWTO-use-a-zvol-as-a-swap-device руководстве по ZoL].
=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:
Существует несколько параметров, которые можно использовать для настройки использования подкачки. Это swappiness и vfs_cache_pressure. Чтобы узнать текущие настройки этих параметров необходимо воспользоваться следующими командами:
  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:
{{ic|swappiness}} контролирует, насколько вероятно что страница будет передана в своп. Это значение представляет собой процент свободной памяти перед активацией подкачки. Чем меньше значение - тем меньше используется подкачка и тем больше страниц памяти хранится в физической памяти:
* 0 disables swap
* 0 отключает подкачку
* 60 is the default value which is ideal for a server that is memory-starved and running a lot of services
* 60 - это значение по умолчанию, идеально подходящее для сервера, испытывающего недостаток памяти и запускающего много служб.
* 100 is very aggressive swapping.
* 100 - это очень агрессивная подкачка.


For ''most'' desktop computers the recommended value is 10: Theoretically, this means to only start swapping when RAM usage reaches around 90 percent.
Для ''большинства'' настольных компьютеров рекомендуемое значение составляет 10: Теоретически это означает, что подкачка начинается только тогда, когда использование оперативной памяти достигает примерно 90 процентов.


{{ic|vfs_cache_pressure}} used to be a percentage value that controls the tendency of the kernel to ''reclaim'' the memory which is used for caching of directory and inode objects with a default value of 100 on Kernels <5.4. On Kernels >=5.4 can be increased beyond 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 timeDepending on your specific workload, increasing or decreasing this value too far can have significant negative impacts on system performanceExperimentation 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}} раньше было процентным значением, которое контролирует тенденцию ядра к ''возврату'' памяти, используемой для кэширования объектов каталогов и инодов, со значением по умолчанию 100 на ядрах <5.4. На ядрах >=5.4 значение может быть увеличено до 100.  Увеличение этого значения увеличит скорость удаления этих объектов из кэша оперативной памяти. Уменьшение этого значения позволит этим объектам дольше кэшироваться в памяти, потребляя со временем дополнительную оперативную памятьВ зависимости от конкретной рабочей нагрузки - слишком сильное увеличение или уменьшение этого значения может оказать значительное негативное влияние на производительность системыЧтобы найти подходящий баланс необходимо поэкспериментировать, а значение по умолчанию является разумным. В целом, чаще всего оптимизируют swappiness, прежде чем экспериментировать с vfs_cache_pressure.


To set these values you can use the command {{ic|sysctl}}. For example, to set the swappiness value to 10 you could use:
Для установки этих значений вы можете использовать команду {{ic|sysctl}}. Например, чтобы установить значение swappiness равным 10, вы должны использовать:
  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.
'''Не существует заранее определенного ответа на вопрос об оптимальных значениях этих параметров.'''  Необходимо поэкспериментировать чтобы найти оптимальную конфигурацию для вашего конкретного оборудования и рабочей нагрузки.




=See Also=
=Смотрите также=
* The Arch Wiki page on [https://wiki.archlinux.org/index.php/Swap swap]
* Страница на Arch Wiki про [https://wiki.archlinux.org/index.php/Swap swap]
* The Arch Wiki page on [https://wiki.archlinux.org/index.php/Zswap zswap]
* Страница на Arch Wiki про [https://wiki.archlinux.org/index.php/Zswap zswap].
* The Linux kernel documentation on [https://www.kernel.org/doc/Documentation/vm/zswap.txt zswap]
* Документация ядра Linux про [https://www.kernel.org/doc/Documentation/vm/zswap.txt zswap]
* The Linux kernel documentation on [https://www.kernel.org/doc/Documentation/sysctl/vm.txt swappiness and vfs_cache_pressure]
* Доументация ядра Linux про [https://www.kernel.org/doc/Documentation/sysctl/vm.txt swappiness и vfs_cache_pressure]
* The openSUSE guide to [https://doc.opensuse.org/documentation/leap/tuning/html/book.sle.tuning/cha.tuning.memory.html tuning memory]
* Руководство по ZFS в Linux по [https://github.com/zfsonlinux/pkg-zfs/wiki/HOWTO-use-a-zvol-as-a-swap-device разделам Swap]
* The [https://github.com/Nefelim4ag/systemd-swap systemd-swap page]
* The ZFS on Linux guide on [https://github.com/zfsonlinux/pkg-zfs/wiki/HOWTO-use-a-zvol-as-a-swap-device Swap Volumes]




[[Category:Contents Page{{#translation:}}]]
[[Category:Contents Page{{#translation:}}]]

Latest revision as of 04:38, 31 July 2023

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


Обзор

Пространство подкачки используется для расширения объема памяти (RAM), доступной для запуска программ.

  • Без пространства подкачки, если у вас закончится память, приложения "завершатся", вплоть до краха всей системы.
  • При наличии в системе пространства подкачки ядро может забирать у неактивных приложений/служб реже используемые страницы памяти и записывать их на диск ("своппинг"), позволяя активным приложениям получить больше реальной оперативной памяти.


В Manjaro существует три различных способа управления свопом:

  • Раздел подкачки
  • Файл подкачки
  • zswap


Эта статья старается быть максимально полной, но еще больше информации можно найти в articles linked below.

Нужна ли мне подкачка

На этот вопрос нельзя ответить, не изучив вашу конфигурацию, и даже при большом количестве доступной памяти она часто используется для подстраховки или даже иногда из-за специфических требований приложения, поэтому ознакомьтесь со следующим неполным списком:

  • Если Вы используете гибернацию: да - Вам нужна подкачка!
  • Если у Вас есть службы, которые не всегда активны, но все равно постоянно работают: да - Вам нужна подкачка!
  • Если у Вас есть приложение, которое выделяет виртуальную память непосредственно для временного хранения вместо оперативной памяти: да - Вам нужна подкачка!.
  • Если у Вас есть приложение, у которого есть утечка памяти: да - Вам нужна подкачка!
  • Если у вас есть сервер с 1 ТБ оперативной памяти, который вы используете в качестве рабочего стола без приложений, выделяющих виртуальную память или имеющих утечки памяти: нет - Вам не нужна подкачка!.

Сколько подкачки мне нужно

Необходимый объем подкачки сильно зависит от специфики приложений и рабочей нагрузки. Без мониторинга использования в течение определенного периода времени не существует универсальной формулы для определения объема подкачки. Разумно было бы начать с этого:

  • При объеме физической памяти (RAM) менее 4 ГБ настоятельно рекомендуется чтобы пространство подкачки, как минимум, было равно объему RAM. Также рекомендуется, чтобы пространство подкачки было максимум в два раза больше объема оперативной памяти, в зависимости от объема дискового пространства, доступного для системы, из-за уменьшающейся отдачи.
  • Для более современных систем (>4 ГБ) пространство подкачки должно быть как минимум равно ROUNDUP(SQRT(RAM)). Т.е. квадратный корень из объема вашей оперативной памяти, округленный до следующего ГБ. Однако, если вы используете спящий режим, вам нужен минимум размер физической памяти (RAM) плюс ROUNDUP(SQRT(RAM)). Максимум, опять же, вдвое больше объема ОЗУ, опять же из-за убывающей отдачи.
  • Единственным недостатком наличия большего пространства подкачки, чем вы будете реально использовать, является то, что дисковое пространство, которое вы резервируете под него, не может быть использовано для приложений или системных данных.

"Уменьшающаяся отдача" означает, что если Вам нужно под подкачку больше места чем в два раза по отношению к оперативной памяти, то лучше добавить больше оперативной памяти, так как доступ к жесткому диску (HDD) примерно на 10³ медленнее, чем к оперативной памяти, поэтому то, что заняло бы 1 секунду, может занять более 15 минут! А на твердотельном накопителе (SSD) та же операция, которая заняла бы 1 секунду в оперативной памяти, займет около 1 минуты!

Принимая во внимание все вышеперечисленное - мы получаем следующую таблицу: (последние 3 столбца обозначают пространство подкачки)

       RAM   Без гибернации       С гибернацией Максимум
       1GB              1GB                 2GB      2GB
       2GB              2GB                 3GB      4GB
       3GB              3GB                 5GB      6GB
       4GB              4GB                 6GB      8GB
       RAM   Без гибернации       С гибернацией Максимум
       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
Самый большой сервер, который когда-либо устанавливал один из авторов этой вики-статьи, действительно имел 8 ТБ оперативной памяти и даже эта машина имеет указанные выше настройки подкачки, так почему бы и вашей машине не быть такой?

Отображение информации о подкачке

Команда swapon отобразит текущую информацию о подкачке. Например:

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

Следующий сценарий будет:

  • показать, активен zswap или нет, и если активен, указать параметры zswap при запуске с помощью команды sudo.
  • отобразить список всех приложений / служб, занимающих подкачку, и их объем в порядке убывания
#!/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] zswap 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

Использование раздела подкачки

Раздел подкачки - это традиционный способ управления подкачкой. В этом сценарии для подкачки создается выделенный раздел (или разделы).

Создание и включение раздела подкачки

Чтобы создать раздел подкачки - необходимо достаточно нераспределенного дискового пространства для создания дополнительного раздела. Если у вас недостаточно места - перейдите к следующему разделу Использование_файла_подкачки. Раздел подкачки может быть создан в любом инструменте управления дисками / разделами и должен быть установлен как тип linuxswap.

После создания раздела подкачки Вам нужно инициализировать раздел подкачки с помощью команды mkswap. Например, если ваш раздел подкачки /dev/sda3 - Вы можете использовать команду:

sudo mkswap /dev/sda3

Далее необходимо включить раздел подкачки с помощью команды swapon. Следуя нашему примеру выше это можно сделать следующим образом:

sudo swapon /dev/sda3

Чтобы гарантировать, что подкачка будет включена при загрузке, мы должны добавить запись в /etc/fstab. Для этого лучше всего использовать UUID вместо имени устройства. Вы должны добавить строку в fstab вручную или с помощью команды:

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

Если Вы хотите иметь более одного раздела подкачки - просто повторите описанные выше шаги для всех дополнительных разделов.


Note
Обязательно замените /dev/sda3 в приведенных выше командах на ваш реальный раздел подкачки.


Tip
Если вы используете HDD (вращающийся диск) - поместите раздел подкачки в начало диска, поскольку скорость диска выше на внешних дорожках. На SSD это не имеет значения.

Использование файла подкачки

Использование раздела подкачки имеет один существенный недостаток: Изменение размера swap или добавление swap требует переразметки диска. В текущих ядрах Linux можно использовать файл подкачки вместо выделенного раздела и начиная с ядра 2.6 разница в производительности между ними больше не ощущается.

Создание и включение статического файла подкачки

Tip
Нет причин, по которым вы не можете иметь как раздел подкачки, так и файл подкачки. Это простой способ добавить дополнительный раздел подкачки без переразметки.


Сначала создайте и инциализируйте файл для подкачки. Например, чтобы создать файл подкачки размером 4 ГБ необходимо использовать команду:

sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress


Установите соответствующие разрешения на файл. Он должен быть доступен для чтения и записи только root. Это можно сделать с помощью команды:

sudo chmod 600 /swapfile


Далее нам нужно отформатировать и включить файл подкачки:

sudo mkswap /swapfile
sudo swapon /swapfile


Чтобы гарантировать, что подкачка будет включена при загрузке - мы должны добавить запись в /etc/fstab. Вам нужно добавить строку в fstab вручную или с помощью команды:

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


Файл подкачки на BTRFS

Начиная с ядра 5.0 и выше, файлы подкачки поддерживаются на btfrs. Они все еще требуют некоторых специальных действий в дополнение к описанным выше.

Перед выполнением шага dd, описанного выше, Вы должны выполнить эти команды:

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


Эти команды создают пустой файл подкачки, отключают COW для этого файла и обеспечивают отключение сжатия.



Tip
Чтобы сохранить совместимость с Timeshift, необходимо создать файл подкачки вне корневого подтома "@".
root # btrfs subvolume create /@swapfile COPY TO CLIPBOARD

Просто замените /swapfile на /@swapfile/swapfile.


Файл подкачки на ZFS

zfs не поддерживает файлы подкачки, однако вы можете добиться аналогичного преимущества, используя zvol в качестве тома подкачки.


Подробные инструкции о том, как это сделать, можно найти в этом руководстве по ZoL.

Настройка и соображения по производительности

Хотя подкачка кажется отличным способом расширения памяти - чрезмерное её использование приведет к серьезному снижению производительности как уже говорилось ранее.

Существует несколько параметров, которые можно использовать для настройки использования подкачки. Это swappiness и vfs_cache_pressure. Чтобы узнать текущие настройки этих параметров необходимо воспользоваться следующими командами:

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

swappiness контролирует, насколько вероятно что страница будет передана в своп. Это значение представляет собой процент свободной памяти перед активацией подкачки. Чем меньше значение - тем меньше используется подкачка и тем больше страниц памяти хранится в физической памяти:

  • 0 отключает подкачку
  • 60 - это значение по умолчанию, идеально подходящее для сервера, испытывающего недостаток памяти и запускающего много служб.
  • 100 - это очень агрессивная подкачка.

Для большинства настольных компьютеров рекомендуемое значение составляет 10: Теоретически это означает, что подкачка начинается только тогда, когда использование оперативной памяти достигает примерно 90 процентов.

vfs_cache_pressure раньше было процентным значением, которое контролирует тенденцию ядра к возврату памяти, используемой для кэширования объектов каталогов и инодов, со значением по умолчанию 100 на ядрах <5.4. На ядрах >=5.4 значение может быть увеличено до 100. Увеличение этого значения увеличит скорость удаления этих объектов из кэша оперативной памяти. Уменьшение этого значения позволит этим объектам дольше кэшироваться в памяти, потребляя со временем дополнительную оперативную память. В зависимости от конкретной рабочей нагрузки - слишком сильное увеличение или уменьшение этого значения может оказать значительное негативное влияние на производительность системы. Чтобы найти подходящий баланс необходимо поэкспериментировать, а значение по умолчанию является разумным. В целом, чаще всего оптимизируют swappiness, прежде чем экспериментировать с vfs_cache_pressure.

Для установки этих значений вы можете использовать команду sysctl. Например, чтобы установить значение swappiness равным 10, вы должны использовать:

sudo sysctl vm.swappiness=10


Не существует заранее определенного ответа на вопрос об оптимальных значениях этих параметров. Необходимо поэкспериментировать чтобы найти оптимальную конфигурацию для вашего конкретного оборудования и рабочей нагрузки.


Смотрите также

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