Все мы знаем, как важен SWAP. И как без него бывает плохо. Особенно когда ОЗУ не так много, а на сервере появился "прожорливый" процесс.
В данной статье хочу рассмотреть способы добавления SWAP на AWS EC2 серверах "на горячую", без перезагрузки сервера.
Немного теории: что такое SWAP?
SWAP – один из механизмов виртуальной памяти, при котором отдельные фрагменты памяти (обычно неактивные) перемещаются из ОЗУ во вторичное хранилище (отдельный раздел или файл), освобождая ОЗУ для загрузки других активных фрагментов памяти. Так же SWAP используется при организации режима сна. Но в контексте данной статьи мы не будем это рассматривать. Более подробно о SWAP можно прочитать в Википедии.
Рассмотрим два способа добавления SWAP:
- SWAP as Volume
- SWAP as FIle
SWAP Volume
Для реализации этого решения нам нужно будет:
- создать EBS Volume
- примонтировать его к нашему серверу
- подготовить примонтированный раздел для использования под SWAP
- обновить /etc/fstab
Для начала необходимо создать EBS Volume нужного размера. Для этого переходим в
Services -> EC2 -> Volumes в AWS Console
Указываем нужный нам размер и создаем EBS Volume
Ждем, когда EBS Volume State станет available
Затем выбираем наш EBS Volume и Actions -> Attach Volume
И выбрав сервер, к которому мы примонтируем диск завершаем c подготовкой EBS Volume
Теперь подключаемся к нашему серверу и выполняем команду lsblk
ubuntu@testinstance:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 16G 0 disk
L-xvda1 202:1 0 16G 0 part /
xvdf 202:80 0 8G 0 disk
Мы видим, что наш EBS Volume успешно подключен как /dev/xvdf.
Теперь нам нужно отформатировать подключенный EBS Volume через mkswap
NOTE: не забываем заменить /dev/xvdf на свое значение
ubuntu@testinstance:~$ sudo mkswap /dev/xvdf
Setting up swapspace version 1, size = 8 GiB (8589930496 bytes)
no label, UUID=f2fe6c31-e8c5-4c28-b00f-99205cf2b04b
И активировать его
ubuntu@testinstance:~$ sudo swapon /dev/xvdf
Делаем изменения в /etc/fstab
NOTE: не забываем заменить /dev/xvdf на свое значение
NOTE 2: добавление в /etc/fstab записи необходимо для того, чтобы после перезагрузки сервера не пришлось заново настраивать SWAP
?ubuntu@testinstance:~$ echo -ne "/dev/xvdf\tswap\tswap\tdefault\t0\t0\n" | sudo tee -a /etc/fstab
Проверяем, что SWAP активирован в системе
ubuntu@testinstance:~$ free
total used free shared buff/cache available
Mem: 1014648 45824 705668 3152 263156 809168
Swap: 8388604 0 8388604
SWAP File
Для реализации этого решения нам нужно будет:
- создать и подготовить SWAP File для использования
- обновить /etc/fstab
А что если у нас нет возможности подключить еще один EBS Volume к серверу, но на текущем EBS Volume есть свободное место? В таком случае мы можем сделать SWAP File
Для начала посмотрим, сколько свободного пространства имеется у нас на диске через df
ubuntu@testinstance:~$ df --block-size=G
Filesystem 1G-blocks Used Available Use% Mounted on
udev 1G 0G 1G 0% /dev
tmpfs 1G 1G 1G 4% /run
/dev/xvda1 16G 1G 15G 7% /
tmpfs 1G 0G 1G 0% /dev/shm
tmpfs 1G 0G 1G 0% /run/lock
tmpfs 1G 0G 1G 0% /sys/fs/cgroup
tmpfs 1G 0G 1G 0% /run/user/1000
Создадим swapfile размером в 8Gb
?ubuntu@testinstance:~$ sudo dd if=/dev/zero of=/swapfile bs=1M count=8192
8192+0 records in
8192+0 records out
8589934592 bytes (8.6 GB, 8.0 GiB) copied, 130.955 s, 65.6 MB/s
После этого преобразовываем файл для использования как SWAP через mkswap
ubuntu@testinstance:~$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 8 GiB (8589930496 bytes)
no label, UUID=5f3d0d1c-1ece-4e0d-aa58-16b093891438
Меняем права доступа к swapfile
ubuntu@testinstance:~$ sudo chmod 0400 /swapfile
И активируем его
?ubuntu@testinstance:~$ sudo swapon /swapfile
Вносим изменения в /etc/fstab
NOTE: добавление в /etc/fstab записи необходимо для того, чтобы после перезагрузки сервера не пришлось заново настраивать SWAP
ubuntu@testinstance:~$ echo -ne "/swapfile\tswap\tswap\tdefault\t0\t0\n" | sudo tee -a /etc/fstab
Проверяем, что SWAP активирован в системе
ubuntu@testinstance:~$ free
total used free shared buff/cache available
Mem: 1014648 45824 705668 3152 263156 809168
Swap: 8388604 0 8388604
Комментарии (10)
Faight
16.01.2018 22:26ansible-playbook, который создаст и подключит своп в авс:
gist.github.com/f41gh7/1ed0fcf6b7db9ca62e769ad0d004ff77MasMaX
17.01.2018 12:24А зачем там захардкожен IP, имя юзера, регион и имя раздела? Это слишком индивидуальный playbook заточенный под один сервер. так и сломать что-то не долго у себя
Faight
17.01.2018 12:33это образец.
Все переменные можно переопределить через
, пользователя указать на прямую —ansible-playbook -e @vars.yml
ansible-playbook -u
IP адрес APIPA для получение aws metadata с хоста. Он для всех машин одинаков.
dmitry_ch
16.01.2018 23:01Не то чтобы я придирался, но 1) создать том, и 2) использовать его как своп вроде бы не такая трудная тема, чтобы вообще об этом писать на хабре, или нет?
Особенно непонятно, чем описанное отличается от добавления своп-раздела в Linux, запущенный под KVM, Hyper-V, любым другим гипервизором?
Простое howto, это ли уровень Хабра?
avost
16.01.2018 23:08Немного теории: что такое SWAP?
SWAP Shared Wireless Access Protocol
SWAP Second Wind Adoption Program
SWAP Short Wavelength Automated Perimetry
SWAP Simple Workflow Access Protocol
SWAP Source Water Assessment Plan
SWAP Swine Welfare Assurance Program
SWAP Student Work Abroad Programme
SWAP Save Waste And Prosper
SWAP Salespeople With A Purpose
SWAP Simplified Web Automated Portal
SWAP Share With A Pal
…
там ещё много, но вашего варианта, вроде бы нету :)
zCooler
IMHO лучше сначала добавить в fstab и подключить через mount -a, а не подключить вручную, а потом после ребута увидеть что в fstab сделал очепятку и своп не смаунтился.
rogoz
swapon -a вроде же, mount swap не будет трогать.
MasMaX
mount -a как минимум проверяет правильность заполнения файла. Чтобы потом при следующей разгрузке не было неожиданностей.