Contents
- Introduction
- What is swap?
- Why do I need swap?
- How much swap do I need?
- How do I add more swap?
- How do I add or modify a swap partition?
- How do I add a swap file?
- What is swappiness and how do I change it?
- What is the priority of swap containers?
- Should I reinstall with more swap?
- Why is my swap not being used?
- Empty Swap
Introduction
-
This FAQ is aimed at Linux novices.
- People always wonder how much swap they should create at install time, or after installing they may think, «have I made a large enough swap? Should I reinstall with a larger swap?»
- This FAQ will tell you how much swap you need and how to add more swap after installation.
- You will be given very simple answers (to prevent losing too much time reading this FAQ) and some explanations that may help you form your own opinion.
What is swap?
Swap space is the area on a hard disk. It is a part of your machine’s Virtual Memory, which is a combination of accessible physical memory (RAM) and the swap space. Swap holds memory pages that are temporarily inactive. Swap space is used when your operating system decides that it needs physical memory for active processes and the amount of available (unused) physical memory is insufficient. When this happens, inactive pages from the physical memory are then moved into the swap space, freeing up that physical memory for other uses. Note that the access time for swap is slower, depending on the speed of the hard drive. Do not consider it to be a complete replacement for the physical memory. Swap space can be a dedicated swap partition (recommended), a swap file, or a combination of swap partitions and swap file(s).
Why do I need swap?
Memory consuming programs Sometimes, a large program (like LibreOffice, Neverwinter Nights, or a video editor) make the entire system need extra memory. A significant number of the pages used by these large programs during its startup may only be used for initialization and then never used again. The system can swap out those pages and free the memory for other programs or even for the disk cache. In these cases, swap will be used to help the system handle any extra load.
Hibernation (suspend-to-disk) The hibernation feature (suspend-to-disk) writes out the contents of RAM to the swap partition before turning off the machine. Therefore, your swap partition should be at least as big as your RAM size. Although the latest versions of Ubuntu don’t support hibernation OOTB you may configure your system to allow Hibernation. In both alternatives (PM-UTILS or SYSTEMD) you may use a partition or a file.
Unforeseeable Circumstances Unforeseeable events can and will happen (a program going crazy, some action needing much more space than you thought, or any other unpredictable combination of events). In these cases, swap can give you an extra delay to figure out what happened, or to finish what you are working on.
Optimizing memory usage Since mechanical hard drives are considerably slower than RAM (SSD — Solid State Drive — storage is not as slow as physical drives, but still slower than RAM), when you need a file (be it a data file like a video, executables like Firefox, or libraries), the Linux kernel reads the file into RAM and keeps it there, so that the next time you need it, it is already in RAM and data access is much faster. The portions of RAM that accelerate disk read are called «cached memory.» You will notice that they make a huge difference in terms of responsiveness. The Linux kernel automatically moves RAM reserved by programs—but not really used—into swap, so that it can serve the better purpose of extending cached memory.
Optimizing Swap performance Because swap space uses a disk device, this can cause performance issues in any system that uses swap space significantly because the system itself may also be using the same disk device at the same time that it is required for swap operations. One way to reduce this problem is to have swap space on a different physical drive so that the competition for that resource is either reduced or eliminated.
How much swap do I need?
For less than 1GB 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 hard disk space available for the system because of diminishing returns.
For more modern systems (>1GB), 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. The only downside to having more swap space than you will actually use, is the disk space you will be reserving for it.
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 still more than a minute on a fast Solid State Drive (SSD)…
Example Scenarios
(last 3 columns denote swap space)
RAM No hibernation With Hibernation Maximum 256MB 256MB 512MB 512MB 512MB 512MB 1024MB 1024MB 1024MB 1024MB 2048MB 2048MB RAM No hibernation With Hibernation Maximum 1GB 1GB 2GB 2GB 2GB 1GB 3GB 4GB 3GB 2GB 5GB 6GB 4GB 2GB 6GB 8GB 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
How do I add more swap?
Swap is generally associated with a swap partition, perhaps because the user is prompted to create a swap partition at the time of installation. In fact, any file can be used as a swapping device, be it a partition or a conventional file. Swap can be added by increasing the size of the swap partition or by adding a swap file. Keep in mind that when creating a swap file that it may not necessarily be using contiguous disk blocks (as a swap partition will), and this could have a negative impact on performance as disk access times may be longer, and the more your system uses swap, the worse it will be. The Linux kernel also accesses swap disk block IO directly bypassing all caching, metadata and filesystem code, so a swap file should have no ill effect on the stability of your base filesystem. Since kernel 2.6.29 the swap system has automatically supported TRIM capable devices like SSDs.
The advantages of a swap file are many, but it is problematic for using the default swsusp hibernation method for powerless sleep. The best solution for maintaining hibernate capability after adding RAM is to increase the size of the swap partition.
How do I add or modify a swap partition?
Process to Increase Size of Swap Partition and use it for Hibernation
- Creating the swap partition
- Activating the swap partition
- Making the new swap partition work for hibernate (optional)
Creating the swap partition
- Boot to Ubuntu install CD and choose the option to run Ubuntu now
-
Go to system -> GParted Partition Editor
- Delete the swap partition and, if there is nothing else in it, the extended partition that holds it. (If by some miracle you’re able to resize your swap partition from here, I imagine your life will be a lot easier than mine.)
- Decrease the size of your primary partition by the amount you want your new swap to be (I made mine 2x RAM + 500MB just to be safe). The easiest way to do this is to fill in the amount of space you want swap to be in the «free space following» field
- In the free space that has now been created, choose new, type linux-swap and you can name the partition «swap» if you like
- Hit the *Apply* button (should be a check mark) to write the changes to disk
- When done, reboot back into Ubuntu
Activating the swap partition
(If your swap is on your primary hard drive, you don’t need to do anything here.) Now you need to find what partition your swap is on and what its UUID is. UUID?! you say? Well that’s the Universally Unique IDentifier for the partition so you can reference it even if it’s on a different mount point from boot-to-boot due to adding disks, etc.
-
Pull up a terminal and run gksu gparted & and enter your root password. The & lets this process run while still giving you access to the command line.
- Right-click on your swap partition and choose *Information*. You should see the **Path** and **UUID** listed there. Keep this open for further reference.
-
Run gksu gedit /etc/fstab & and look for the line that has *swap* in it. It should be the third column, separated by spaces or tabs. You can either use the path or the UUID to tell Linux where to find your swap partition. I recommend UUID because it’ll stay constant even if you move the partition around or the disk somehow becomes sdb instead of sda or something like that. Make the appropriate edits and save the file. Your line should look something like this if you used UUID (with your UUID instead, of course):
-
UUID=41e86209-3802-424b-9a9d-d7683142dab7 none swap sw 0 0
-
or this if you used path: /dev/sda2 none swap sw 0 0
-
- Save the file.
-
Enable the new swap partition with this command.
sudo swapon --all
OR
$ sudo swapon --all --verbose swapon on /dev/sda2 swapon: /dev/sda2: found swap signature: version 1, page-size 4, same byte order swapon: /dev/sda2: pagesize=4096, swapsize=2147483648, devsize=2147483648
-
Confirm that the swap partition exists.
$ cat /proc/swaps Filename Type Size Used Priority /dev/sda2 partition 2097148 0 -1
- Reboot to make sure the new swap gets activated properly at startup
Making the swap partition work for hibernate (optional)
‘INFO: This will not work for 12.04, resume from hibernate work differently in 12.04.‘
-
Pull up a Terminal again and run cat /proc/swaps and hopefully you see the path to your swap partition listed there. If not chances are something went wrong in the steps above. Here’s my output:
Filename Type Size Used Priority /dev/sda2 partition 2676732 73380 -1
-
gksu gedit /etc/default/grub & to pull up the boot loader configuration
-
Look for the line GRUB_CMDLINE_LINUX=»» and make sure it looks like this (using your UUID of course) GRUB_CMDLINE_LINUX=»resume=UUID=41e86209-3802-424b-9a9d-d7683142dab7″ and save the file
-
sudo update-grub and wait for it to finish
-
gksu gedit /etc/initramfs-tools/conf.d/resume & and make sure its contents are resume=UUID=41e86209-3802-424b-9a9d-d7683142dab7 (with your UUID of course in place of mine). Save the file!
-
sudo update-initramfs -u
- Reboot!
Now you should be able to hibernate and resume!
How do I add a swap file?
Note: btrfs does not support swap files at the moment. See man swapon. and btrfs Faq
Create the Swap File:
We will create a 1 GiB file (/mnt/1GiB.swap) to use as swap:
sudo dd if=/dev/zero of=/mnt/1GiB.swap bs=1024 count=1048576
We need to set the swap file permissions to 600 to prevent other users from being able to read potentially sensitive information from the swap file.
sudo chmod 600 /mnt/1GiB.swap
Format the file as swap:
sudo mkswap /mnt/1GiB.swap
Enable use of Swap File
sudo swapon /mnt/1GiB.swap
The additional swap is now available and verified with: cat /proc/swaps
Enable Swap File at Bootup
Add the swap file details to /etc/fstab so it will be available at bootup:
echo '/mnt/1GiB.swap swap swap defaults 0 0' | sudo tee -a /etc/fstab
Example of making a swap file
This is an example of making and using a swap file on a computer with no swap partition.
$ sudo fallocate -l 1g /mnt/1GiB.swap $ sudo chmod 600 /mnt/1GiB.swap $ sudo mkswap /mnt/1GiB.swap Setting up swapspace version 1, size = 1048576 kB $ sudo swapon /mnt/1GiB.swap $ cat /proc/swaps Filename Type Size Used Priority /home/swapfile file 1048576 1048576 -1 $ echo '/mnt/4GiB.swap swap swap defaults 0 0' | sudo tee -a /etc/fstab $ reboot $ free -h total used free shared buff/cache available Mem: 15G 9.3G 454M 4.0G 5.8G 1.9G Swap: 1.0G 1.0G 0B
Disable and Remove a Swap File
Disable the swap file from the running system and the delete it:
sudo swapoff /mnt/1Gib.swap sudo rm /mnt/1Gib.swap
Remove the swap file details from fstab:
gksudo gedit /etc/fstab
Removing the swap file line
/mnt/1GiB.swap swap swap defaults 0 0
What is swappiness and how do I change it?
The swappiness parameter controls the tendency of the kernel to move processes out of physical memory and onto the swap disk. Because disks are much slower than RAM, this can lead to slower response times for system and applications if processes are too aggressively moved out of memory.
- swappiness can have a value of between 0 and 100
- swappiness=0 tells the kernel to avoid swapping processes out of physical memory for as long as possible
- swappiness=100 tells the kernel to aggressively swap processes out of physical memory and move them to swap cache
The default setting in Ubuntu is swappiness=60. Reducing the default value of swappiness will probably improve overall performance for a typical Ubuntu desktop installation. A value of swappiness=10 is recommended, but feel free to experiment. Note: Ubuntu server installations have different performance requirements to desktop systems, and the default value of 60 is likely more suitable.
To check the swappiness value
cat /proc/sys/vm/swappiness
To change the swappiness value A temporary change (lost on reboot) with a swappiness value of 10 can be made with
sudo sysctl vm.swappiness=10
To make a change permanent, edit the configuration file with your favorite editor:
gksudo gedit /etc/sysctl.conf
Search for vm.swappiness and change its value as desired. If vm.swappiness does not exist, add it to the end of the file like so:
vm.swappiness=10
Save the file and reboot.
What is the priority of swap containers?
The Linux kernel assigns priorities to all swap containers. To see the priorities that the Linux Kernel assigns to all the swap containers use this command.
cat /proc/swaps
Priorities can be changed by using the swapon command or defined in /etc/fstab. Consult the manual page of swapon for more info
man swapon
Should I reinstall with more swap?
Definitely not. With the 2.6 kernel, «a swap file is just as fast as a swap partition.» (Wikipedia:Paging, LKML).
Why is my swap not being used?
My swap is not being used! When I issue the free command, it shows something like this:
tom@tom:~$ free total used free shared buffers cached Mem: 515980 448664 67316 0 17872 246348 -/+ buffers/cache: 184444 331536 Swap: 674688 0 674688
Note: This regards mainly swap on hard disk partitions, but it could help anyway. In these examples /dev/hda8 is considered as swap.
Swap may not be needed
Start many memory consuming applications (e.g. Gimp, web browsers, LibreOffice etc) and then issue the free command again. Is swap being used now?
Ubuntu Desktop uses Swap to Hibernate (PC off, no power needed, program states saved). If Hibernation is important to you, have more swap space than ram + swap overflow.
Is there a swap partition at all?
Use this command to see all partitions
sudo parted --list
You should be able to see something like this in the output
5 236GB 256GB 20.0GB linux-swap(v1)
If not, you either need to create a swapfile or create a swap partition. To create a swap partition you can
- boot from your Ubuntu install CD, create a swap partition out of the free space on your hard disk and then interrupt your installation.
-
use Cfdisk.
Enabling a swap partition
In case you do have a swap partition, there are several ways of enabling it.
- Use the following command
cat /etc/fstab
- Ensure that there is a line link below. This enables swap on boot.
/dev/sdb5 none swap sw 0 0
- Then disable all swap, recreate it, then re-enable it with the following commands.
sudo swapoff -a sudo /sbin/mkswap /dev/sdb5 sudo swapon -a
Empty Swap
Even if you have lots of RAM and even if you have a low swappiness value, it is possible that your computer swaps. This can hurt the multitasking performance of your desktop system.
You can use the following script to get the swap manually back into RAM:
- Place the script e.g. /usr/local/sbin:
gksudo gedit /usr/local/sbin/swap2ram.sh
- Copy-paste the script into the file:
-
#!/bin/sh mem=$(LC_ALL=C free | awk '/Mem:/ {print $4}') swap=$(LC_ALL=C free | awk '/Swap:/ {print $3}') if [ $mem -lt $swap ]; then echo "ERROR: not enough RAM to write swap back, nothing done" >&2 exit 1 fi swapoff -a && swapon -a
- Save and close gedit
- Make the script executable:
sudo chmod +x /usr/local/sbin/swap2ram.sh
- Execute:
sudo /usr/local/sbin/swap2ram.sh
CategoryFaq
Сегодня мы будем говорить о файле подкачки в Linux. Расскажем для чего он нужен, как создать, изменить размер или удалить. В общем, все, что вам может понадобиться при работе со swap.
В операционной системе Linux, как и в других ОС, файл подкачки нужен для страховки оперативной памяти. Когда установленный объем ОЗУ заканчивается, используется именно выделенная область из файла подкачки. Это может понадобиться в двух случаях:
- Для того чтобы при полной занятости и, как следствие, отсутствия свободной оперативной памяти, компьютер не тормозил.
- Для распределения приоритетов (важным процессам отдается физическая оперативная память, а второстепенным файл подкачки Linux).
Сам по себе swap — это отдельный логический раздел вашего диска либо просто файл на системном разделе. Чаще всего он создается именно при установке операционной системы. Но создать swap linux можно и после завершения инсталляции ОС.
В последних версиях операционной системы Ubuntu Linux файл подкачки создается автоматически вне зависимости от того, хотите вы этого или нет. При этом его размер составляет около 1 Гб.
Как посмотреть swap в Linux
Прежде чем приступить к процессу добавления, настройки или удаление файла подкачки, необходимо проверить его наличие. Для этого проще всего использовать приведенную ниже команду. В нашем случае она выглядит так:
free -h
Используемая команда отображает размер файла подкачки вашей операционной системы. Однако, по ее результатам мы не можем определить – это файл подкачки или раздел подкачки. Поэтому будем использовать дополнительный другую команду, чтобы посмотреть swap linux. Вводим в терминал следующее:
swapon --show
Как видите, в нашем случае под swap выделено 1.4 Гб и это файл. То есть, он находится не на отдельном разделе, а на том же диске, на котором установлена операционная система.
Если это будет отдельный логический том, то под надписью «TYPE» мы увидим слово «partition».
Если бы файл подкачки в вашей операционной системе отсутствовал, результат работы команды free —h выглядел бы примерно так:
То есть, вместо каких-либо данных о файле подкачки вы увидите нули.
Если вы удостоверились в том, что файл подкачки отсутствует, можно переходить к его созданию. Пример, приведенный ниже, будет показан с использованием операционной системы Ubuntu 18.04, но работать это должно и на других дистрибутивах Linux.
Шаг 1: Создаем swap файл
Давайте создадим файл подкачки для нашей Ubuntu. Для примера его размер составит 1 Гб. Запустите терминал и введите команду, приведенную ниже:
sudo fallocate -l 1G /swapfile
Для обеспечения безопасности файла обязательно устанавливаем на него нужные права.
sudo chmod 600 /swapfile
При этом вместо «swapfile» мы можем указать любое другое название.
Шаг 2: Создание файловой системы
Создание swap linux ещё не завершено. Теперь необходимо указать нашей операционной системе, что созданный объект должен использоваться как файл подкачки. Для этого мы будем использовать команду, приведенную ниже:
sudo mkswap /swapfile
Если все сделано верно, результат будет выглядеть так:
Шаг 3: Активируем файл подкачки
Хорошо, теперь наш Linux понимает, что это файл подкачки, но этого недостаточно. Нам также необходимо включить SWAP:
sudo swapon /swapfile
Давайте проверим, все ли мы сделали правильно:
swapon --show
Отлично, операционная система распознала наш файл подкачки и начала его использовать. Мы видим тип в поле TYPE и размер в поле SIZE.
Шаг 4. Сохранение изменений после перезагрузки
Все операции, которые мы предприняли выше, временны. Как только компьютер будет перезагружен, они отменятся. Для того чтобы сделать изменения постоянными, нам необходимо дописать кое-какую информацию в /etc/fstab. Для этого поступаем так:
Прежде чем начать работать с файлом, о котором мы говорим, необходимо обязательно создать его резервную копию:
sudo cp /etc/fstab /etc/fstab.back
После этого можно переходить непосредственно к добавлению нужных нам данных. Нам надо добавить в файл такую строчку:
/swapfile none swap sw 0 0
Это реализуется через текстовый редактор, запущенный с правами суперпользователя, либо при помощи введенной в терминал команды:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Готово. Изменения сохранены и файл подкачки не сбросится после перезагрузки операционной системы.
Настройка swappiness
Дальше будет рассмотрена настройка swap linux. У файла подкачки существуют параметры, которые сообщают ОС, как часто его нужно использовать. Это явление называется «свопингом» и может иметь значение в пределах 0 — 100. Если это значение ближе к 100, ядро будет перемещать в раздел подкачки больше информации чтобы освободить память. При значениях ближе к нулю, система будет использовать подкачку только при крайней необходимости.
К примеру, в версии Ubuntu Linux для рабочего стола устанавливается параметр 60, а в серверных редакциях операционной системы — 1. Для того чтобы проверить, какой параметр используется в нашей ОС, вводим в терминал такую команду:
cat /proc/sys/vm/swappiness
Как видите, в нашем случае «свопинг» установлен как 60. Если же вы хотите поменять swappiness, можете воспользоваться оператором, цифра в конце которого и будет новым значением:
sudo sysctl vm.swappiness=25
Как и в случае с конфигурацией файла подкачки, данный параметр изначально будет временным и обнулится при следующей перезагрузке. Для того чтобы сделать его постоянным, в самом конце файла /etc/sysctl.conf записываем значение vm.swappiness=25.
vi /etc/sysctl.conf
vm.swappiness=25
Для этого можно воспользоваться, например, текстовым редактором, запущенным с администраторскими полномочиями.
Размер swap файла в Linux
Существует сразу несколько вариантов, позволяющих увеличить файл подкачки linux или уменьшить его. Однако, прежде чем их рассмотреть, необходимо напомнить об одном очень важном моменте:
Когда вы полностью отключаете файл подкачки, ваша операционная система использует только ОЗУ и в случае ее нехватки это может привести к полной остановке работы компьютера. Система просто зависнет.
Для того чтобы этого не произошло, в тот момент, когда мы удаляем или изменяем основной файл подкачки, необходимо создать второй, временный swap. Если вы это сделали или уверены в том, что имеющейся оперативной памяти хватит, можно переходить непосредственно к процессу изменения размера файла подкачки. Для этого давайте сначала отключим его:
sudo swapoff /swapfile
Вторым этапом меняем размер файла подкачки, воспользовавшись командой, приведенной ниже. При этом размер вашего swap файла нужно указать вместо параметра 2G (2 гигабайта):
sudo fallocate -l 2G /swapfile
Теперь форматируем полученный файл в файловую систему swap:
sudo mkswap /swapfile
А затем включаем его обратно:
sudo swapon /swapfile
При этом операционная система Linux позволяет использовать сразу несколько swap.
Как удалить файл подкачки в Linux
Если по каким-то причинам файл подкачки вам не нужен, можете удалить его. Для этого сначала надо отключить swap linux:
sudo swapoff /swapfile
А потом удаляем:
sudo rm /swapfile
Не забудьте установить права на вновь созданный файл подкачки так, как мы описывали это выше.
В заключение
Надеемся теперь концепция файла подкачки в Linux ясна вам на 100%. Можете переходить к практике и проверять наличие swap на вашем компьютере или ноутбуке, его настройке, созданию или даже удалению. Если в результате у вас останутся какие-то вопросы, предложения или замечания, можете задать их нам, воспользовавшись формой комментирования ниже.
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .
Оперативной памяти много не бывает. Виртуальная память предназначена для рационального распределения оперативной памяти между пользовательскими и системными процессами. Проще говоря, чтобы не расходовать оперативную память на хранение статичной информации, выделяют некоторую область жесткого диска для ее размещения.
Общая информация
В системе Линукс для размещения виртуальной памяти можно выделить отдельный раздел жесткого диска или использовать обычный файл. Линукс позволяет комбинировать эти два способа. По умолчанию в Unix системах применяется SWAP раздел. Производительность отдельного SWAP раздела жесткого диска выше, чем производительность виртуальной памяти размещенной в файле. Единственным минусом SWAP раздела является сложность его редактирования.
Если Вы до эксплуатации сервера знаете какой емкости нужна SWAP область, то обязательно используйте отдельный раздел жесткого диска. Если нагрузка на SWAP область пока неизвестна, то лучше разместить виртуальную память в файле, после чего определив потребности системы, создать раздел нужного размера.
Система Linux позволяет одновременно использовать несколько SWAP разделов и SWAP файлов. Это позволяет более гибко подойти к вопросу расширения виртуальной памяти в случае нехватке размера SWAP области на сервере. Чаще всего, на работающем сервере с существующим SWAP разделом выясняется, что текущего размера виртуальной памяти уже не хватает. Целесообразнее добавить тестовый файл подкачки для определения нагрузки на SWAP область, а уже после увеличить размер раздела.
Создание, редактирование и удаление любых разделов из под загруженной в данный момент операционной системы не безопасно, поэтому создание SWAP раздела, вместо SWAP файла, делается только с использованием LiveCD. Статья на тему безопасного редактирования разделов будет написана в будущее время.
В системе Windows виртуальная память размещена только в отдельном файле — pagefile.sys (для Windows 2000 и выше) и win386.swp (для Windows 9x).
Для любой операционной системы, если используется спящий режим (Hebernation), размер виртуальной памяти следует делать не меньше объема оперативной памяти. В общих случаях наиболее эффективно использовать размер виртуальной памяти кратный 4 (1024 Мб, 2048 Мб и т.д.), так как ядро системы производит обмен страницами с памятью по 4 Кб в каждой. Размер виртуальной памяти легче посчитать от объема оперативной памяти *2, *3. Область подкачки стоит размещать на самом быстром жестком диске ближе к началу.
Хочу обратить Ваше внимани, что приведенные ниже инструкции касается только изменения размера ФАЙЛА ВИРТУАЛЬНОЙ ПАМЯТИ, а не изменение размера отдельной директории SWAP.
Ниже приведены пошаговые инструкции, которые позволят создать, изменить и удалить файл SWAP.
Создание SWAP файла
- Создаем файл необходимого размера для swap области, где /home/swap-tmp — это имя и путь файла, а count=1024K его размерв, в данном случае — 1024 Мб):
sudo dd if=/dev/zero of=/home/swap-tmp bs=1024 count=1024K
На экране получим:
[user@localhost user]#sudo dd if=/dev/zero of=/home/swap-tmp bs=1024 count=1024K
1048576+0 записей считано
1048576+0 записей написано
скопировано 1073741824 байта (1,1 GB), 137,509 c, 7,8 MB/c - Далее производим запись в начало файла системную информацию, которая будет используется ядром системы для работы с файлом подкачки:
sudo mkswap /home/swap-tmp
После окончания операции на экране появится:
[user@localhost user]# sudo mkswap /home/swap-tmp
Устанавливается пространство для свопинга версии 1, размер = 1073737 кБ
без метки, UUID=54c60583-e61a-483a-a15c-2f1be966db85 - Следующим шагом активируем только что созданный SWAP файл:
sudo swapon /home/swap-tmp
Для просмотра результата просматриваем все объекты, которые используются для размещения виртуальной памяти:
cat /proc/swaps
- После перезагрузки системы SWAP файл необходимо активировать снова или добавить строчка для автоматической загрузки в файл fstab.
Редактировать файл fstab можно самостоятельно или командой, которая добавляет в конец файла fstab строку /home/swap-tmp swap swap defaults 0 0:
echo «/home/swap-tmp swap swap defaults 0 0» | sudo tee -a /etc/fstab
Тоже самое действие но добовление через UUID, который присваивается в пункте 2:
echo «UUID=54c60583-e61a-483a-a15c-2f1be966db85 swap swap defaults 0 0» | sudo tee -a /etc/fstab
Удаление SWAP файла
- Просматриваем все объекты, которые используются для размещения виртуальной памяти
cat /proc/swaps
Выбираем ненужный.
- Деактивируем, для примера, созданный выше SWAP файл:
sudo swapoff /home/swap-tmp
- Удаляем SWAP файл:
sudo rm /home/swap-tmp
Если Вы раньше добавляли строчку в fstab, для автоматической загрузки SWAP файла при старте операционной системы, то следует ее удалить. Выводим файл /etc/fstab для редактирования на экран:
sudo gedit /etc/fstab
В нем удаляем строчку монтирования SWAP файла.
Редактирование размера SWAP файла
Действия по редактирование объема SWAP файла сводятся к удалению уже созданного файла SWAP и созданию нового файла требуемого размера. То есть нужно сначало сделать пункт 3, а после пункт 2.
Комментарии (12)
Состояние перевода: На этой странице представлен перевод статьи Swap. Дата последней синхронизации: 15 июня 2018. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.
Эта страница дает ознакомление с пространством подкачки и подкачкой страниц в GNU/Linux. Охватывает создание, активацию файлов и разделов подкачки.
Взято из All about Linux swap space[устаревшая ссылка 2020-08-06 ⓘ]:
- Linux делит свою физическую RAM (оперативную память) на кусочки памяти, называемые страницами. Подкачка (swapping) это процесс, когда страницы памяти копируются на предварительно сконфигурированное пространство на жестком диске, называемое пространством подкачки, чтобы освободить эту страницу из памяти. Суммарный размер оперативной памяти и пространства подкачки это количество доступной виртуальной памяти.
Поддержка подкачки обеспечивается ядром Linux и утилитами в пользовательском пространстве из util-linux пакета.
Пространство подкачки
Пространство подкачки может быть разделом диска или файлом. Пользователи могут создать пространство подкачки во время установки или позднее в любое желаемое время. Пространство подкачки может быть использовано для двух целей, расширить виртуальную память за пределы установленной оперативной памяти (RAM), а также для сохранения данных при гибернации (suspend-to-disk).
Иногда стоит включать Swap в зависимости от установленной оперативной памяти и количества требований для запуска желаемых программ. Если количество оперативной памяти меньше требуемого, тогда стоит включить подкачку. Это позволяет избежать состояния нехватки памяти (OOM), при котором механизм ядра Linux, OOM Killer, будет автоматически пытаться освободить память, убивая процессы. Чтобы увеличить количество виртуальной памяти до требуемого уровня, добавьте необходимую разницу как пространство подкачки. Например, если программа требует 7,5 GB памяти для запуска, а у вас установлено 4 GB оперативной памяти, добавьте разницу 3,5 GB как подкачку. В будущем добавляйте больше пространства к подкачке, учитывая требования.
Это вопрос личных предпочтений если вы считаете, что программы должны быть убиты, вместо включения подкачки. Самый большой недостаток в подкачке это снижение производительности, см. раздел #Производительность
Для проверки статуса подкачки, используйте:
$ swapon --show
Или
$ free -h
free также покажет недостаток памяти, который может быть исправлен включением или увеличением подкачки.
Примечание: Преимущества в производительности между файлом и разделом подкачки нет, оба варианта обрабатываются одинаково.
Раздел подкачки
Раздел подкачки может быть создан различными GNU/Linux утилитами разметки. Разделы подкачки обычно обозначаются как тип 82
. Хотя есть возможность использовать разные типы как подкачку, рекомендуется использовать тип 82
, в большинстве случаев systemd, будет автоматически определять его и монтировать (см. ниже)
Для установки раздела как область Linux подкачки, можно использовать mkswap
. Например:
# mkswap /dev/sdxy
Важно: Все данные на указанном разделе будут утеряны.
Для подключения устройства как подкачку:
# swapon /dev/sdxy
Чтобы подключить этот раздел подкачки при загрузке, добавьте запись в fstab:
UUID=<UUID> none swap defaults 0 0
где <UUID> может быть получен из команды:
lsblk -no UUID /dev/sdxy
Совет: Предпочтительно использовать UUID и LABEL, чем имена устройств полученные от ядра (/dev/sd*), т.к. порядок устройств может измениться в будущем. Смотри fstab.
Примечание:
- Эта fstab запись необязательна если раздел подкачки находится на устройстве, использующий GPT разметку, см. следующий подраздел.
- Если используется SSD с поддержкой TRIM, учтите использование
defaults,discard
в fstab строке подключения подкачки. Если вручную активировать подкачку с помощью swapon, используйте параметр-d
/--discard
, который делает тоже самое. Подробности смотри в swapon(8).
Важно: Включение discard в RAID установке с использованием mdadm, приведёт к блокировке системы при загрузке и во время выполнения, если использовать swapon.
Активация используя systemd
Активация разделов подкачки в systemd базируется на двух различных механизмах. Оба исполняются в
/usr/lib/systemd/system-generators
. Генераторы запускаются при старте системы и создают нативные systemd юниты для монтирования. Первый systemd-fstab-generator
, читает fstab, чтобы генерировать юниты, включая юнит для подкачки. Второй systemd-gpt-auto-generator
, осматривает корневой диск, чтобы генерировать юниты. Это операция проходит только на GPT дисках и может идентифицировать разделы подкачки по их тип коду 82
.
Отключение подкачки
Чтобы деактивировать определенное пространство подкачки:
# swapoff /dev/sdxy
Также можно использовать -a
ключ, чтобы деактивировать все пространства подкачки.
С тех пор, как systemd управляет подкачкой, она вновь будет активирована при старте системы, для долговременного отключения автоматической активации найденных пространств подкачки, выполните systemctl --type swap
, чтобы найти связанные со .swap юниты и замаскируйте (systemctl mask юнит) их.
Файл подкачки
Как альтернатива к созданию целого раздела, файл подкачки даёт возможность менять свой размер на лету, а также его гораздо легче полностью удалить. Это может быть особенно важно, если дисковое пространство ограничено (например, небольшие SSD)
Важно: Btrfs не поддерживает файлы подкачки. Несоблюдение этого предупреждения, может стать результатом разрушения файловой системы. Пока что, файл подкачки может быть использован в Btrfs, если смонтирован через loop-устройство, тогда будет сильно уменьшена производительность подкачки.
Вручную
Создание файла подкачки
Использовать под суперпользователем fallocate
, чтобы создать файл подкачки размером на свой выбор (M = Mebibytes, G = Gibibytes). Например создание 512 MiB файла подкачки:
# fallocate -l 512M /swapfile
Примечание: fallocate может вызвать проблемы с некоторыми файловыми системами, такими как: F2FS или XFS.[1]. Как вариант, используйте dd, наиболее надёжный, но медленный.
# dd if=/dev/zero of=/swapfile bs=1M count=512
Установите права доступа (всеми читаемый файл подкачки это огромная локальная уязвимость)
# chmod 600 /swapfile
После создания файла нужного размера, форматируйте его в подкачку:
# mkswap /swapfile
Активируйте файл подкачки:
# swapon /swapfile
В завершении, отредактируйте fstab, добавив запись для файла подкачки:
/etc/fstab
/swapfile none swap defaults 0 0
Примечание: Не забудьте добавить discard, если у вас SSD с поддержкой TRIM
# swapon --discard /swapfile
/etc/fstab
/swapfile none swap defaults,discard 0 0
Удаление файла подкачки
Чтобы удалить файл подкачки, сначала нужно отключить подкачку, а затем файл может быть удален:
# swapoff -a # rm -f /swapfile
В завершении, удалите соответствующую запись из /etc/fstab
.
Автоматически
systemd-swap
Установить systemd-swap пакет.
Установить swapfc_enabled=1
в Swap File Chunked разделе файла /etc/systemd/swap.conf
.
Start/enable systemd-swap
сервис.
Посетить страницу авторов на GitHub для получения подробностей и установить рекомендуемую конфигурацию.
Примечание: Если журнал продолжает показывать следующее предупреждение systemd-swap[..]: WARN: swapFC: ENOSPC
и файл подкачки не создаётся, вы должны установить параметр swapfc_force_preallocated=1
в /etc/systemd/swap.conf
.
Подкачка с USB устройства
Благодаря модульности, предлагаемой Linux, мы можем иметь множество разделов подкачки на различных устройствах. Если у вас полностью заполнен жесткий диск, то можно использовать USB устройство как временный раздел подкачки. Однако, этот метод имеет серьёзные недостатки:
- USB устройство медленнее чем жесткий диск
- Flash память имеет ограниченное количество циклов записи. Использование его как раздела подкачки, может быстро убить его.
Чтобы добавить USB устройство как подкачку, сначала необходимо разметить USB флешку для подкачки как описано в секции #Раздел подкачки.
Далее откройте /etc/fstab
и добавьте
pri=0
в опции монтирования первоначальной записи подкачки, таким образом USB подкачка будет иметь приоритет записи над старым разделом.
Данная инструкция будет работать и для других устройств хранения, таких как SD карты и т.д.
Шифрование подкачки
Смотри: dm-crypt/Swap encryption.
Производительность
Операции подкачки как правило существенно медленнее чем непосредственный доступ к RAM. Отключение подкачки полностью для повышения производительности, иногда может привести к ухудшению, поскольку это уменьшает доступную память для VFS кеша, вызывая более частые и дорогостоящие операции ввода/вывода.
Значения подкачки можно настроить, чтобы помочь производительности:
Swappiness
Swappiness sysctl параметр представляющий частоту использования пространства подкачки. Swappiness может иметь значение от 0 до 100, значение по умолчанию = 60. Низкое значение заставляет ядро избегать подкачки, высокое значение позволяет ядру использовать подкачку наперёд. Использование низкого значения на достаточном количестве памяти, улучшает отзывчивость на многих системах.
Чтобы проверить текущее значение swappiness:
$ cat /sys/fs/cgroup/memory/memory.swappiness
или
$ cat /proc/sys/vm/swappiness
Примечание: Т.к. /proc
менее организован и сохраняется только для обратной совместимости, вместо него предпочтительнее использовать /sys
.
Чтобы временно установить значение swappiness:
# sysctl vm.swappiness=10
Чтобы постоянно установить значение swappiness, отредактируйте (создайте) конфигурационный файл sysctl
/etc/sysctl.d/99-sysctl.conf
vm.swappiness=10
Чтобы проверить и больше узнать, почему оно так работает, посмотрите эту статью.
VFS cache pressure
Другой sysctl параметр, который действует на производительность подкачки это vm.vfs_cache_pressure
, он контролирует склонность ядра к применению памяти, которая используется для кэширования VFS caches, напротив кэширования страниц и подкачки. Увеличение этого значения увеличивает коэффициент с которым VFS caches применяется[2][устаревшая ссылка 2020-08-06 ⓘ]. Для подробной информации смотри документацию ядра Linux.
Приоритет
Если у вас больше одного файла или раздела подкачки, вы должны учитывать присвоение приоритетного значения (от 0 до 32767) для каждой области подкачки. Система будет использовать области подкачки с высоким приоритетом, перед использованием областей с низким приоритетом. Например, если у вас быстрый диск (/dev/sda
) и медленный (/dev/sdb
), назначьте высокий приоритет для подкачки расположенной на быстром устройстве. Приоритет может быть назначен в fstab как pri
параметр:
/dev/sda1 none swap defaults,pri=100 0 0 /dev/sdb2 none swap defaults,pri=10 0 0
Или как параметр в swapon --priority
# swapon --priority 100 /dev/sda1
Если две или более областей будут иметь одинаковый приоритет и он будет самым высоким из доступным приоритетов, то страницы будут распределяться по кругу между областями.
Использование zswap или zram
Zswap это особенность ядра Linux, обеспечивающая сжатие обратного кэша для страниц подкачки. Она увеличивает производительность и уменьшает операции ввода/вывода. ZRAM создаёт виртуальный сжатый файл подкачки в памяти, как альтернатива файлу подкачки на диске.
Чередование
Нет необходимости использовать RAID для повышения производительности подкачки. Ядро самостоятельно может чередовать подкачку на нескольких устройствах, если вы присвоите им одинаковый приоритет в /etc/fstab
.
Для подробной информации смотри The Software-RAID HOWTO.
Содержание
SWAP – один из механизмов виртуальной памяти, при котором отдельные фрагменты памяти (обычно неактивные) перемещаются из ОЗУ во вторичное хранилище (отдельный раздел или файл), освобождая ОЗУ для загрузки других активных фрагментов памяти.
Более подробно о механизме своппинга можно прочитать в Википедии.
Дополнительно SWAP используется при организации режима сна (hibernation или suspend to disk). При этом в SWAP сохраняется образ оперативной памяти.
Размещение
SWAP может быть размещен на разделе диска, в файле или в RAM. Исторически в Linux SWAP размещался на разделе, но в современных дистрибутивах производительность SWAP-файла не уступает SWAP-разделу. Однако стандартный установщик Ubuntu (до версии 17.04) не умеет создавать SWAP-файл при установке и выдает предупреждение, если SWAP-раздел не определен при разметке диска. Начиная с версии 17.04, Ubuntu предлагает по умолчанию создавать SWAP в файле (объем определяется как 5% от свободного на диске места, но не более 2 Гб). Использование SWAP-файла имеет некоторые преимущества: он не занимает отдельный раздел, его легко создать, изменить его размер или удалить.
Дополнительно при выборе размещения SWAP нужно учитывать, что не все файловые системы позволяют использовать прямую адресацию блоков SWAP-файла. Так, к примеру, нельзя использовать SWAP в файле на разделе с файловой системой btrfs(по состоянию на середину 2017).
Безопасность
При работе с секретными/зашифрованными данными часть этих данных в процессе работы либо при гибернации может оказаться в SWAP в расшифрованном виде. В таких случаях рекомендуется шифровать не только данные, но и сам SWAP. Однако нужно учитывать, что у режима сна при шифровании SWAP могут возникнуть сложности.
Размер
В Интернете можно найти множество рекомендаций по определению размера SWAP, однако универсального ответа не существует.
При определении размера SWAP следует учесть следующие аспекты:
-
Каков размер оперативной памяти?
-
Какие приложения будут использоваться?
-
Будет ли вестись работа с секретными данными?
-
Нужен ли режим сна (suspend to disk)?
В зависимости от ответов на эти вопросы рекомендации по размеру SWAP будут значительно различаться.
Для машин с незначительным объемом памяти (меньше 2 Гб) рекомендуется создавать SWAP размером от 1,5 до 2-х размеров оперативной памяти. И стоит попробовать изменять vm.swappiness, но лучше поискать возможность увеличить объем оперативной памяти.
Для машин с объемом памяти 3-4 Гб нужно решить, будет ли использоваться suspend to disk. Если да, то нужно создавать SWAP размером на 10-15% больше размера оперативной памяти. Если же suspend to disk использоваться не будет, то можно создать SWAP небольшого размера (размером от половины до 1 объема оперативной памяти). Можно не создавать SWAP при установке системы, а при необходимости добавить его позже как файл.
На компьютерах с объемами оперативной памяти более 6Gb имеет смысл создать SWAP размером в половину от объема оперативной памяти. При этом, если вы хотите использовать гибернацию, следует оценить загрузку оперативной памяти в процессе работы и задать величину SWAP, исходя из этого. К примеру, если объем оперативной памяти составляет 16 ГБ, а рабочая загрузка не превышает в среднем 5-6 ГБ, величины SWAP-раздела в 8 ГБ вам хватит для гибернации. При таком подходе следует помнить, что при использовании ресурсоёмких программ (рендеринг изображения, компиляция огромных проектов и т.п.) оперативная память может заполняться полностью, а SWAP — использоваться в качестве подкачки. В таких ситуациях размер SWAP нужно выбирать индивидуально.
При работе с секретными (зашифрованными) данными стоит либо шифровать SWAP, либо рассмотреть вариант с отказом от SWAP вовсе (зависит от размера оперативной памяти). Стоит также рассмотреть вариант с шифрованием всего диска.
Создание SWAP на разделе диска
Разобравшись с требованиями к SWAP, можно приступить к его созданию или изменению.
Ядро Linux может работать с несколькими частями SWAP. Поэтому если вы решили, что созданного при установке системы SWAP-раздела недостаточно, то стоит создать дополнительный SWAP (выделить место под раздел или файл). Однако нужно учитывать, что для гибернации нужен непрерывный блок SWAP, который должен иметь размер больший, чем оперативная память.
К примеру, у нас есть раздел /dev/sdc2 (ваше имя раздела может отличаться). Создадим на нем необходимую структуру данных для работы SWAP:
sudo mkswap /dev/sdc2
Подключим раздел как SWAP:
sudo swapon /dev/sdc2
Проверить результат можно, посмотрев на вывод команды
sudo swapon -s
Сделаем автомонтирование SWAP-раздела при запуске системы. Узнаем UUID раздела:
sudo blkid
Теперь пропишем строку в /etc/fstab
echo "UUID=<UUID swap-раздела> swap swap defaults,pri=<Приоритет (от 0 до 32767)> 0 0"| sudo tee -a /etc/fstab
SWAP с динамически изменяемым размером
Если вы не хотите думать об объеме SWAP, имеет смысл воспользоваться утилитой swapspace (динамический менеджер подкачки). Эта утилита работает в фоновом режиме и динамически управляет подкачкой. При необходимости swapspace автоматически создаёт дополнительные файлы подкачки требуемого размера. Неиспользуемые файлы подкачки удаляются и не занимают место.
Однако, если вы работаете с секретными документами, не забудьте указать swapspace создавать SWAP-файлы на зашифрованном диске или внутри шифрованного контейнера 1).
Hibernate (suspend to disk, гибернация)
О настройке режима гибернации можно прочитать здесь.
Параметр vm.swappiness
Основной параметр, влияющий на работу системы со swap, — это vm.swappiness. Очень приблизительно этот параметр можно определить так: он задает процент свободной оперативной памяти, при котором начинается использование подкачки. Более точное определение смысла этой переменной можно уяснить из описания которое было дано в рассылке kernel.org — статья на английском.
Без особой необходимости трогать его не рекомендуется.
Скорректировать значение, применяемое при загрузке системы, можно, указав в файле /etc/sysctl.conf значение vm.swappiness. Пример:
echo "vm.swappiness=30"| sudo tee -a /etc/sysctl.conf
Мгновенно применить эту настройку можно с помощью следующей команды:
# sysctl -f
Актуальное значение, используемое ядром в настоящее время, можно просмотреть или изменить в /proc/sys/vm/swappiness.
# cat /proc/sys/vm/swappiness # echo 10 > /proc/sys/vm/swappiness
Изменения в /proc/sys/vm/swappiness будут сброшены при следующей перезагрузке.
Значение vm.swappiness по умолчанию — 60.
Какое значение выбрать?
Маленькое значение vm.swappiness (минимальное значение: 0) будет заставлять ядро использовать больше оперативной памяти под память процессов (в ущерб буферам и кэшам), тогда как большое значение (максимальное значение: 100) будет выделять больше памяти под кэши и буфера (в ущерб памяти для процессов).
Нужно понимать: ни одно значение vm.swappiness не увеличит волшебным образом производительность компьютера многократно. Урезаете кеши — понижаете отзывчивость системы при работе с файлами, урезаете память процессов — снижаете отзывчивость системы при переключении задач.
Нужное вам значение, скорее всего, стоит подбирать экспериментально.
Смотрите также
Ссылки
Swap — механизм виртуальной памяти, при котором отдельные фрагменты памяти (обычно неактивные) перемещаются из ОЗУ во вторичное хранилище, освобождая ОЗУ для загрузки активных фрагментов памяти.
Просмотр текущих сведений о swap
Перед осуществлением каких-либо действий со swap выполните следующую команду, чтобы узнать его текущие тип и расположение:
swapon -s
Вывод команды может быть, например, следующим:
Filename Type Size Used Priority
Такой «пустой» вывод означает, что swap в системе отсутствует. Выполнение шагов, описанных в данной инструкции, позволит вам его создать.
Также вывод может содержать данные, подобные этим:
Filename Type Size Used Priority
/dev/xvda5 partition 1046524 4568 -1
Это означает, что для swap используется раздел xvda5 вашего диска. Если вы хотите увеличить размер swap, с помощью данной инструкции вы сможете создать swap-файл, и общий размер swap в системе будет суммироваться с текущим разделом.
Еще один вариант вывода команды:
Filename Type Size Used Priority
/swap file 1048572 0 -1
Такой вывод означает, что для swap используется файл /swap. Вы можете изменить его размер с помощью данной инструкции (при этом можно не выполнять пункт 6, т.к. запись о swap в файле /etc/fstab уже существует).
Создание и изменение swap
Для изменения размера swap или для создания swap-файла при его отсутствии выполните следующие действия.
1. В первую очередь отключите swap:
swapoff -a
2. Далее измените размер swap-файла. Если файл отсутствует в системе, эта же команда позволит его создать:
sudo dd if=/dev/zero of=/swap bs=1M count=1024
Укажите в качестве count необходимый размер swap, например, 512 или 1024 или 4096.
3. Подготовьте swap-файл:
chmod 600 /swap && mkswap /swap
4. Включите swap:
swapon /swap
5. Проверьте результат командой swapon -s:
swapon -s
Filename Type Size Used Priority
/swap file 1048572 0 -1
6. Для того, чтобы внесенные изменения были применены при следующей загрузке сервера, добавьте информацию о swap в файл /etc/fstab:
echo "/swap swap swap defaults 0 0"| sudo tee -a /etc/fstab
Объём оперативной памяти в компьютере ограничен. Чаще всего из финансовых соображений, хотя и чисто технически в конкретную материнскую плату не установишь ОП больше, чем предусмотрено её спецификациями. А раз так, то ситуации, когда возникает нехватка памяти, нередки, особенно для многозадачных операционных систем. В их число входит и Linux, и хотя она считается менее требовательной к ресурсам ПК, идеальной её назвать тоже нельзя. Дефицит ОЗУ решается разными способами. Одним из самых оптимальных из них считается использование файла или раздела на диске, где временно хранятся данные, которые извлекаются в физическую память по мере необходимости.
Что такое swap
В линуксоподобных ОС под свопом понимают механизм организации виртуальной памяти, при которой часть хранимых в ОЗУ данных (как правило, редко используемых), перемещается на временное хранение в специальный раздел или файл на жёстком или твердотельном диске.
Весь объём физической памяти в Linux разбивается на страницы. По мере необходимости содержимое отдельных страниц перемещается на выделенный раздел диска, именуемый swap space или на отдельный файл (аналог файла подкачки в Windows). Сама процедура освобождения ОП называется свопингом, а общий размер физической и swap-памяти – объёмом доступной виртуальной памяти.
Для чего нужен swap
Многозадачность не означает одновременное открытие многих программ. Даже если мы запустим браузер, он сам по себе использует множество библиотек, каждая из которых использует свою область памяти. Каждая новая вкладка, каждый открытый документ – это всё новые и новые страницы памяти, которых в определённый момент времени может и не хватить.
И если для новой вкладки свободных страниц уже нет, операционная система вынуждена заняться освобождением памяти. А что освобождать, если все страницы заняты нужными данными или кэшем? Что используется реже. Но рано или поздно выгруженный кусочек кода понадобится, а его в памяти уже не окажется. Такая ситуация называется page fault, и ОС придётся её обрабатывать по новой. Если недостающие данные на диске не обнаружатся, процесс завершится аварийно. Если он есть, система загрузит код с диска, но для этого потребуется освободить энное количество других страниц памяти. В результате начинается процесс, называемый трэшингом, когда ОС только тем и занимается, что освобождает новые страницы, удаляя их содержимое и загружая в них недостающие данные.
Наличие swap-файла как раз и решает эту дилемму. Вместо того, чтобы просто очищать страницы памяти, система сбрасывает их содержимое на диск, который как бы расширяет объём физического ОЗУ. При этом трэшинг заменяется на однократную процедуру чтения/записи.
Разумеется, мы описали процесс достаточно схематично, на самом деле он имеет множество нюансов и достаточно сложный алгоритм реализации. В любом случае картина получается следующая: если сделать swap-файл достаточно большим, редко используемые и неизменённые данные при возникновении дефицита из ОЗУ «уезжают» на диск, откуда могут по необходимости извлекаться столько раз, сколько нужно.
Если файл/раздел подкачки маленький, пользы от него будет немного, поскольку рано или поздно свободное место исчерпается и на нём, и тогда снова начнутся «пляски» с постоянными операциями записи-чтения в файл подкачки, из-за чего система будет сильно тормозить.
Отвечая на вопрос о необходимости swap в Linux, можно утверждать следующее:
- он помогает разгрузить систему, когда программа запрашивает объём физической памяти, которого в системе нет. В таких случаях ядро Linux анализирует, к каким страницам обращение происходит реже всего, сбрасывает их содержимое на диск и выделяет необходимое количество страниц текущему процессу;
- особенность многих программ состоит в том, что в момент их запуска часть страниц оказывается занята данными, которые используются только в момент инициализации процесса/приложения. Система может и должна сбрасывать эти страницы в swap, разгружая ОП.
Но не всё так просто. Swap тоже не лишён недостатков, главным из которых является скорость операций записи/чтения с диска. Достаточно сказать, что при операциях с физической памятью эта скорость измеряется в наносекундах (просто посмотрите характеристики чипов ОЗУ), а для жёсткого диска это миллисекунды, то есть на несколько порядков больше. У SSD-дисков скорости обмена данными намного больше, но из-за медленного интерфейса всё равно несравнимы с показателями ОЗУ. Вот и получается, что при частых сбросах страниц памяти в swap система тоже может работать медленнее.
Особенно часто такое случается, если компьютер используется в качестве сервера, а с Linux это большинство ПК. При нехватке памяти обычно в число первых пострадавших попадают базы данных, и если это MySQL, то его падение грозит недоступность сайта или его страниц, поэтому для серверов так важно иметь swap-раздел большого объёма – пускай лучше сайт будет работать медленнее, чем будет недоступен совсем.
Как создать и настроить файл подкачки на примере Ubuntu
Процедура создания файла подкачки достаточно сложная, требующая наличия определённых навыков работы с командной строкой.
И первый этап – нам нужно выяснить, имеется ли в системе раздел или файл, выделенный под swap.
Проверка наличия swap в Ubuntu
Используем команду:
swapon -s
или
free –m
Если swap отсутствует, в первом случае вы получите пустую результирующую строку, во втором – таблицу использования виртуальной памяти, в которой строка Swap будет содержать нули.
Если файла подкачки нет, нужно определиться, имеется ли возможность его создать.
Проверка наличия свободного пространства на диске
Выполняем команду
df -h
Отобразится таблица примерно такого содержания:
На диске порядка 23 ГБ свободного пространства, этого более чем достаточно для создания swap-файла.
Какого размера создать swap
Размер файла подкачки зависит от множества факторов:
- сколько ОЗУ имеется в системе;
- каков состав используемых программ/приложений;
- намерены ли вы задействовать режим сна;
- будут ли использоваться файлы с секретными данными.
Разумеется, главным аспектом является объём физической памяти. Если её меньше 2 ГБ, sawp-файл нужнее размером в 1,5-2 раза больше, то есть до 4 ГБ.
Если у вас 3-4 ГБ ОЗУ, то определитесь сначала, будете ли вы использовать режим сна. Если да, объём файла подкачки желательно выбирать из расчёта 110-115% от объёма оперативной памяти, если нет – идеальным вариантом будет swap-файл такого же объёма.
Если у вас мощный компьютер и объём ОП превышает 6 ГБ, размер swap-файла в Linux выбирайте из расчёта половины объёма оперативной памяти. Если планируется использование режима гибернации, может потребоваться эксперимент для выяснения, сколько ОЗУ используется для режима сна и выбирать значение, исходя из полученных результатов. Благо сформировать файл подкачки можно в любой момент времени, не обязательно на этапе установки Linux.
Рекомендуемые размеры swap-файла в Linux в документации Fedora
Создание swap-файла в Linux
Процедура создания файла подкачки в Linux имеет несколько вариантов, один из которых считается традиционным, а другой – ускоренным.
Для начала ознакомимся с быстрым способом, который заключается в использовании одной команды:
fallocate -l 2G /swapfile
Здесь второй параметр указывает на размер создаваемого файла, выраженный в ГБ (если букву не указывать, система будет интерпретировать параметр в КБ, это нужно обязательно учитывать).
При этом файл будет создан и доступен сразу после выполнения команды, так что желательно использовать именно этот способ.
Второй вариант, традиционный:
dd if=/dev/zero of=/swapfile bs=1М count=2096
Здесь параметр bs указывает, в каких единицах мы задаём размер одного блока для swap-файла. В данном случае – 1 мегабайт. Параметр count указывает на количество таких блоков, выделяемых под файл подкачки, и в сумме получаются те же 2 ГБ, как в первом варианте.
Сама команда dd в Linux обозначает побайтовое копирование, параметр if указывает, откуда копировать, в нашем случае это /dev/zero – специальный файл с нулевыми байтами. Параметр of указывает, что записывать эти нулевые байты мы будем в файл /swapfile.
Отметим, что при использовании этой команды ошибки недопустимы. Если вы неправильно укажете параметр of, то имеется вероятность повреждения важных данных.
Если вы указали недостаточный размер файла подкачки (это может выясниться много позже), увеличить или просто изменить размер swap Ubuntu можно отключив текущий (как это сделать, мы расскажем позже) и создав его заново по приведённому здесь алгоритму с указанием правильного размера.
Как подключить swap-файл
Файл подкачки является важным с точки зрения операционной системы, и его редактирование может привести к её краху. Поэтому важно ограничить доступ к swap следующей командой:
chmod 600 /swapfile
В результате право чтения и записи в него будет иметь только пользователь root (аналог admin в Windows).
Дальнейшая настройка swap-файла заключается в преобразовании /swapfile в файл подкачки с помощью команды
mkswap /swapfile
И заключительная команда, действие которой заключается в подключении swap к системе (его включению):
swapon /swapfile
Теперь он полностью готов к работе.
Добавление swap в автозагрузку
Чтобы после каждой перезагрузки не выполнять подключение файла подкачки к системе последней командой предыдущего раздела, вписываем в файл /etc/fstab с помощью любого текстового редактора строку, которая будет использоваться при каждой загрузке Linux:
/swapfile none swap defaults 0 0
После перезагрузки компьютера можно проверить правильность срабатывания командой free –m.
Как очистить swap в Ubuntu
Иногда может потребоваться временно освободить место на диске, и зачастую именно файл подкачки – единственный реальный кандидат для этих целей.
Очистка swap (вернее, отключение) осуществляется командой
swapoff –a
Включение производится командой
swapon -a
СОВЕТ. Отключать swap таким способом не рекомендуется, поскольку данные просто обнуляются, без переноса в оперативную память. Если в числе удалённых данных окажутся те, которые используются системными процессами, может проследовать крах системы.
Если вы решили и вовсе отказаться от использования файла подкачки, удалить swap можно следующим образом:
cat /proc/swaps (определяем местоположение swap-файла)
swapoff /dir/swapXXXXX (отключаем файл подкачки, здесь dir – это результат выполнения предыдущей команды, то есть директория с файлом, а swapXXXXX – имя самого файла подкачки)
rm /dir/swapXXXXX (удаляем файл с диска)
Если вы добавляли swap в автозагрузку, его нужно оттуда убрать, удалив соответствующую строчку в файле /etc/fstab (например, редактором gedit).
Но напомним, что без наличия swap-файла система может работать нестабильно, особенно при малом объёме оперативной памяти, поэтому удаление файла подкачки без создания нового настоятельно не рекомендуется.
(this answer completely rewritten since the downvote)
Notes about fallocate
vs dd
Before we continue, I want to point out that some answers use fallocate
to allocate space for a file, instead of dd
. Don’t do that. Use dd
. @muru pointed out some important points here and here. Although fallocate
is much much faster, it may create files with holes. I think that simply means the space is not contiguous, which is bad for swap files. I picture this as meaning that fallocate
creates a C-style linked-list of memory, whereas dd
creates a C-array contiguous block of memory. Swap files need a contiguous block. dd
does this by doing a byte-for-byte copy of binary zeros from the /dev/zero
pseudo-file into a new file it generates.
man swapon
also states not to use fallocate
, and to use dd
instead. Here is the quote (emphasis added):
NOTES
You should not use
swapon
on a file with holes. This can be seen in
the system log asswapon: swapfile has holes.
The swap file implementation in the kernel expects to be able to
write to the file directly, without the assistance of the filesystem. This is a problem on preallocated files (e.g.fallocate(1)
) on filesystems likeXFS
orext4
, and on copy-on-write filesystems likebtrfs
.It is recommended to use
dd(1)
and/dev/zero
to avoid holes on XFS and ext4.
And from man mkswap
(emphasis added):
Note that a swap file must not contain any holes. Using
cp(1)
to
create the file is not acceptable. Neither is use offallocate(1)
on file systems that support preallocated files, such as XFS or
ext4, or on copy-on-write filesystems like btrfs. It is recommended to usedd(1)
and/dev/zero
in these cases. Please read notes fromswapon(8)
before adding a swap file to copy-on-write filesystems.
So, use dd
, not fallocate
, to create the swap files.
Option 1 (my preference): delete the old swap file and create a new one of the correct size:
Rather than resizing the swap file, just delete it and create a new one at the appropriate size!
swapon --show # see what swap files you have active
sudo swapoff /swapfile # disable /swapfile
# Create a new 16 GiB swap file in its place (could lock up your computer
# for a few minutes if using a spinning Hard Disk Drive [HDD], so be patient)
sudo dd if=/dev/zero of=/swapfile count=16 bs=1G
sudo mkswap /swapfile # turn this new file into swap space
sudo chmod 0600 /swapfile # only let root read from/write to it, for security
sudo swapon /swapfile # enable it
swapon --show # ensure it is now active
In case you are adding this swap file for the first time, ensure it is in your /etc/fstab
file to make the swap file available again after each reboot. Just run these two commands:
# Make a backup copy of your /etc/fstab file just in case you
# make any mistakes
sudo cp /etc/fstab /etc/fstab.bak
# Add this swapfile entry to the end of the file to re-enable
# the swap file after each boot
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Source: see the «Step 4: Make the changes permanent» section here.
Option 2: resize the old swap file:
The accepted answer by @Ravexina is correct. However, initially I didn’t understand all of its pieces, so I wanted to include some more descriptions and explain more of the details. See dd --help
and man dd
. Some of my learning on this comes from Bogdan Cornianu’s blog post as well. I also add a few commands at the end to show how to verify your swap space once you create it.
How to resize swap file:
Here we will increase the size of the existing swap file by writing 8 GiB (Gibibytes) of zeros to the end of it.
-
Turn off usage of just this one swap file (located at «/swapfile«):
# Do this sudo swapoff /swapfile # NOT this, which unnecessarily disables all swap files or partitions # sudo swapoff --all # or # sudo swapoff -a
-
Increase the size of the swap file by 8 GiB by appending all zero bytes to the end of it (rather than rewriting the whole file, which would be slower):
sudo dd if=/dev/zero of=/swapfile bs=1G count=8 oflag=append conv=notrunc
-
if
= input file -
/dev/zero
= a special Linux «file» which just outputs all zero bytes every time you read from it -
of
= output file -
bs
= block size- Here,
1G
stands for 1 Gibibyte, or GiB, which is the base-2 version of «Gigabyte, which is base-10. According toman dd
,G =1024*1024*1024
bytes. This is how I like to size files since computers and hardware memory are base-2. - If you’d like to use 1 Gigabyte, or GB, which is the base-10 version of «Gibibyte», which is base-2, then you must instead use
1GB
rather than1G
.man dd
shows thatGB =1000*1000*1000
bytes.
- Here,
-
count
= multiplier of blocks; the total memory written will becount * bs
. -
oflag=append
means to append to the end of the output file, rather than rewriting the whole thing. Seedd --help
andman dd
. Fromdd --help
:append append mode (makes sense only for output; conv=notrunc suggested)
-
conv=notrunc
means when «converting» the file, «do not truncate the output file»;dd --help
, as you can see just above, shows this is recomended whenever doingoflag=append
-
Note: if you wanted to rewrite the whole swap file rather than just appending to it, you could create a 32 GiB swapfile like this, for example:
sudo dd if=/dev/zero of=/swapfile bs=1G count=32
-
-
Make the file usable as swap
sudo mkswap /swapfile
-
Turn on the swap file
sudo swapon /swapfile
-
(Bonus/Optional): ensure this swap file you just created is now in usage:
swapon --show
Sample output:
$ swapon --show NAME TYPE SIZE USED PRIO /swapfile file 64G 1.8G -2
You can also look at some memory/swap info with these two commands as well:
# 1. Examine the /proc/meminfo file for entries named "swap", such # as the "SwapTotal" line cat /proc/meminfo | grep -B 1000 -A 1000 -i swap # 2. Look at total memory (RAM) and swap (virtual memory) used # and free: free -h
References:
- @Ravexina’s answer
- Bogdan Cornianu’s blog post here: https://bogdancornianu.com/change-swap-size-in-ubuntu/
- «How to Create and Use Swap File on Linux»: https://itsfoss.com/create-swap-file-linux/
See also:
- My answer where I use the above information about increasing your swapfile size in order to solve an out-of-memory Bazel build error: Stack Overflow: java.lang.OutOfMemoryError when running bazel build
Though for the most part Linux applications run just fine, it’s not uncommon to run into «Out of Memory» errors when using particularly performance-intensive programs. As you may have gathered, this occurs when your server does not have enough RAM to hold the application in memory. This can be remedied with Ubuntu swap space, which we’ll show you how to adjust today.
What is Swap Space in Linux?
Swap, which you may know as the paging file or page file on Windows, is space set aside by the operating system to temporarily hold information that it can’t hold in RAM. Rather than throw up errors and force you to close other applications, Ubuntu «swaps» some of the information that’s in memory to a hard drive for later use.
This is not ideal – there’s a reason that PC’s have RAM instead of just regular hard drives – but it’s better than data loss. Though hard drives have the advantage of offering non-volatile storage, they’re much slower than RAM. As a result, the overall experience is likely to be degraded if you use a system than runs out of memory frequently. Essentially, It’s always better to have more RAM than you need, but Swap Space can protect against out-of-memory exceptions in a pinch.
Generally, though, you should be careful using swap storage if your server or personal system is using a Solid State Drive (SSD). As SSDs have a limited amount of writes in its lifespan, constantly swapping out data from the SSD to RAM can quickly degrade the drive.
If it’s very rare that you exceed your RAM, this isn’t likely to cause major issues, but for systems with low memory and an SSD, it’s not recommended.
How to Check Swap Space in Linux
It’s always a good idea to check how much Ubuntu swap space (if any) your system has before adjusting it. You can do so with the following command:
sudo swapon --show
If the command returns nothing, it means you don’t currently have any swap space configured. If you want to verify this, type:
free -h
total used free shared buff/cache available
Mem: 991Mi 221Mi 67Mi 0.0Ki 702Mi 753Mi
Swap: 0B 0B 0B
Now we can move onto the next step – making sure your hard drive has enough space to create a swap file. Enter:
df -h
The output will look something like this:
Filesystem Size Used Avail Use% Mounted on
/dev/root 25G 4.7G 20G 20% /
devtmpfs 494M 0 494M 0% /dev
tmpfs 496M 8.0K 496M 1% /dev/shm
tmpfs 100M 488K 99M 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/sda15 105M 9.1M 96M 9% /boot/efi
/dev/loop0 72M 72M 0 100% /snap/lxd/16530
/dev/loop1 55M 55M 0 100% /snap/core18/1880
/dev/loop5 30M 30M 0 100% /snap/snapd/8542
/dev/loop6 56M 56M 0 100% /snap/core18/1885
/dev/loop2 72M 72M 0 100% /snap/lxd/16723
/dev/loop4 30M 30M 0 100% /snap/snapd/8790
tmpfs 100M 0 100M 0% /run/user/0
The column /dev/root
, which is mounted on /
is our drive in this scenario. You can see that 4.7 GB out of 20 has been used, or a total of 20%. That gives us plenty to play with, considering that our server has 1 GB of RAM and it’s unlikely to even double that.
Here’s a helpful table from the Ubuntu community help wiki:
RAM | No hibernation | With Hibernation | Maximum |
---|---|---|---|
256 MB | 256 MB | 256 MB | 512 MB |
512 MB | 512 MB | 1024 MB | 1024 MB |
1024 MB | 1024 MB | 2048 MB | 2048 MB |
1 GB | 1 GB | 2GB | 2GB |
2 GB | 1 GB | 3 GB | 4 GB |
3 GB | 2 GB | 5 GB | 6 GB |
4 GB | 2 GB | 6 GB | 8 GB |
5 GB | 2 GB | 7 GB | 10 GB |
6 GB | 2 GB | 8 GB | 12 GB |
8 GB | 3 GB | 11 GB | 16 GB |
12 GB | 3 GB | 15 GB | 24 GB |
16 GB | 4 GB | 20 GB | 32 GB |
24 GB | 5 GB | 29 GB | 48 GB |
32 GB | 6 GB | 38 GB | 64 GB |
64 GB | 8 GB | 72 GB | 128 GB |
128 GB | 11 GB | 139 GB | 256 GB |
Keep in mind that you’ll need a large page file if your system has hibernation enabled, as it writes the contents of the RAM to swap on shutdown.
How to Create a Swap File and Increase Swap Space
Now that we’ve verified it’s safe to proceed we can craft our swap file. There are a few ways to do this, but the easiest is via the fallocate
program, which lets us allocate the exact size we want our swapfile
to be.
As mentioned earlier, our server has 1 GB of RAM. We’re going to set our swapfile to 2 GB because we have plenty of free space, but 1 GB of swap would likely work just fine if we didn’t:
cd
sudo fallocate -l 2G /swapfile
As we didn’t specify a folder, our swapfile will be placed in our root directory, which is what we want. The command won’t give any output, so you can make sure the swap space was actually reserved with:
ls -lh /swapfile
In our case, the command returns:
-rw-r--r-- 1 root root 2.0G Aug 15 12:47 /swapfile
However, though we have space reserved for our swapfile, our system hasn’t yet be told this is where we want to it store information when out of memory. Before we do so, we want to make sure nobody but root can modify the file. Otherwise, an attacker could potentially use the file to perform an attack or steal information. Set the permissions with:
sudo chmod 600 /swapfile
Now verify that change using the same command as earlier:
ls -lh /swapfile
The output should have changed from rw-r--r-- 1 root root
to -rw------- 1 root root 2.0G Aug 15 12:47 /swapfile
, indicating that now only root has the read and write flags enabled.
With that done, dedicate the file as swap space by entering:
sudo mkswap /swapfile
The output should say something like:
`Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=f9429158-ec78-4dce-98c0-986167b47016`
Now we just need to enable the swap file:
sudo swapon /swapfile
And verify that it’s available via the check commands from earlier:
sudo swapon --show
NAME TYPE SIZE USED PRIO
/swapfile file 2G 0B -2
free -h
total used free shared buff/cache available
Mem: 991Mi 222Mi 28Mi 0.0Ki 740Mi 752Mi
Swap: 2.0Gi 0B 2.0Gi
How to Make a Swap File Permanent and Adjust its Settings
Though we’ve technically created out swap space now, the changes won’t persist across a reboot unless we take further action. We remedy this by adding the swap file to /etc/fstab
, Unix’s system configuration file:
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
The first command backed up our old fstab file, so if anything goes wrong you should roll back to that. Now we can talk about configuration. Here are some of the most commonly adjusted options and their purpose:
- Swappiness: How often your PC swaps data from RAM to your swap space. A value of 0 to 100, denoting the percentage of available RAM you want it to swap at.
- Cache pressure: How often the system caches inode and dentry (file system) data. This often performance intensive and worth caching. The 0 to 100 value signifies how much the system will choose to cache.
How to Change Swapiness
You can see your current swapiness value by entering:
cat /proc/sys/vm/swappiness
By default, your swapiness value is probably 60. For reference, at 1 the kernel won’t swap data out of memory unless it would experience serious issues otherwise. At 99, the system will try to keep memory space free by swapping information into memory quite aggressively. At 60, it’ll swap when the RAM reaches 40% capacity.
It’s ultimately up to you what you set this to, but a guideline is a low value like 10 for a desktop installation with a good amount of RAM. For a server with low RAM, 60 could be a passable default value, but it’s worth experimenting with. Change it via the command:
sudo sysctl vm.swappiness=10
Once you’re happy, you can force it to persist across a reboot by adding the line to /etc/sysctl.conf
. Type sudo nano /etc/sysctl.conf
and add vm.swappiness=10
to the bottom of the file.
Press Crl+O to save, then Ctrl+X to exit.
Change your Cache Pressure Value
You can see your current cache pressure value by typing:
cat /proc/sys/vm/vfs_cache_pressure
The default will be 100, but 50 is generally a good number to start with. You can type sudo sysctl vm.vfs_cache_pressure=50
to set it for this boot.
To make the change permanent, add the vm.vfs_cache_pressure=50
to the bottom of your sysctl.conf with:
sudo nano /etc/sysctl.conf
Closing Words
Making these adjustments will almost always help your performance in Ubuntu 20.04 and prevent out of memory errors. Just make sure you aren’t too aggressive if you use an SSD or you could wear the hardware down slower.
However, it’s worth noting that even with these errors, with a low amount of RAM there’s only so much you can do. Tasks take far longer to complete on swap storage and you may still run into out of memory errors in some applications if you only have 1 GB. In these cases, it’s best to just upgrade your server. Jumping up a few gigabytes of RAM usually isn’t that expensive and can help a lot.
***Sign up to BitLaunch and grab a server with up to 32 GB of RAM for use with your Ubuntu swap space.