요즘 들어 SSD가 많이 보급되고 Kernel과 File System에서도 제대로 지원하게 된 덕분에, 이제는 Ubuntu Box에서도 SSD를 장착하여 사용하는데 어려움이 많이 줄어들게 되었습니다.

이번 Post에서는 SSD를 사용하면서 성능 향상과 안정성을 높이는 방법에 대하여 몇 가지 정리한 것들을 공유해 봅니다.

1. Mount Option 변경

/etc/fstab에서 SSD Partition에 대한 Mount Option을 조정하면 성능과 안정성을 높일 수 있습니다.

다음의 예는 / Directory에 Mount되어 있는 SSD Partition의 Mount Option을 나타낸 것입니다.

$ sudo vi /etc/fstab

UUID=12345678-1234-1234-1234-123456789012 / ext4 errors=remount-ro,noatime,discard 0 1

중요한 것은 errors=remount-ro, noatime, discard Mount Option인데, 이것은 다음과 같은 의미를 가집니다.1

  • errors=remount-ro: SSD Partition에 Error가 발생할 경우, 이 Partition을 다시 Read-only로 Mount합니다. 이 Option은 EXT4, JFS등에서 지원합니다. XFS에서는 지원하지 않기 때문에 defaults를 대신 사용합니다.
  • noatime: SSD Partition의 File System에 atime(Access Time)정보를 적지 않도록 합니다. 이것은 File의 Read 동작 시에 불필요한 Write 동작이 일어나지 않게 만들어 주기 때문에 접근 속도를 향상 시킬 수 있습니다.
  • discard: discard Option은 Storage Device에 더 이상 유효하지 않은 Data가 존재하는 Sector가 있음을 알리는 기능을 합니다. 이것을 사용하면 SSD의 TRIM Command를 자동으로 사용하게 되어 SSD의 수명을 연장 시킬 수 있습니다. 이 Option은 EXT4, btrfs, XFS File System에서만 지원됩니다. (JFS는 Kernel 3.7이상)

SSD Partition이 여러 개 Mount 되어 있다면, 각 Partition마다 Mount Option을 위와 같이 변경하고 Rebooting하면 안정적으로 SSD를 사용할 수 있습니다.

2. TRIM

SSD는 H/W의 특성 상 쓰기 수명이 정해져 있기 때문에 가능한 Write 동작을 줄이기 위해서 SSD에서는 TRIM을 지원합니다.

TRIM은 SSD에 사용자나 OS에 의해 삭제 명령이 실행되어 더 이상 사용하지 않게 된 Data Block을 실제로 삭제하지는 않고 SSD에 알리는 기능을 합니다.

이전 항목의 Mount Option에서 보았듯이, discard Option으로 TRIM command를 자동으로 사용하도록 설정할 수 있습니다.

하지만, 실제로 사용하다 보면 Write 속도가 현저히 느려지는 시점이 오게 됩니다. 이럴 때는 사용자가 직접 TRIM 동작을 실행시켜 주어야 합니다.

다음과 같이 Terminal에서 입력합니다.

$ sudo ionice -c 3 fstrim --all

위의 명령과 같이 ionice로 I/O 접근 Priority를 낮추지 않으면 명령 실행 중에 Write 동작이 발생했을 때 System이 Block되는 현상을 겪을 수 있습니다.

하지만, 배포판이 Update되면서 Ubuntu 14.04 LTS 이상에서는 매 주마다 System에 Mount된 SSD Partition에 대해 fstrim을 수행하는 Script가 Default로 추가되었기 때문에, 특별한 문제가 발생하지 않는 한 명령 실행 없이 그냥 사용해도 무방합니다. (/etc/cron.weekly/fstrim 참조)

3. I/O Scheduler 변경

I/O Scheduler는 Storage Device의 I/O 성능 관리를 위해서 사용되는 Kernel의 기능입니다.

Linux에서는 Deadline, CFQ, NOOP을 지원하는데, SSD의 경우는 특별한 Scheduling을 없이 I/O 요청이 들어오는 대로 동작을 수행하는 NOOP을 사용하는 것이 성능 향상에 도움이 됩니다.

SSD의 I/O Scheduler를 변경하려면 Terminal에서 다음과 같이 입력합니다. (SSD의 Device가 /dev/sda일 경우의 예)

$ sudo vi /etc/rc.local

echo noop > /sys/block/sda/queue/scheduler

4. System의 여유 Memory가 충분할 경우

이번 항목에서는 System의 여유 Memory가 충분한 경우(여유 Memory가 4GB 이상?)에 SSD의 안정성과 System의 성능을 높일 수 있는 방법을 소개합니다.

4.1 No Swap

Linux의 Swap Partition은 System의 가용 Memory가 부족할 경우에 Page Swapping을 위해서 사용됩니다.

여러 Service를 운영하는 경우라면 가용 Memory에 대한 대비를 해야 하기에 Swap Partition을 사용하는 것이 맞지만, 개인적으로 사용하는 Server나 일반 Desktop 용도로 사용하는 경우라면 Swap Partition이 없이도 System을 사용하는데 문제가 없습니다.

