사이트 내 전체검색
[linux] 리눅스 서버 최적화 테크닉 키우기 3
로빈아빠
https://cmd.kr/server/176 URL이 복사되었습니다.

본문

리눅스 서버 최적화 테크닉 키우기 3

인터넷 서버와 라우터로서 리눅스 최적화 (1)

파일/프린트 서버나 데이터베이스 서버 등 특정 서비스용 운영체제로서 리눅스를
안정적이고 효율적으로 사용하려면 최적화가 필수적이다. 커널과 애플리케이션
재컴파일 기법을 통한 리눅스 최적화 기법에서 벗어나 이번호에서는 기능 설정을 통해
효율적이면서도 높은 성능을 제공하는 리눅스 시스템 운영 방법을 소개한다.

이상호 성균관대학교 산업용 네트워크 연구실

연재 순서
1회(2000. 07): 리눅스 커널 이해와 최적화를 위한 컴파일러 설정
2회(2000. 08): 커널 설정시 선택 사항과 애플리케이션 최적화
3회(2000. 09): 인터넷 서버와 라우터로서 리눅스 최적화(1)
4회: 인터넷 서버와 라우터로서 리눅스 최적화 방법(2)


--------------------------------------------------------------------------------

리눅스가 데스크톱 분야로 대중화의 길을 모색하고는 있지만 아직 인터넷 서버용이나
네트워크 서버용으로 사용되는 게 일반적이다. 웹 서버와 데이터베이스 서버, 그리고
메일 서버, 파일 백업용 서버 등이 인터넷 서버에 해당되며, 웹 캐시, 파이어월, 로드
밸런싱, 라우터 서버 등이 네트워크 서버에 속한다. 이들 장치에서 공통적으로
요구하는 특징은 안정성과 효율성이다. 안정성은 말 그대로 오류없이 지속적으로
서비스할 수 있느냐의 문제이고, 효율성은 운영의 편의성과 확장성을 제공할 수
있는지 여부의 문제다. 리눅스는 이런 조건을 만족시키고 있어 사용이 날로 증가하고
있다.

특정 서비스용 운영체제로서 리눅스를 안정적이고 효율적으로 운영하려면 최적화가
따라야 한다. 이전까지는 커널과 애플리케이션 재컴파일 기법을 중심으로 리눅스
최적화를 설명했다. 이번에는 기능 설정을 통해 효율적이면서도 높은 성능을 제공하는
리눅스 시스템 운영방법을 소개한다. 우선 이에 따른 공통적인 최적화 기법을 먼저
설명한다.

가상 메모리 관련 최적화

가상 메모리(Virtual Memory, VM) 기법은 기억장치 관리에 있어 멀티 태스킹을
지원하기 위한 가장 기본적인 부분이다. VM은 하나의 프로그램이 실행될 때 프로그램
전체가 메모리에서 실행되지 않고 현재 실행에 필요한 부분만을 불러와 실행하는
기법을 기본으로 하며, 데이터 파일도 비슷한 방법으로 관리된다. 즉, 특정 데이터에
접근하기 위해 해당 파일 전체를 메모리로 불러들이지 않고 특정 부분만을 읽어와
메모리를 절약할 수 있다.

일반적으로 파일은 가상으로 분할돼 있는데 한 번 접근시 이미 분할된 부분을
한꺼번에 메모리로 읽어온다. 필요한 부분만 정확히 읽어오면 되겠지만, 이렇게
하려면 시간이 많이 걸리므로 미리 파일들을 분할해 메모리로 읽어들이기 편하게
만들어 놓는다. 이는 하드 디스크를 섹터 단위로 나눠 쓰는 원리와 비슷하다. 분할된
각 부분을 보통 블럭이라 하며, 보통 512∼4KB 크기로 나누어 놓는다. 각 나뉜 블럭의
크기가 일정한 것을 페이징(paging) 기법이라 하며, 일정하지 않는 것을
세그멘테이션(segmentation) 기법이라 한다. 즉, VM 기법은 하드 디스크 등의 블럭
디바이스에 관련한 입출력을 관리하는 기법이라 생각할 수도 있다. 동시에 처리할 수
있는 태스크 수와 효율은 VM의 동작에 따라 좌우되는데, 먼저 살펴볼 내용은
bdflush의 동작 설정이다.

bdflush

