로그인

검색

Server
2011.07.08 21:07

리눅스에서 SSD 최적화

조회 수 21245 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 게시글 수정 내역 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 게시글 수정 내역 댓글로 가기 인쇄


리눅스에서 SSD 세부조정


1. 파일시스템 선택 - 저널링없는 ext4

오래된 SSD+Linux 가이드는, 드라이브의 수명을 늘리기 위해서 ext3/ext4 같은 저널링 파일 시스템의 쓰기 낭비를 피하는, ext2 파일 시스템을 추천한다. TRIM 지원이 나타나면서 ext2는 최고의 선택이 아니게 되었다. TRIM 명령은 ext2 파일시스템에서 돌아가지만, 두개의 단점이 있다.

1. Ext2는 오프라인 TRIM만을 지원한다 - 다시 말하면, 파일시스템을 읽기전용으로 마운트해야한다.
2. hdprm 이나 hdprm의 랩퍼 스크립트인 wiper.sh 을 사용해서 TRIM 명령어를 직접 실행해야한다.

ext4 파일시스템은 이러한 제한이 없다. ext4 파일시스템에서 저널링 기능을 끌수있게 되면서 ext2 보다 더 나은 선택이 되었다. 저널이 없는 파일시스템은 깨끗이 언마운트되지 않으면(예를 들어, 전원이 갑자기 나갔을 경우) 데이터 손실이 더 쉽다는걸 확실히 알아야 한다. 하지만 이 글을 읽은 이후에는, 드라이브의 수명을 늘리기 위한 기회를 얻을 수 있을 것이다.

ext4의 저널을 어떻게 끌 것인가? 첫번째, 저널의 제거는 파일시스템이 마운트된 상태에서는 할 수 없다. 운영체제가 포함된 드라이브의 저널을 끄려면, 다른 드라이브로 부팅하는게 필요하다. 난 Arch Linux를 사용하고, 우분투 라이브 CD 같은 Arch 인스톨 디스크로 작업했다. 파일시스템 변경 툴의 필요성이 표준 이슈가 되면서, 여러 리눅스 라이브 배포판으로 작업 가능하게 되었다.

다른 디스크로 부팅 했으면, 터미널을 열고 루트 권한을 얻거나 sudo를 사용해 명령어를 입력해라. 저널을 제거하기를 원하는 ext4 파티션이 /dev/sda1 이라고 가정하고, 아래에 따라 작업한다.
명령어:
tune2fs -O ^has_journal /dev/sda1
그리고 나서 파일시스템 검사를 돌리는게 좋다.
e2fsck -f /dev/sda1
두 번째 단계를 완료 하지 않으면 파일 시스템이 마운트 되지 않는다는 보고를 몇개 봤다. 그러니까 건너띄지 말자. 여러분은 SSD를 가지고 있고, fsck는 진짜로 빠르게 진행된다.
컴퓨터를 재시작하고, 저널이 꺼진 ext4 파티션이 포함된 SSD로 부팅하자. 터미널을 열고 실행해라
dmesg | grep EXT4
모든게 잘 됐다면 부팅 과정에서 아래 메시지를 보게 될거다.
EXT4-fs(sda1): mounted filesystem without journal
예전처럼 저널을 추가하고 싶으면, 위 단계를 실행해라. 단, tune2fs 명령에서 caret(^) 을 빼고 나서.

2. TRIM 지원 켜기

TRIM 지원이 없으면, SSD는 결국 엄청 느려질 꺼다. 근본 원인은 SSD가 쓰는 것보다 더 큰 블록 데이터를 지운다는 사실이다. TRIM없이 데이터를 지웠을때, 드라이브 펌웨어는 캐쉬로 전체 블록을 복사하고, 전체 블락을 지우고, 삭제된 데이터를 뺀 캐쉬의 내용을 쓴다. - 블록의 모든 데이터가 파일시스템에서 지워졌다고 표시가 되어있더라도 말이다. TRIM이 있다면, 운영체제는 블록이 파일시스템에서 삭제 된 시점에, free로 표시됐다고 드라이브에게 전달할 수 있다. SSD는 TRIM 지원 펌웨어 발표를 시작할꺼고, 리눅스 커널은 2.6.33 부터 TRIM 지원을 추가하기 시작했다.

