리눅스 설치 및 최적화 삽질예방/Linux2008. 2. 28. 20:41
====================================================
리눅스 설치
====================================================
/boot 5MB kernel 이미지
<swap>
/ 256 root 파티션
/usr 1024 모든 linux 바이너리
/home
/var 1024 로그 파일등 시스템이 정상으로 작동할 때 변경되는 파일저장
/tmp 1024 임시파일
/chroot 256 DNS, 아파치등 chroot 로 고립된 환경에서 프로그램 설치할때
/var/lib 1024 Mysql, Squid 등
====================================================
리눅스 설치후에 삭제할 서비스
====================================================
-- 데몬 모두 중지후 삭제
-- rpm -e <softwarenames>
#> rpm -e --nodeps anacron apmd at dhcpcd dosfstools eject hotplug ipchains ksymoops kudzu lokkit mailcap pciutils...
- anacron : 서버에는 불필요
- apmd : 노트북 배터리 관리
- at : vixle-cron 으로 대체하는 것이 좋음
- dhcpcd : DHCP 사용하지 않으면 제거
- dosfstools : MS-DOS
- eject : CDROM, 플로피 등 제어
- hotplug : USB 장치 로드시 필요
- ipchains : iptables 로 전환
- ksymoops : 리눅스 커널을 개발하거나 디버깅시 사용
- kudzu : 시스템 부팅시 하드웨어 추가/삭제 검색
- lokkit : 방화벽 설정을 위한 응용프로그램, 전화접속, 케이블모뎀사용자 대상으로 하는 것이기 때문에 복잡한 구성을 할수 없다.
- mailcap :
- pciutils
- pump
- raidtools
- redhat-logos
- redhat-release
- setserial
-- IDE 디스크 사용하지 않을 경우
#> rpm -e hdparm
-- SCSI, RAID 디스크 사용하지 않을 경우
#> rpm -e --nodeps mkinitrd
-- quota 패키지 삭제
#> rpm -e quota
-- 메일 서비스 안할경우
#> rpm -e sendmail
#> rpm -e procmail
#> rpm -e openldap
#> rpm -e cyrus-sasl
-- 불 필요한 문서파일 삭제
#> cd /usr/share/doc/
#> rm -rf *
====================================================
리눅스 네트웍설정
====================================================
1) PING 막기
#> vi /etc/sysctl.conf
net.ipv4.icmp_echo_ignore_all = 1
#> /etc/rc.d/init.d/network restart
#> sysctl -w net.
2) broadcast 요청에 반응하지 않기
#> vi /etc/sysctl.conf
net.ipv4.icmp_echo_broadcasts = 1
#> /etc/rc.d/init.d/network restart
==================================================
컴파일 최적화
==================================================
1) -march=cpu_type -march=i686
2) -O
0 : 파일크기를 작게
1 :
2 : 파일크기는 크고 빠르게
3 : 파일크기는 크고 빠르게 (가장 최적화)
3) -funroll-loops : 반복명령의 진행시 이를 최적화하고 반복횟수가 컴파일이나 실행시에만 결정되도록 한다.
4) -fomit-frame-pointer : 변수접근시 스택사용, 디버깅 거의 불가능, 프로그램에서 레지스터에 불필요한 함수를 지정하는 frame-pointer 를 저장하지 않도록하여 frame-pointer 에 대한 명령을 기록하지 않는다. => 많은 다른 함수에서 여분의 레지스터를 이용할 수 있지만 서버에서 디버깅이 거의 불가능하다.
==================================================
커널최적화
==================================================
/proc/sys/vm : 가상메모리
- 서버의 /proc/sys/vm 디렉토리에 있는 각종값을 조절하여 리눅스커널의 가상메모리하위 시스템을 조정할 수 있다
- /usr/src/linux/Documentation/sysctl/vm.txt 참조
- bdflush
- buffermem
- freepages
- kswapd
- avercommit_memory
- page-cluster
- pagecache
- pagetable_cache
1) bdflush
- 리눅스커널의 가상메모리 하위 시스템가 밀접한 연관이 있다.
- /proc/sys/vm/bdflush 은 bdflush 커널 데몬의 작동을 제어
- 디스크 쓰기위해 대기하는 시간을 좀 더 늘리면 디스크 접근시 과도한 경쟁현상을 피할 수 있다.
- 9개의 정수로 된 파라미터롤 구성 ( 100 1200 128 512 500 6000 500 0 0 )
- 1 파라미터 (100) : 버퍼캐시에 있는 더티 버퍼(dirty buffer)의 최대값을 조절한다. 이 값을 크게 설정하면 리눅스는 버퍼의 내용을 디스크에 쓰지않고 오랫동안 있게 되지만 다른한편으로는 메모리가 적을때 한꺼번에 많은 디스크 입출력이 필요할 수도 있다. 때로는 적게 설정값의 경우가 디스크 입출력을 더욱 균등하게 배분한다.
- 2 파라미터 (1200) : bdflush 가 한번에 디스크에 쓸수 있는 더티버퍼의 최대값으로 높은값을 설정하면 지연되거나 부하가 되는 입출력이 될수 있는 반면에 적은 값은 때로 bdflush 가 충분히 일어나지 않을 경우 메모리 부족을 야기할 수 있다.
- 3 파라미터 (128) : refill_freelist 함수가 호출되었을 때 bdflush 가 빈버퍼영역에 추가할 버퍼의 수이다. 값을 크게 하면 할수록 더 많은 메모리가 낭비되고 refill_freelist 함수가 적게 실행된다.
- 4 파라미터 (512) : bdflush 를 발생시킨다.
- age_buffer(50*HZ), age_super parameters (5*HZ) 는 리눅스가 더티버퍼를 디스크에 다 쓰기전에 대기하는 시간을 관리한다.
- 5 파리미터 (500) , 마지막 파라미터 (0, 0) 은 시스템에 의해 사용되지 않는다.
2) buffermem
- 얼마나 많은 메모리가 버퍼메모리로 사용되어야 하는가를 전체시스템 메모리에 대한 퍼센트 단위로 조절한다.
- 3개의 정수값으로 구성 (실제커널이 사용하는 값은 하나)
- 80 10 60
- 1 파라미터 : 버퍼캐시롤 최소한 메모리 즉, 버퍼메모리에 사용되는 최소한의 메모리 퍼센트
- #> free -m 을 사용하여 현재 시스템에서 사용중인 메모리의 양과 남아있는 메모리의 양을 볼수 있다.
total used free shared buffers cached
Mem: 124 121 3 30 43 48
-/+ buffers/cache: 29 95
--
swap: 128 2 126
위의 결과를 보면 -/+ buffers/cache 가 29M 가 필요로 한다는 것과 128M 의 램을 가진 시스템에서 80% 로 설정하면 단지 25.6M 를 사용할 수 있다는 것을 알수 있다.
128 * 70% = 89.6
128 - 89.6 = 38.4M
3) freepage 설정값
- freepage 의 값을 정의
- 2 15 75
- 3 가지 값을 포함
- 첫번째값 (min) : 32M 램마다 47875 정도의 값으로 설정해 주고 이 값에 2배를 하여 low 값을 얻을수 있다. 그리고 첫번째값에 3배를 하여 high 값을 얻을 수 있다.
- min : 시스템의 free pages 값이 이값에 도달하면 커널만 추가 메모리를 할당
- low : 시스템의 free pages 값이 이 값보다 작으면 커널은 점진적으로 스왑을 시작
- high : 커널은 이 값에 정해진 양의 메모리만큼 사용하지 않고 남아있도록 시도한다. 메모리가 이 값보다 낮아지면 커널은 이후에 강압적인 스왑을 할 필요가 없도록 서서히 스왑을 시작한다.
- #> vi /etc/sysctl.conf
vm.freepages = 383 766 1149
#> /etc/rc.d/init.d/network restart
sysctl -w vm.freepages="383 766 1149"
4) kswapd 설정
- /proc/sys/vm/kswapd 파일은 메모리가 조각으로 나뉘거나 꽉 차는 경우 메모리를 해소해 주는 역할을 하는 커널의 swapout 데몬과 관련이 있다.
- 3가지 값으로 구성
- 512 32 8
- tries_base : kswapd 가 한번에 해소할 수 있는 페이지의 최고치는 이 값으로 계산한다. 주고 이 숫자는 4, 8로 나누어 진다 (mm/vmscan.c 참조) 스왑에서 대역폭의 값을 늘릴 필요가 있다면 이 값을 늘리면 된다.
- tries_min : kswapd 가 실행될때마다 페이지를 비우기 위해 시도할 최소횟수
- swap_cluster : kswapd 가 한번에 쓰는 페이지의 숫자로 이 값을 크게 설정하면 kswapd 에서 입출력을 큰값으로 처리하도록 하여 디스크를 자주 검색하지 않게 하지만 그 반면에 요청을 처리하는 큐를 넘치게 할 수 있다.
5) page-cluster 파라미터
- 가상메모리는 한번에 복수로 페이지를 읽어 과도한 디스크 검색을 피한다. 한번에 읽을 수 있는 페이지의 값은 시스템의 메모리크기와 직접 관련되는데 커널이 한번에 읽을 수 있는 페이지의 크기는 2^page-cluster 이다. 스왑에서 2^5 보다 큰값은 의미가 없다. 왜냐하면 스왑데이터를 32페이지 그룹단위로 모으기 때문이다.
- 기본값은 4
6) pagecache 설정값
- buffermem 설정변수와 똑같지만 페이지 캐시 구조만을 제어한다. 따라서 페이지 캐시에 사용되는 메모리양을 제어한다. 또한 메모리 매핑을 위해 허용되는 메모리와 일반적인 파일의 캐싱을 제어한다.
- 주된 목적
- 파일로 부터 read() 데이터 캐싱
- 실행 가능한 파일과 mmap() 된 데이터 캐싱
- 스왑캐시
- 시스템이 스왑과 캐시에서 높은 값을 가지고 있다면 많은 스왑데이터들이 캐시되고 가능한 것보다 더 효율적인 스와핑을 시도한다는 것을 의미한다. 따라서 최소값 설정이 너무 낮지 않아야 한다. 최소값 설정이 너무 낮으면 메모리 운영이 너무 빠듯하거나 그 조각이 너무 많아져 시스템이 견딜 수 없다.
- 기본값 2 15 75
7) pagetable_cache 설정 변수
- 커널은 하나의 프로세스 캐시 당 일정한 양의 페이지 테이블을 저장한다. (SWP 시스템에서 특히 큰 도움) 각 프로세스에 대한 캐시의 크기는 낮은것과 높은것 사이의 값이다. SMP 시스템에서는 커널 메모리 제어를 얻을 필요없이 빠른 pagetable 할당을 할수 있다.
- 대형 시스템에서는 이 값을 설정하는 것이 좋다. 그러나 일반적인 시스템에서는 오히려 해가 될수 있다.
- 기본값 25 50
/proc/sys/fs 파일 시스템 데이터
- 조심해서 설정해야 함
-
binfmt-misc
register-status
dentry-state
dir-notify
dquot-max
dquot-nr
file-max
inode-nr
inode-state
lease-break-time
lease-enable
overflowgid
overflowuid
super-max
super-nr
1) file-max 매개변수
- /proc/sys/fs/file-max 에 있는 file-max 파일은 리눅스 커널이 할당할 수 있는 파일 핸들의 최대값을 설정한다. 일반적으로는 4M 램당 256 정도의 값으로 환산하여 /proc/sys/fs/file-max 값을 적당히 높임으로써 열수 있는 파일의 개수를 높인다. (예로 256M 램의 경우 16384 = 256 / 4 * 256
- 기본값은 8192
기타 시스템 최적화를 위한 다른 설정
1) ulimit 매개변수
- 시스템에 있는 인증된 사용자가 생성할 수 있는 프로세스의 개수를 제한한다. 성능향상을 위해서 root 의 경우 무한대로 설정하는 것이 좋다.
- #> vi /root/.bashrc
ulimit -u unlimited
2) atime 속성
- 마지막 접근시간을 기록하지 않음
- 웹서버, 프록시서버 데이터베이스서버등에 상당한 성능향상을 가져온다.
- #> chartr +A filename
chattr -R +A /var/spool
3) noatime
- /etc/fstab 에 적용
- 설정되어 있으면 해당 파티션의 경우 atime 이 적용되지 않는다.
- #> vi /etc/fstab
LABEL=/chroot /chroot ext2 defaults,noatime 1 2
#> mount /chroot -oremount