bdflush는 블럭 디바이스 입출력 버퍼를 관리하는 커널 데몬이다. 주로 버퍼를 비우는
중대한 일을 맡고 있다. 하드 디스크에 쓰여질 데이터는 바로 하드 디스크로 전달되지
않고 버퍼에 저장됐다가 전달된다. 이는 하드 디스크를 제어하는데 많은 자원을
소모하므로 버퍼에 쓸 내용을 모았다가 버퍼의 상태 또는 특정 시간마다 하드
디스크에 써넣기 위한 것이다. bdflush는 이때의 버퍼 관리를 한다. bdflush의 동작
설정은 래드햇 6.2부터 약간 바뀌었는데 우선 6.1까지는 /proc/sys/vm/bdflush에
설정값을 직접 전달하거나 /etc/rc.d/rc.local에 스크립트를 만들어줘야 했다.
6.2에서는 /etc/sysctl.conf 파일에서 설정을 바꿔주는 형태로 바뀌었다.

bdflush의 설정값은 9개의 필드로 구성되며, 기본적으로 ‘40 500 64 256 500 3000
500 1884 2’로 돼 있는데 이게 어떤 값을 가리키는지 궁금할 것이다. 우선 각 필드가
나타내는 값의 의미를 살펴보자.

nfract

9개의 필드로 구성된 bdflush의 설정값 중 가장 앞에 나오는 40은 전체 버퍼 캐시의
더티 버퍼(dirty buffer) 비율을 나타낸다. 여기서 ‘더티’는 주로 버퍼에서 비워질
내용을 말하는데, 즉 프로세스에서 모디파이돼 하드 디스크에 쓰여질 데이터를
의미한다. 버퍼에서 하드 디스크에 쓸 내용이 담긴 버퍼를 더티 버퍼라 한다. 쉽게
말해 하드 디스크에 쓰여질 데이터를 저장한 버퍼다. 40으로 설정됐다면 전체 버퍼
캐시의 더티 버퍼 크기가 40% 이하가 되게 한다. 40%가 되면 더티 버퍼의 내용을 하드
디스크에 기록하고 버퍼를 비우기 위한 시도를 한다. 값이 클수록 하드 디스크에
쓰여질 데이터는 오래 기다리며, 값이 작을 경우 하드 디스크로의 접근이 빈번해 전체
시스템의 수행 속도가 느려질 수 있다.

ndirty

두 번째 값인 500은 하드 디스크에 한번에 기록하는 버퍼의 크기를 나타낸다. 500으로
설정돼 있으므로 한번 하드 디스크에 기록을 할 때 500개의 더티 버퍼가 사라진다. 이
값 또한 작을수록 하드 디스크로의 접근이 빈번하게 일어난다.

nrefill

세 번째 값은 사용하지 않는 버퍼들의 리스트 작성에 사용한다. 64로 돼 있는데 이는
한번에 64개의 빈 버퍼를 만들라는 것이다. 이 값은 클수록 전체 메모리 낭비를
가져오지만 입출력 버퍼가 증가해 하드 디스크 접근 속도를 높일 수 있다.

기타 bdflush 설정 항목

nref_dirt : bdflush가 동작하는 경계를 나타낸다. 기본값이 256인데 더티 버퍼가 256
이상이면 bdflush가 동작한다.
dummy1 : 사용하지 않는 값이다.
age_buffer : 더티 버퍼의 수명을 말한다. 각 더티 버퍼는 생성된 후 최대
age_buffer에 나타난 시간이 지나기 전에 디스크에 기록된다는 의미다.
age_super : supper block의 수명을 나타낸다.
dummy2 : 사용되지 않는 값
dummy3 : 사용되지 않는 값
bdflush의 설정을 “100 1200 128 512 15 5000 500 1884 2”로 바꾸려면 래드햇 6.1
이하에서는 다음과 같이 하면 된다.

[root@maso]# echo “100 1200 128 512 15 5000 500 1884 2”>
/proc/sys/vm/bdflush

부팅시에 변경된 값을 자동으로 적용시키려면 “/etc/rc.d /rc.local” 스크립트에
위에서 사용한 명령어를 추가시키면 된다. 래드햇 6.2에서는
“/etc/systcl.conf”에서 vm.flush의 값을 다음과 같이 수정한다.

vm.bdflush = 100 1200 128 512 15 5000 500 1884 2

buffermem

buffermem은 전체 메모리에서 버퍼로 사용할 수 있는 양을 제어하는 파일이다.
bufermem의 설정값은 min_percent, borrow_ percent, max_percent로 이뤄졌으나
min_percent만 사용하며, 나머지 두 값은 사용하지 않는다. min_percent 값은 전체
메모리에서 버퍼로 사용할 수 있는 최소량을 %로 표시한다. 일반적으로 buffermem
값은 ‘80 10 60’으로 설정돼 있다. 설정을 바꾸는 방법은 bdflush의 경우와 같다.
래드햇 6.1 이하에서는 다음과 같이 한다.