처음에 실행중인 커널이 TRIM 지원을 하는지 확인하자. 다음을 실행해라
uname -a
커널 버전 숫자를 봐라. 2.6.33 이거나 더 높으면 커널은 TRIM을 지원할꺼다. 어떤 배포판은 *어쩌면* TRIM 코드를 이전 커널에 집어넣을 수도 있지만, 그런 거까지 조사해본 적은 없다.
다음은, hdparm 명령을 사용해 드라이브가 TRIM을 지원하는지 확인해라. SSD가 /dev/sda1이라고 가정하고 명령어를 넣는다.
hdparm -I /dev/sda
드라이브 기능 목록이 출력될꺼다. 드라이브에서 기능이 지원되는 걸 표시하기위해 * 가 같이 나온다. TRIM이 지원되면 아래줄처럼 보일꺼다.
* Data Set Management TRIM supported
(줄의 시작에 * 표시를 확인해라. 기능을 지원한다는 뜻이다.)
커널과 드라이브가 TRIM을 지원한다고 가정하고, 위에 설명한 ext4 파일 시스템을 사용중이면 /etc/fstab 파일에 “discard” 옵션을 추가하는 걸로 켤 수 있다. ext4 파일시스템을 사용중인 줄을 보고 바꿔라.
이거에서:
/dev/sda1 / ext4 defaults
이걸로:
/dev/sda1 / ext4 discard,defaults
물론, 파티션하고 마운트 지점하고 기존 옵션은 다를꺼다. 요점은 “discard” 옵션을 네번째 행에다가 추가하는 거다. 새로 수정한 fstab파일을 테스트하려면, 루트 권한으로 실행해라:
mount -oremount /dev/sda1
그리고 실행해라
mount
그러면 마운트된 모든 파일시스템이 옵션이랑 같이 보일꺼다. 위의 예제를 사용하면, 작업 중에 알게 된 “discard”옵션을 찾게 된다.
/dev/sda1 on / type ext4 (rw,discard)

3. 스왑을 위해 무엇을 할 것인가

스왑 공간은 SSD를 사용할 때, 미묘한 문제가 있다. 평균 시스텝의 메모리가 수기가 바이트가 되면서 스왑의 필요성이 감소했다. 예로, 난 2GB 메모리를 가지고 여러 가상머신을 돌리고, 기본적인 웹브라우징과 ssh 세션으로도 다 쓰지 못한다. 하지만 여러분의 컴퓨터가 최대절전모드를 사용한다면, 스왑공간은 적어도 시스템의 메모리보다 같아야 한다. 최대 절전모드 중에는 메모리의 내용을 스왑공간에 보관하기 때문이다.

스왑 공간을 가지고 있다면, 시스템의 “swappiness” 파라미터를 변경하는걸 추천한다. Swappiness는 0부터 100까지 숫자이며, 리눅스가 메모리에서 디스크의 스왑 공간으로 데이터를 얼마나 적극적으로 이동 시키는 지를 나타낸다. 숫자가 높으면, 시스템이 메모리 부족시에 스왑으로 이동하는 것을 더욱 선호한다.

현재 swappiness 설정을 보려면,
/proc/sys/vm/swappiness 파일의 내용을 보면 된다.
cat /proc/sys/vm/swappiness
SSD를 사용할때, 나는 swappiness를 항상 1로 설정했다. 스왑공간이 있지만, 가장 까다로운 상황을 빼고는 절대 사용하지 않을것이다. 다시말하면, 이것은 쓰기 회수를 줄여 디스크의 수명을 늘이자는 것이다. swappiness 값을 변경하려면
/etc/rc.local 파일에 아래 줄을 추가해라.
echo 1 > /proc/sys/vm/swappiness
/etc/rc.local 은 시스템 시작시, 다른 모든 초기화 스크립트가 실행된 후에 실행되는 파일이며, 다른 초기화 스크립트 안에 적용되지 않는 최적화를 위해 관리자가 사용하는 것이다.

다른 최적화들...

나머지 팁들은 여러 사이트에 돌아다니는 것들이다. 내 경우엔 잘 작동해서 추가한다.

4. noatime 옵션을 가지고 파일시스템을 마운트하자.

스텝2에서 /etc/fstab 에 “discard” 옵션을 추가한것 처럼, “noatime”옵션을 추가하면 된다. “noatime”을 사용하는 것은, 리눅스가 파일과 디렉토리에 마지막 접근 시간을 갱신하는 것을 막기 위해서다. 드라이브의 수명을 늘리기 위해 쓰기 회수를 줄이고, 약간의 성능 향상도 가져온다. 2단계에서 작업한 것과 같은 파티션을 사용 중이면, /etc/fstab의 그 줄을
이거에서
/dev/sda1 / ext4 discard,defaults
이걸로 바꾸자.
/dev/sda1 / ext4 noatime,discard,defaults
2단계와 같은 방법으로 fstab파일을 테스트해라. mount 명령어와 -oremount 옵션을 사용한걸 기억하자.
참고: ext2, ext3, ext4 파일시스템에서도 “noatime”옵션 사용이 가능하다.

5. noop 디스크 스케줄러를 사용하자