게다가 SSD에 Ubuntu가 설치된 경우라면, Swap Partition이 존재하지 않을 경우에 Swapping으로 인한 I/O가 발생하지 않기 때문에 SSD에 대한 Write 동작을 줄여 수명을 늘릴 수 있습니다.

이번 항목에서는 Swap Partition 없이 설치하는 방법과 기존에 Swap Partition을 제거하는 방법, 그리고 Swap이 필요한 경우가 되었을 때 Swap을 추가하는 방법 등에 대해서 알아봅니다.

과거에는 Hibernation(절전 기능)을 위해서 Swap Partition을 사용했었지만, 최신의 Ubuntu에서는 Swap Partition이 없이도 Hibernation이 제대로 동작합니다.

4.1.1 Swap Partition을 만들지 않고 Ubuntu 설치하기

Swap Partition을 설치 시에 기본적으로 생성하는 것이 관례지만, SSD에 Ubuntu를 설치할 경우에는 Swap Partition 없이 설치하는 것이 좋습니다.

Ubuntu Desktop Edition - Installation Type

Ubuntu 14.04를 예로 들면, Installation Type에서 Something Else를 Check하고 Continue를 누릅니다.

Ubuntu Desktop Edition - Edit Partition

Partition 편집 화면이 표시되는 여기서 위와 같이 Swap Partition 없이 Partition을 구성하고 Install Now를 누릅니다.

Ubuntu Desktop Edition - No Swap Message

위의 그림과 같이 Swap Partition이 없는 것에 대한 경고 Message에서 Continue를 눌러 계속 설치하면, Swap Partition 없이 Ubuntu를 설치하게 됩니다.

4.1.2 Swap Partition 삭제

SSD에 Ubuntu를 설치할 때 Swap Partition을 생성하여 설치했다면, Ubuntu CD를 이용하여 Swap Partition을 제거하고, 추가로 확보된 공간을 기존 Partition에 추가할 수 있습니다.

이 작업은 Partition을 편집하기 때문에 Data의 Loss가 발생할 수도 있습니다. 실행 시 유의하기 바랍니다.

Ubuntu Desktop Edition – Try Ubuntu

Ubuntu 14.04를 예로 들면, 설치 화면에서 Ubuntu 체험하기를 누릅니다.

Dash – gParted

Dash의 검색창에 gparted를 입력하고 GParted Partition Editor를 Click합니다.

gParted – Swap off

gParted가 실행되면 위의 그림과 유사할 것입니다. SSD의 Partitioin 중의 Swap Partition을 Mouse 오른쪽 Button으로 선택한 후, Swapoff를 Click하여 Swap을 해제합니다.

gParted – Delete the swap partition

다시 Swap Partition을 Mouse 오른쪽 Button으로 선택한 후, Delete를 눌러 Partition을 삭제합니다.

gParted – Resize partition

그리고 Swap Partition의 공간이 여유 공간이 되었으므로, OS가 설치된 Partition (위의 그림에서는 XFS Partition)에 추가하기 위해서 해당 Partition을 Mouse 오른쪽 Button으로 선택한 다음 Resize를 Click합니다.

gParted – Increase partition size

Dialog에서 화살표와 같이 이동하여 여유 공간을 포함시킨 후, Resize를 누릅니다.

gParted – Apply changes

마지막으로, 지금까지의 변경을 실제로 SSD에 적용하기 위해 위의 그림과 같이 Apply Button을 누릅니다.

Partition이 변경되었다면, 마지막으로 Rebooting하여 CD가 아닌 SSD에 설치된 Ubuntu로 Booting합니다.

그리고 아래와 같이 /etc/fstab에서 Swap Partition에 대한 내용을 삭제하면 Swap Partition 삭제가 모두 완료됩니다.

$ sudo vi /etc/fstab

# swap was on /dev/sda2 during installation
UUID=12345678-1234-1234-1234-123456789012    none    swap    sw    0    0
(이 내용을 삭제한 후 저장)

4.1.3 Swap File을 사용하여 Swap을 추가하는 방법

위에서 설정한 것과 같이 Swap Partition을 삭제하거나 아예 만들지 않은 경우에도 Swap 공간이 필요한 경우가 생길 수 있습니다.

이 때는 Swap Partition을 다시 새로 만드는 것보다 Swap File을 사용하는 것이 추가 및 삭제가 용이하고, 크기도 쉽게 변경할 수 있기 때문에 더 편리합니다.2

Swap File을 생성하기 위해서는 다음과 같이 입력합니다. (1GiB 크기의 Swap File을 생성하는 경우의 예)

$ sudo dd if=/dev/zero of=/mnt/1GiB.swap bs=1024 count=1048576
$ sudo chmod 600 /mnt/1GiB.swap
$ sudo mkswap /mnt/1GiB.swap
$ sudo swapon /mnt/1GiB.swap

위의 명령에서 첫번째 dd 명령은 Swap을 위해 사용할 File을 생성하는 명령입니다. 1GiB보다 큰 Swap File을 생성하려면 count 다음에 Byte단위로 크기를 입력해야 합니다.