[root@maso]# echo “80 10 60”>/proc/sys/vm/buffermem

래드햇 6.2에서는 “/etc/systcl.conf”의 vm.buffermem의 값을 다음과 같이 바꾼다.

vm.buffermen = 80 10 60

새로 설정된 값을 적용하기 위해서는 재부팅이 일반적이지만, inetd 관련 프로세스만
새롭게 다시 시작시켜줘도 된다.

[root@maso]#/etc/rc.d/init.d/network restart

파일 접근 관련 최적화

file-max

file-max 값은 리눅스에서 한 번에 운용할 수 있는 파일 수를 지정하는 것으로, 보통
4MB 메모리당 256개의 파일을 한 번에 운용할 수 있다. 메모리 128MB를 탑재한
시스템의 경우 8192라고 생각할 수 있다. 리눅스에서 기본값은 4096이다. 설정을
바꾸는 방법은 앞과 같으며 래드햇 6.1이하에서는 다음과 같이 한다.

[root@maso]# echo “8192” > /proc/sys/fs/file-max

래드햇 6.2에서는 “/etc/sysctl.conf”의 fs.file-max의 값을 다음과 같이 바꾸면
된다.

fs.file-max = 8192

inode-max

inode-max는 관리할 수 있는 최대 inode 수를 나타내며, 한 번에 열 수 있는 최대
inode 수라 생각할 수 있다. file-max의 경우와 유사하며, 기본값은 8192다. 보통 이
값의 4배 정도를 설정값으로 사용한다. 설정 변경은 래드햇 6.1 이하에서는 다음과
같이 한다.

[root@maso]# echo “32768” > /proc/sys/fs/inode-max

래드햇 6.2에서는 “/etc/sysctl.conf”의 fs.inode의 값을 다음과 같이 바꾸면
된다.

fs.inode-max = 32768

앞서와 마찬가지로 /etc/rc.d/init.d/network를 이용해 재부팅해 주면 새로운 설정
사항이 적용된다.

하드 디스크 제어 관련 최적화

hdparm

hdparm은 하드 디스크에 대한 설정값을 관리하는 명령어다. 먼저 다음과 같이 입력해
첫 번째 하드 디스크의 설정 상태를 살펴보자.

[root@maso]#/sbin/hdparm -i /dev/hda

그러면 다음과 같은 형태로 출력될 것이다.

/dev/hda:

Model=QUANTUM FIREBALLlct10 15, FwRev=A03.0900, SerialNo=173934510981
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
RawCHS=16383/16/63, TrkSize=32256, SectSize=21298, ECCbytes=4
BuffType=3(DualPortCache), BuffSize=418kB, MaxMultSect=16,
MultSect=16
DblWordIO=no, OldPIO=2, DMA=yes, OldDMA=2
CurCHS=16383/16/63, CurSects=-66060037, LBA=yes, LBAsects=29336832
tDMA={min:120,rec:120}, DMA modes: mword0 mword1 mword2
IORDY=on/off, tPIO={min:120,w/IORDY:120}, PIO modes: mode3 mode4
UDMA modes: mode0 mode1 mode2 mode3 *mode4

독자들의 하드 디스크와 마더보드의 칩셋 기능을 참고해 최적화할 수도 있다. 만약
마더보드와 하드 디스크에서 Ultra DMA를 지원한다면 다음과 같이 입력해 UltraDMA
기능을 사용할 수 있다.

[root@maso]#/sbin/hdparm -d 1 -X66 /dev/hda

hdparm의 -t 옵션은 설정을 바꿨을 때 테스트하기 위한 옵션이다. 다음과 같이 입력해
하드 디스크의 성능을 테스트할 수 있다.

[root@maso]#/sbin/hdparm -t /dev/hda

각자의 시스템에 맞게 하드 디스크 동작을 최적화하기 위해서는 hdparm의 매뉴얼과
마더보드, 하드 디스크의 매뉴얼을 자세히 읽어봐야 한다.

프로세스 사용 관련 최적화

ulimit

사용자별 프로세스(태스크)와 사용 파일 수의 제한을 결정할 수 있는 ulimit이 있는데
먼저 프롬프트에서 다음과 같이 입력해 보자.

[root@maso]# ulimit -a

그러면 다음과 같은 결과가 출력될 것이다.