리눅스는, 디스크를 다루기 위해 읽기 순서와 쓰기 요청을 결정할 책임이 있는 ,몇가지 다른 디스크 스케줄러를 가지고 있다. noop 스케줄러를 사용하는 것은, 리눅스가 데이터들이 디스크의 물리적인 위치 어디에 놓여 있는지를 전혀 고려하지 않고, 받은 순서대로 요청을 처리하는 간단한 방식을 적용하는 걸 의미한다..
시스템이 사용중인 스케줄러를 보려면
/sys/block/sda/queue/scheduler 의 내용을 보면 된다.
cat /sys/block/sda/queue/scheduler
대괄호 안에 있는게 현재 사용중인 스케줄러다.
[noop] deadline cfq
noop 스케줄러를 사용하도록 하려면
/etc/rc.local 파일에 아래 줄을 추가해라.
echo noop > /sys/blocks/sda/queue/scheduler
그건 그렇고, 리눅스에서 적용할 수 있는 다른 스케줄러를 살펴보려면, 리눅스 매거진의 이 기사를 확인해라.

6. 파이어폭스의 캐쉬를 tmpfs로 옮기자.

대부분의 사용자는, 파이어폭스를 사용하는 것이 디스크 활성화의 가장 큰 비율의 원인이 된다. 디스크의 쓰기 회수를 줄이기 위해서, 캐쉬를 tmpfs 파일시스템으로 옮길 수 있다. 브라우저의 캐쉬는 디스크를 거치지 않고, 물리적인 메모리에(RAM) 저장된다. 물론, 리부팅하면 사라지지만, 대부분의 사람은 그것을 신경쓰지 않을 것이다.
tmpfs 파일 시스템을 만들기 위해 /etc/fstab 파일을 한번 더 수정해야 한다. 아래 줄은 시스템의 /tmp 디렉토리를 tmpfs로 변환시킨다.
none /tmp tmpfs defaults 0 0
재부팅 후에, mount 명령어를 사용해서, 수정사항이 아래 줄처럼 작업되었는지 확인해라.
none on /tmp type tmpfs (rw)
tmpfs 가 생성된 것을 확인했다면, 파이어폭스를 열고 주소창에 about:config 를 입력하자. 마우스 오른쪽 버튼을 클릭하고 새로만들기->문자열 을 선택해라. 환경 설정 이름을 “browser.cache.disk.parent_directory” 으로 입력하고, 문자열 값에 "tmp/firefox-cache"를 집어넣자.
*
파이어폭스를 재시작하고 /tmp 디렉토리 안을 살펴보자. 브라우저의 캐쉬가 새로운 위치에 있는지 확인해라.

결론
기존의 하드 드라이브와 SSD 의 기본적인 차이점을 이해하고 있다면, 왜 수정사항이 이치에 맞는지 쉽게 알 수 있다. 추측하자면, 일이년 안에 이런 직접 변경하는 내용은 필요 없을 것이다. SSD는 주류가 될 것이고, 리눅스 배포판들은 여러분들을 위해 미리 설정되어 나올 것이다. 그러나 지금은, 여러분에게 이 가이드가 도움이 되기를 바란다.    



리눅스

유용한 정보 및 자료

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
35 Server 우분투 nginx rewrite 보석 2011.11.03 236029
34 Server Installing Nginx With PHP5 (And PHP-FPM) And MySQL Support On Ubuntu 11.10 1 보석 2011.11.01 26160
33 Server Nginx 가상호스트 설정 1 보석 2011.10.31 28318
32 Server Install Nginx, PHP5, PHP-FPM and MySQL on Ubuntu 11.04 보석 2011.10.31 25592
31 Server 테이블 형태 변경하기 MyISAM -> InnoDB(또는 InnoDB -> MyISAM) 보석 2011.10.21 26418
30 Server 우분투 Memcached 설치는 이렇게 보석 2011.10.19 29266
29 Server 링크하드 리눅스 설치 성공담 - 웹하드 WebHard Linux Install 보석 2011.10.17 27455
28 Server 우분투 PHP5.3 버젼에 ioncube설치하기 보석 2011.10.17 26180
27 Server 리눅스용 무료 웹하드 <shade webhard> 설치하기 file 보석 2011.10.17 36540
26 Server 리눅스 (우분투) vsftp 설치 및 설정 보석 2011.10.17 15596
25 Server CSS Background 속성 보석 2011.10.03 10178
24 Server 우분투 크론 (예약작업) 설정 자동 백업 4 보석 2011.09.01 16325
23 Server [리눅스] 새 계정 만들기/지우기, 사용자 아이디 추가/삭제; Create Account 1 보석 2011.08.31 39620
22 Server 우분투에서 압축하고 풀기( tar, gzip, tar.gz ) 보석 2011.08.31 16168
21 Server 리눅스 파일 복사 및 이동 명령어 사용법 1 보석 2011.08.31 18305
20 Server 리눅스 vsFTP 사용자 계정 홈디렉토리 변경 보석 2011.08.31 20884
19 Server 리눅스 하드디스크 복사-교체 보석 2011.07.26 18170
» Server 리눅스에서 SSD 최적화 보석 2011.07.08 21245
17 Server 우분투 리눅스에서 APM 설치하기 (웹서버 설정) 보석 2011.07.04 33244
16 Server 리눅스 각 폴더별 용량 확인 하기 1 보석 2011.07.04 14455
Board Pagination Prev 1 2 3 4 Next
/ 4