mkswap은 생성한 File을 Swap File로 만드는 명령이고, swapon은 이 Swap File을 Swap 공간으로 사용하도록 설정합니다.

Gnome System Monitor

Gnome System Monitor(시스템 감시)로 확인해 보면, 위의 그림과 같이 1GiB 만큼의 Swap이 설정되어 있는 것을 확인할 수 있습니다.

생성한 Swap File을 Rebooting 시에도 계속 사용하고 싶다면 아래와 같이 입력하면 됩니다. (위에서 생성한 1GiB.swap을 사용하는 경우의 예)

$ sudo vi /etc/fstab

/mnt/1GiB.swap none swap sw 0 0

그리고 사용하고 있는 Swap File을 제거하고 싶다면, 다음과 같이 입력하면 됩니다.

$ sudo swapoff /mnt/1GiB.swap
$ sudo rm -f /mnt/1GiB.swap
$ sudo vi /etc/fstab

/mnt/1GiB.swap  none  swap  sw  0 0
(이 내용을 삭제 후 저장)

4.2 Kernel Option 설정

여유 Memory가 충분하다면, Kernel이 Swap을 가급적 사용하지 않도록 설정하고 VFS Caching을 통해 I/O의 반응성을 높이도록 설정할 수 있습니다. 다음과 같이 Terminal에서 입력합니다.

$ sudo vi /etc/sysctl.d/60-swap.conf

vm.swappiness = 1
vm.vfs_cache_pressure = 50

$ sudo sysctl --system

4.3 /tmp to RAM

과거의 DOS 시절에 System의 성능을 높이기 위해서 RAM Drive를 사용한 것과 유사한 방법으로, 임시적으로 사용하는 File뜰이 모여있는 /tmp를 Ram에 저장하여 System의 성능을 높이고 SSD에 불필요한 I/O를 줄여 수명을 늘릴 수 있습니다.

설정을 위해서는 Terminal에서 다음과 같이 입력합니다.

$ sudo vi /etc/fstab

# Move /tmp to RAM
tmpfs /tmp tmpfs defaults,nosuid 0 0

저장한 후, Rebooting하면 /tmp의 모든 내용은 RAM에 저장됩니다. 그리고 /tmp의 크기는 실제 RAM의 절반 정도의 크기가 설정됩니다. 물론 그 정도 까지 사용 가능하다는 이야기고 실제로 그 만큼 Memory를 차지하고 있는 것은 아닙니다.

그리고 당연한 이야기지만, /tmp에 저장된 내용은 Rebooting하면 모두 사라집니다.

4.3.1 RAM에 Browser Cache를 저장하는 방법

Ram에 저장하는 /tmp를 이용하는 방법 중 하나는, 빈번한 쓰기 동작이 일어나는 Web Browser Cache를 /tmp에 저장하는 것입니다.

Cache를 RAM에 저장하면, Caching된 Web Page의 Rendering Speed가 증가하기 때문에 훨씬 쾌적하게 Web Surfing을 즐길 수 있습니다.

각 Browser마다 Cache Directory가 다르기 때문에, Firefox와 Chrome의 경우에 맞춰서 설정하는 방법을 적어 봅니다. (bar라는 Group에 속한 foo 계정을 위한 Browser Cache Directory를 설정하는 예)

  • Firefox3: 다음과 같이 Terminal에서 입력하여 Boot 시에 자동으로 Cache Directory를 /tmp에 생성하도록 설정합니다.
$ sudo vi /etc/rc.local

# Browser cache dir
mkdir /tmp/foo/cache/firefox -p
chown foo:bar /tmp/foo -R
chmod 700 /tmp/foo -R

$ rm -rf ~/.cache/mozilla/firefox/

Firefox - about:config

그리고 Firefox를 실행한 다음, Location Bar에 about:config이라고 입력하고 Enter를 누르면 위와 같은 화면이 표시됩니다. 고급 기능 사용 동의를 눌러 진행합니다.

Firefox - create a new key

List에서 Mouse 오른쪽 Button을 Click한 후, 새로 만들기 > 문자열을 Click합니다.

Firefox - Enter Key Name

환경 설정 이름에는 위의 그림과 같이 browser.cache.disk.parent_directory를 입력합니다.

Firefox - Enter /tmp path

문자열 값에는 방금 전 생성한 /tmp의 Cache Directory의 경로를 입력하면 됩니다. (위의 그림은 foo계정의 예)

  • Chrome: 다음과 같이 Boot시에 Cache Directory를 생성하도록 설정한 다음, Cache Directory를 Symbolic Link해 주면 됩니다.
$ sudo vi /etc/rc.local

# Browser cache dir
mkdir /tmp/foo/cache/chrome -p
chown foo:bar /tmp/foo -R
chmod 700 /tmp/foo -R

$ rm -rf ~/.cache/google-chrome
$ ln -sf /tmp/foo/cache/chrome ~/.cache/google-chrome

Tested Environments

  • Ubuntu 15.10: util-linux 2.26.2, gparted 0.19.0, firefox 42.0, google-chrome-stable 46.0

References