core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory    (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
stack size (kbytes, -s) 8192
cpu time (seconds ,-t) unlimited
max user processes (-u) 256
pipe size (512 bytes, -p) 8
open files (-n)1024
virtual memory (kbytes, -v) 2105343

max user process의 값이 256인 것을 확인할 수 있다. 이 값을 무한대로 바꾸기
위해서는 다음과 같이 한다.

[root@maso]# ulimit -u unlimited

한 사용자가 열 수 있는 파일 수를 바꾸려면 다음과 같이 한다.

[root2maso]# ulimit -n 4096

다시 ulimit -a를 입력하면 변경된 사항을 살펴볼 수 있을 것이다. 설정하려는 값이
항상 적용되기 위해서는 쉘 스크립트(/root/ .bashrc)에 사용한 명령어를 추가시켜
준다.

ip_local_port_range

클라이언트가 서버에 접속할 때, 일반적으로 서버는 포트 번호를 하나씩
할당한다(이에 관해 궁금한 독자는 TCP/IP 네트워크 프로그래밍과 관련된 서적을
참고하기 바란다). 서버에서는 할당할 번호가 많을수록 동시에 많은 클라이언트의
접속을 수용할 수 있다.

실제 httpd나 ftpd와 같은 네트워크 데몬들은 새로운 프로세스와 포트 번호를 함께
할당함으로써 클라이언트의 접속을 허락한다. 할당 가능한 포트 번호의 범위는
네트워크 데몬들이 생성하는 프로세스의 수와도 관련이 있다. 할당할 수 있는 포트
번호의 범위 설정은 ip_local_port_range이며, 기본적으로 1024부터 4999로 설정돼
있다. 이를 32768에서 61000까지 사용할 수 있도록 하기 위해서는 앞과 같은 방식으로
설정을 바꿀 수 있다.

래드햇 6.1 이하에서는 다음과 같이 한다.

[root@maso]# echo “32768 61000” >

/proc/sys/net/ipv4/ip_local_port_range

래드햇 6.2에서는 “/etc/sysctl.conf” 파일에서 net.ipv4.ip _local_port_range의
값을 다음과 같이 바꾼다.

net.ipv4.ip_local_port_range = 32768 61000

커널 레벨에서의 최적화

지금까지는 커널을 직접 건드리지는 않았다. 실제 커널에서 사용자당 태스크 수를
규정한 부분이 있는데 이 부분을 살펴보자. 먼저
“/usr/src/linux/include/linux/”로 이동해 task.h를 수정한다. task.h의 앞부분에
NR_TASK가 정의돼 있다. NR_TASK에서 사용자당 최대로 사용할 수 있는 프로세스 수를
지정할 수 있다.

#define NR_TASK 512

디폴트가 512로 지정돼 있는데 이를 다음과 같이 2048 또는 3072로 바꿔준다.

#define NR_TASK 3072

이제 NR_TASK_LEFT_FOR_ROOT가 정의된 곳을 찾아보자. 다음과 같이 정의돼 있을
것이다.

#define MIN_TASK_LEFT_FOR_ROOT 4

이는 슈퍼유저를 위해 4개의 프로세스가 작동할 수 있도록 여유를 둔다는 것이다.
사실 4개는 너무 적게 느껴지므로 이를 다음과 같이 20개 이상으로 바꿔준다.

#define MIN_TASK_LEFT_FOR_ROOT 24

지금까지 리눅스를 서버로 활용할 경우 일반적으로 손봐줘야 할 곳을 설명했다. 여기
설명한 것이 모두가 아니며, 최적화한 값을 적용한 것 또한 아님을 염두에 두기
바란다. 이에 대해 좀더 자세히 알고 싶은 독자라면 “/src/linux/Documentation/”에
기록된 사항을 살펴봄으로써 최적화와 관련된 여러 힌트를 얻을 수 있을 것이다.
그리고 LDP(http://metalab.unc.edu/mdw/)의 ‘Securing Optimizing Linux’에는
최적화와 관련된 자료가 잘 설명돼 있으므로 이를 참고하는 것도 좋다. 필자도 이
글을 많이 참고했다.

다음호에서는 마지막으로 네트워크에 관련된 설정 사항과 함께 라우터와 같은
네트워크 부속 장치의 기능과 커널 2.2에 새로 포함된 기능 사용법을 알아보겠다.

필자 연락처 : turtle@ece.skku.ac.kr
정리 : 박세영 andrea@sbmedia.co.kr

댓글목록

등록된 댓글이 없습니다.

1,139 (15/23P)

Search

Copyright © Cmd 명령어 3.149.239.79