Kernel은 모든 시스템에서 가장 중요한 구성 요소이다.
H/W와 S/W의 인터페이스로서 성능 튜닝시 가장 중요한 부분이다.
FreeBSD 7.2에서 커널을 투닝하는 방법에 대해서 정리를 해볼려고 한다.
참고로 사용한 컴퓨터의 사양은 Pentium4 2.4GHz, 1G memory이다.
먼저 지금 커널에 대해서 알기위해서 sysctl MIB정보를 수집했다.
sanjose# sysctl -A > sysctl.out <-- 수집하는 방법
sysctl MIB는 다음과 같은 하부 구조로 이루어져 있다.
kerm : 핵심 커널 기능
vm : 가상 메모리
vfs : 파일 시스템
net : 네트워크킹
그외...
sanjose# less sysctl.out
kern.ostype: FreeBSD
kern.osrelease: 7.2-RELEASE
kern.osrevision: 199506
kern.version: FreeBSD 7.2-RELEASE #0: Fri May 1 08:49:13 UTC 2009
root@walker.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC
...
kern.bootfile: /boot/kernel/kernel <- 이전에는 /kernel이라는 곳에서 존재함.
...
sanjose# sysctl kern <-커널 부분만...
kern.ostype: FreeBSD
kern.osrelease: 7.2-RELEASE
kern.osrevision: 199506
kern.version: FreeBSD 7.2-RELEASE #0: Fri May 1 08:49:13 UTC 2009
root@walker.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC
kern.maxvnodes: 69676
kern.maxproc: 6164
kern.maxfiles: 12328
...
sanjose# sysctl kern.securelevel <- 만약 정확한 MIB값을 알고 있다면 바로 사용을 하면 된다.
kern.securelevel: -1
sanjose# sysctl vfs.usermount
vfs.usermount: 0
sanjose# sysctl vfs.usermount=1
vfs.usermount: 0 -> 1
sanjose# vi /etc/sysctl.conf
# $FreeBSD: src/etc/sysctl.conf,v 1.8.32.1 2009/04/15 03:14:26 kensmith Exp $
#
# This file is read when going to multi-user and its contents piped thru
# ``sysctl'' to adjust kernel values. ``man 5 sysctl.conf'' for details.
#
# Uncomment this to prevent users from seeing information about processes that
# are being run under another UID.
#security.bsd.see_other_uids=0
vfs.usermount=1
~
~
/etc/sysctl.conf: 11 lines, 394 characters.
sanjose# cat /boot/loader.conf <- 최고 우선순위를 가짐.
sanjose# cat /boot/defaults/loader.conf <-- default 기본
sanjose# vi /boot/loader.conf <- 리눅스 부분 수정.
# Linux procfs,sysfs support
linprocfs_load="YES"
linsysfs_load="YES"
/boot/loader.conf: 6 lines, 106 characters.
sanjose# kldstat <- kernel이 올라온 상태 확인
Id Refs Address Size Name
1 7 0xc0400000 9fab28 kernel
2 1 0xc0dfb000 6a45c acpi.ko
3 1 0xc4470000 22000 linux.ko
sanjose# kldstat -v <- 세부적으로 보기
Id Refs Address Size Name
1 7 0xc0400000 9fab28 kernel
Contains modules:
Id Name
335 shmat
334 shmctl
333 shmdt
...
2 1 0xc0dfb000 6a45c acpi.ko
Contains modules:
Id Name
19 cpu/acpi_throttle
18 acpi/acpi_smbat
17 cpu/acpi_perf
3 1 0xc4470000 22000 linux.ko
Contains modules:
Id Name
443 linuxaout
442 linuxelf
sanjose# kldload /boot/kernel/warp_saver.ko
sanjose# kldstat
Id Refs Address Size Name
1 9 0xc0400000 9fab28 kernel
2 1 0xc0dfb000 6a45c acpi.ko
3 1 0xc4470000 22000 linux.ko
4 1 0xc76be000 2000 warp_saver.ko
지금까지 커널의 상태 및 부분적인 튜닝을 하였다. 하지만 완벽한 튜닝, 자신만의 커널을 가지기 위해서는 아래와 같은 작업을 통해서 자신만의 커널을 만들어야 한다.
sanjose# cd /sys <-- kernel source가 시스템에 있는지 확인.
sanjose# ls
Makefile cddl dev i4b net netipsec nfs4client pccard sun4v
amd64 compat fs ia64 net80211 netipx nfsclient pci sys
arm conf gdb isa netatalk netnatm nfsserver powerpc tools
boot contrib geom kern netgraph netncp nlm rpc ufs
bsm crypto gnu libkern netinet netsmb opencrypto security vm
cam ddb i386 modules netinet6 nfs pc98 sparc64 xdr
sanjose# cp GENERIC FILESERVERr <-기존 커널 설정 파일을 이용하여 사용함.
sanjose# vi FIRESERVER
sanjose# config ./FILESERVER <-- 수정한 파일의 에러 체크
Kernel build directory is ../compile/./FILESERVER
Don't forget to do ``make cleandepend && make depend''
sanjose# cd ../compile/FILESERVER/
sanjose# make depend && make all install
이렇게 하고 리부팅을 하면 된다.
제발 한번만에 되기를....