71 번 글: [미완성][sendmail] 멀티큐 사용으로 ext2 부하량 줄이기 |
글쓴이: 산이
[홈페이지]
|
글쓴날: 2003년 11월 14일 23:14:56 금(저녁) |
조회: 5283 |
9 KB(9,632 Bytes)
|
파일명: mqueue.txt
|
[sendmail] 멀티큐 사용으로 ext2 부하량 줄이기
- 작성자 : 김칠봉 <san2(at)linuxchannel.net>
- 작성일 : 2002.11.30
- 분 류 : 시스템관리(SE)
- 수 준 : 초중급이상
- 내 용 : ext2 파일시스템에서
sendmail의 멀티 큐 설정
- 키워드 : mqueue, sendmail, multi queue, ext2
*주)
이 문서의 최신 내용은 다음 URL에서 찾을 수 있습니다.
- http://linuxchannel.net/docs/sendmail-mqueue.txt
=====================================================
1. 배경
2. 멀티큐 설정
3. 멀티큐 설정 이전에 남아 있는 메일큐 처리
4. sendmail을 이용한 중대형 메일 처리(개요)
5. 기타
=====================================================
1. 배경
저널링 파일 시스템(ext3, xfs, reiserfs, ...)이 아닌 ext2 파일
시스템에서는 다음과 같은 문제점이 있습니다.
즉,
하나의 디렉토리에 파일 개수가 1000~3000개 이상 존재하고
해당 파일을 읽기/쓰기를 시도할 경우 시스템에 아주 극심한
CPU 사용으로 전체 시스템 부하량이 증가하는 현상이 있습니다.
시스템 사양에 따라서 파일 개수한계가 다를 수 있지만
보통 1000~3000개 이상이면 ext2 파일시스템에서는
엄청난 부하량이 증가합니다.
실제로 RH7.2/2.4.18, ext2 파일시스템으로
H/W는 막강한 시스템
사양임에도 불구하고,
sendmail의 큐디렉토리를 하나로 지정했을 경우,
CPU 사용량이 2개 모두 각각 항상 90~95% 이상을 점유하더군요
사용자가 몇십만명 이상되는 중대형 메일서버 용도인데 역시
ext2의
한계로 판명되더군요.
요즈음은 스팸메일 때문에 때아닌 메일서버가 몸살(?)을 앓고
있는것이 현실입니다.
2. 멀티큐 설정
자신이 관리하고 있는 메일서버가 ext2 파일시스템이고,
매우 바쁜 메일서버 용도로 사용되고 있다면
sendmail의 경우 큐디렉토리를 가능한 다음과 같이
멀티큐로 지정해 주면 CPU 사용량이 뚝 떨어집니다.
(경험한 바로는 90%에서 20~30% 정도로)
멀티큐 지원은 sendmail 8.10 이상부터 지원합니다.
(패키지마다 다를 수 있으므로 확인요망)
/etc/mail/sendmail.cf -----------------------
....
# queue directory
O QueueDirectory=/var/spool/mqueue/*
....
---------------------------------------------
예)
# mkdir /var/spool/mqueue/{1,2,3,4,5,6,7,8,9}
# chown root.mail /var/spool/mqueue/{1,2,3,4,5,6,7,8,9}
반드시 위와 같이 설정하지는 않습니다.
예를들어,
O QueueDirectory=/var/spool/mqueue/q*
이와 같이 설정했다면,
# mkdir /var/spool/mqueue/{q1,q2,q3,q4,q5,q6}
와 같이 디렉토리를 만들면 됩니다.
자신이 원하는 방향으로 디렉토리 개수와 디렉토리 이름을
만들어 주면 됩니다.
최소한 5개 이상 정도로 너무 많은 디렉토리를 설정해 주면
오히려 역효과가 있으므로 5~10 정도(권장) 또는 5~20개
정도가 적당합니다.
멀티큐의 장점은 랜덤하게 큐디렉토리를 접근하여
파일을 읽기/쓰기 때문에 하나의 디렉토리에 많은 파일처리로
인한
시스템 부하를 감소할 수 있습니다.
3. 멀티큐 설정 이전에 남아 있는 메일큐 처리
멀티큐 디렉토리를 설정하기 전에
기존의 메일큐를 가능한 모두 처리해주어야 합니다.
만약 아직 처리되지 않은 메일큐가 남아 있다면,
100~500개 단위 정도로 묶어서 각각의 디렉토리 안에서
처리하는 것이 좋습니다.
하나의 디렉토리에서 처리해도 상관없지만
ext2 파일 시스템에서는 부하가 예상되므로 다음과 같이
여러개의 디렉토리로 분산하여 메일 큐를 처리하는 방법을
권장합니다.
예를 들어 아직 남아 있는 메일큐가 1000개가 넘는다면
300개 정도의 단위로 임시 디렉토리를 만듭니다.
* 임시 디렉토리 개수 = (int)남은_메일큐_개수/300
+ 1
만약 '임시 디렉토리 개수'가 4개 이면,
# mkdir -p /var/spool/mqueue_tmp/{1,2,3,4}
# chown root.mail -R /var/spool/mqueue_tmp
이와 같이 디렉토리를 만듭니다.
이제 남아 있는 메일 큐를 쌍으로(메일 큐는 쌍으로 되어있음)
각각의 디렉토리를 분산시켜 다음과 sendmail 을 하나 더
실행합니다.
예)
# /usr/sbin/sendmail -bD -q30s \
-ODeliveryMode=queueonly \
-OQueueDirectory=/var/spool/mqueue_tmp/* \
-ODaemonPortOptions=Addr=localhost,Port=2525
만약 백그라운드로 계속 실행하기를 원한다면
-bD 대신 -bd 옵션을 사용하세요.
-ODaemonPortOptions=Addr=localhost,Port=2525
이 옵션은 오직 localhost에서 만 2525번 포트를 열어서
sendmail이 1분(1m) 간격으로 메일 큐를 처리하도록 하는
옵션입니다.
Port 키 지정은 `netstat -atn`의 결과에서 아직 사용하지 않는
포트로 지정해야 합니다. 만약 기존의 사용하던 포트(예:25)를
지정하면
451 4.0.0 opendaemonsocket: daemon Daemon0: cannot bind: Address already in use
이와 같은 에러를 내므로 반드시 현재 사용하지 않는 포트를
사용해야
합니다.
또한 Addr 키 설정을 localhost가 아닌 다른 호스트나 이 키를
아예 설정하지 않으면 다른 MTA 또는 MUA에서 RELAY가 가능하므로
(예를 들어 방화벽 안쪽에서 sendmail RELAY 운영 가능)
이 경우는 'lcoalhost'로 설정하는 것이 바람직합니다.
4. sendmail을 이용한 중대형 메일 처리(개요)
실제로 중대형 메일서버에서 sendmail을 사용할 경우,
메일데몬을 하나가 아닌 여러개(2개 이상)의 멀티데몬을
이용해서 하나는 defered 모드로 설정하여 메일을 큐에
쌓도록 하고 나머지 메일데몬(들)은
메일큐을 처리하는
방법을 택하더군요.
멀티데몬을 사용할 경우 최대 메일처리량과 기타 시스템
설계와 설정이 필수적으로 따로 오는데 sendmail 쪽에서는
다음과
같은 방법으로 멀티데몬을 이용합니다.
예를 들어, 다음과 같이 여러개의 sendmail 데몬을 띄어
각각 deferred 모드, 1차 메일큐 처리, 2차 메일큐 처리등으로
분담하는 방법을 말합니다.
# /usr/sbin/sendmail -bd \
-ODeliveryMode=deferred \
-OQueueDirectory=/var/spool/mqueue/*
#
# /usr/sbin/sendmail -bd -q10s \
-ODeliveryMode=queueonly \
-OMaxDaemonChildren=128 \
-OQueueDirectory=/var/spool/mqueue/* \
-ODaemonPortOptions=Addr=localhost,Port=2525
#
# /usr/sbin/sendmail -bd -q10m \
-ODeliveryMode=queueonly \
-OMaxDaemonChildren=64 \
-OQueueDirectory=/var/spool/mqueue2/* \
-ODaemonPortOptions=Addr=localhost,Port=2526
#
/var/spool/mqueue2/* 멀티큐 디렉토리는 /var/spool/mqueue/* 멀티큐
디렉토리에서 처리되지 못한 메일(예를 들어 원격의
메일서버가
다운되거나 불분명한 메일 주소로 미처 처리되지 못한 메일)을
다른
toools을 이용하여 강제적으로 /var/spool/mqueue2/* 로 이동했을
경우를 말합니다.
이와 같이 오래된 메일큐를 다른 큐디렉토리로 이동해야만 할
경우는
sendmail 소스디렉토리에서
re-mqueue.pl 툴을 사용합니다.
즉, re-mqueue.pl 을 일정시간 간격으로(crond 이용) 실행해 놓은
상태에서 앞의 세번째의 sendmail 이 처리하도록 방법입니다.
re-mqueue.pl 툴은 sendmail 소스를 직접 풀어서 contrib 디렉토리에서
찾든지 다음의 URL에서도 찾을 수 있습니다.
- http://openbsd.secsup.org/src/gnu/usr.sbin/sendmail/contrib/
실제로 sendmail을 중대형 메일서버로 운영할 경우
멀티큐 설정 외에 메일큐 처리에 관한 설정, 그리고 시스템
퍼포먼스와 관련된
다른 설정도 필수적입니다.
예)
# maximum hop count
#O MaxHopCount=17
# name resolver options
#O ResolverOptions=+AAONLY
# open connection cache size
O ConnectionCacheSize=2
# open connection cache timeout
O ConnectionCacheTimeout=5m
# slope of queue-only function
#O QueueFactor=600000
# time out
O Timeout.xxx=yyy
# load average at which we just queue messages
#O QueueLA=8
# load average at which we refuse connections
#O RefuseLA=12
# maximum number of children we allow at one time
#O MaxDaemonChildren=12
# maximum number of new connections per second
#O ConnectionRateThrottle=3
# how many jobs can you process in the queue?
#O MaxQueueRunSize=10000
# maximum number of recipients per SMTP envelope
#O MaxRecipientsPerMessage=100
# work recipient factor
#O RecipientFactor=30000
# minimum time in queue before retry
#O MinQueueAge=30m
# Data file (df) memory-buffer file maximum size
#O DataFileBufferSize=4096
# Transcript file (xf) memory-buffer file maximum size
#O XscriptFileBufferSize=4096
최대 메일처리량에 따라서 다름
echo 8192 >/proc/sys/fs/file-max
echo 24576 >/proc/sys/fs/inode-max
그외에도 시스템로그/메일로그에
대한 logrotate 설정도 필수적입니다.
5. 기타
중대형 메일서버로 운영할 경우라면,
가능한 ext2가 아닌 저널링 파일시스템 사용과
sendmail이 아닌 다른 MTA를 사용하는것이 더 유리한
방안이 되겠군요.
|
|
from 61.254.75.40
JS(Redhands)Board 0.4 +@
|
|