Еще раз о SWAP в Linux «на горячую» на AWS EC2 Instance

Все мы знаем, как важен 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


Screenshot

image


Указываем нужный нам размер и создаем EBS Volume


Screenshot

image


Ждем, когда EBS Volume State станет available


Screenshot

image


Затем выбираем наш EBS Volume и Actions -> Attach Volume


Screenshot

image


И выбрав сервер, к которому мы примонтируем диск завершаем c подготовкой EBS Volume


Screenshot

image


Теперь подключаемся к нашему серверу и выполняем команду lsblk


ubuntu@testinstance:~$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  16G  0 disk
└─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
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 14
  • 0
    IMHO лучше сначала добавить в fstab и подключить через mount -a, а не подключить вручную, а потом после ребута увидеть что в fstab сделал очепятку и своп не смаунтился.

    • 0
      swapon -a вроде же, mount swap не будет трогать.
      • 0
        mount -a как минимум проверяет правильность заполнения файла. Чтобы потом при следующей разгрузке не было неожиданностей.
      • –1
        ansible-playbook, который создаст и подключит своп в авс:
        gist.github.com/f41gh7/1ed0fcf6b7db9ca62e769ad0d004ff77
        • +1
          А зачем там захардкожен IP, имя юзера, регион и имя раздела? Это слишком индивидуальный playbook заточенный под один сервер. так и сломать что-то не долго у себя
          • 0
            это образец.
            Все переменные можно переопределить через
            ansible-playbook -e @vars.yml
            , пользователя указать на прямую —
            ansible-playbook -u

            IP адрес APIPA для получение aws metadata с хоста. Он для всех машин одинаков.
        • +8
          Не то чтобы я придирался, но 1) создать том, и 2) использовать его как своп вроде бы не такая трудная тема, чтобы вообще об этом писать на хабре, или нет?

          Особенно непонятно, чем описанное отличается от добавления своп-раздела в Linux, запущенный под KVM, Hyper-V, любым другим гипервизором?

          Простое howto, это ли уровень Хабра?
          • +2
            Немного теории: что такое 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

            там ещё много, но вашего варианта, вроде бы нету :)

            • 0
              Еще больший оффтоп на рутованых ондроед смартфонах вообще можно делать свап с любого места размером по желанию левой пятки.
            • 0
              fallocate -l 8G /swapfile сработает быстрее чем dd
              • 0
                Не нужно делать своп на ЕБС. Нужно его делать на Инстанс Сторе.
                во первых он как раз подходит под своп/темп задачи (стирается после шатдауна инстанса).
                во вторых не нужно платить дополнительно, пространство уже включено, размер зависит от типа инстанса.
                • 0
                  Уважаемый, процитирую первый абзац статьи:
                  Особенно когда ОЗУ не так много, а на сервере появился «прожорливый» процесс. Да и дискового пространства впритык на сервере. А работоспособность нужно восстановить прямо сейчас...

                  С уважением, Я!
                • 0

                  Какой DevOps, уважаемый?
                  ClickOps в полный рост ;)

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.