Kernel 영역
현재 설치된 Kernel 변수, Resource 한도, I/O 스케줄러 확인
Last updated
현재 설치된 Kernel 변수, Resource 한도, I/O 스케줄러 확인
Last updated
Kernel은 리눅스 운영체제(Operational System)의 아래와 같이[3] 핵심 기능을 담당하고 있는 소프트웨어로써, 하드웨어와 쉘(Shell) 간의 통신 역할을 한다[1]. 이를 통해 프로세스, 메모리, 입출력 등 전반적인 관리를 할 수 있다[2].
자원 할당(Resource allocation) : 컴퓨터의 자원을 관리하고 다른 프로그램들이 이 자원을 실행 및 사용할 수 있도록 한다.
프로세스 관리(Process Management) : 응용 프로그램이 접근할 수 있는 메모리 부분으로, 프로그램의 실행 방식과 진행상황에 대한 정보를 담는 역할을 한다.
메모리 관리(Memory Management) : 프로세스가 필요에 따라 시스템 메모리에 안전하게 접근할 수 있도록 한다.
I/O 디바이스 관리(I/O Device Management) : 사용 가능한 장치를 유지 관리하고 드라이버가 일부 포트 또는 메모리 위치를 통해 장치를 물리적으로 접근할 있도록 I/O를 제공한다.
프로세스 간 통신(Inter- Process Communication) : 프로세스 사이에 동기화와 통신을 위한 방법을 제공한다.
스케줄링(Scheduling) : 다중 작업 시스템에서 커널은 모든 프로그램에 시간을 주고 프로세스에서 프로세스로 빠르게 전환하여 마치 프로세스가 동시에 실행되는 것처럼 사용자에게 표시된다.
시스템 호출 및 인터럽트 처리( System Calls and Interrupt Handling) : C 라이브러리 또는 API 를 제공하여 관련 커널 기능을 호출한다.
보안 관리 (Security Managment) : 오류 및 악성 동작으로부터 보호한다.
1. 작업 전 확인
# cat /etc/sysctl.conf | grep icmp
2. 임시 변경 (실행 즉시 반영되지만, 서버 재시작하면 원복된다.)
# sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
3. 영구 변경 ( 재부팅시에 적용되게 하려면 /etc/sysctl.conf 파일에 추가 기록한다.)
# vi /etc/sysctl.conf
net.ipv4.icmp_echo_ignore_broadcasts=1
# sysctl -p
ulimit는 리눅스 시스템에서 과부하를 막기 위해 쉘에서 사용자에 대한 자원 한도를 표시하고 설정할 수 있는 명령어다[5]. 이 명령어를 사용하면 커널의 성능과 기능에 막대한 영향을 주게 되므로 사용할 때 주의해야 한다. 시스템 자원은 "/etc/security/limit.conf" 파일에 정의되어 있고 파일 안에는 Hard와 Soft라는 두 가지의 한도가 있다[5]. Soft한도는 새로운 프로세스가 생성되 기본으로 적용되는 한도이고, Hard한도는 Soft한도에서 최대로 늘릴 수 있는 한도이다.
<ulimit 명령어 옵션값[6]> -a : 모든 제한 값 출력 -c : core파일이 생성될때의 최대 크기 제한 -d : 프로세스의 데이터 세그먼트 최대 크기 제한 -e : 최대 우선 예약 순위 -f : 쉘에 의해 생성된 파일의 최대 크기 제한 -i : 보류중인 신호의 최대 수 제한 -l : 메모리에 잠길 수 있는 최대 크기 제한 -m : 메모리에 상주 가능한 최대 크기 제한 -n : 오픈 파일의 최대 수 제한 (too many open file 등의 Error가 발생하는 경우 해당 값을 수정하여 해결 가능) -p : 512 byte 블록으로 파이프 크기를 설정 -q : POSIX 메시지 대기 행렬의 최대 byte 수 제한 -r : 최대 실시간 스케줄링 우선 순위 -s : stack 최대 크기 제한 -t : CPU의 초당 사용시간 제한 -u : 특정 사용자의 사용가능한 프로세스의 최대갯수 제한 -v : 쉘이 사용할 수 있는 가상 메모리의 최대 크기 제한 -x : 최대 파일 잠금 수 제한 -S : 주어진 자원에 대한 소프트 한도 설정 -H : 주어진 자원에 대한 하드 한계 설정 -T : 최대 스레드 수 제한
1. 현재 모든 프로세스 자원 제한 한도를 보여준다.
# ulimit -a
2. ulimit 옵션값에 따라 요구조건에 맞춘 파라미터들을 유기적으로 변경이 가능하다.
# ulimit -i 22222
1. /etc/security/limit.conf 에 들어가 nofile , nproc ,core 값을 조정하면 된다. # vi /etc/security/limits.conf
vi 에디터에서 :set nu 입력 후 , 64~68번째 이동 hard, soft 파라미터 변경 후 저장 (:wq)
디스크의 I/O를 효율화하기 위한 하드디스크에 최적화된 블럭 디바이스 스케줄링 알고리즘으로, 운영체제가 다수의 프로세스들로부터 디스크를 읽거나 쓰려는 요청을 받았을 때 우선순위을 정해주고 이를 관리한다[7]. 종류로는 Deadline, noop, anticipatory, cfq가 있다.
<I/O Scheduler 종류[8]>
NOOP 스케줄러 : 리눅스 I/O 스케줄러의 가장 간단한 형태로 우선순위 없이 FIFO(First-In First-Out) 으로 처리된다. 큰 캐싱 시스템을 가진 스토리지 환경에 적합하다.
Deadline 스케줄러 : 들어오는 요청의 처리 완료 시간을 기준으로 우선적으로 처리한다. 리얼타임 어플리케이션, 데이타베이스, 디스크 집약 어플리케이션에 효과적이다.
The Anticipatory scheduler : 현재 작성하고 있는 블록의 인접한 블록을 우선적으로 처리한다. 싱글 IDE/SATA 디스크에서 웹서버, 파일 서버, 데스크탑에서 최고의 포퍼먼스를 보여준다.
Completely Fair Queuing (CFQ) : 커널 버전 2.6.18 부터는 Linux 기본값으로 사용된다. 대부분의 읽기에 대해서 최악의 경우를 최소화하는 스케줄러로 대부분 사용한다. 다중 사용자 환경으로 광범위한 어플리케이션에서 효과적이다.
1. 현재 설정 확인
# cat /sys/block/sda/queue/scheduler
2. 서버 환경에 맞는 스케줄러를 변경
- 디스크 I/O 성능이 좋으면, noop 스케줄러를 권장
- RAID로 구성된 DBMS 서버 경우, deadline 스케줄러를 권장
- 많은 프로세스들이 세세한 I/O를 많이 발생시킬 때, cfg 스케줄러를 권장
# echo "cfq" > /sys/block/sda/queue/scheduler
[1] 리눅스 커널 - 유튜브 by 김병국 https://www.youtube.com/watch?v=P-uySN0r0Tc&t=19s [2] Q. 운영체제랑 커널이 뭔가요? 쉽게 설명해주세요. - 유튜브 by 컴맹을 위한 채 https://www.youtube.com/watch?v=UwhMSrkW7CA&t=56s [3] What is Kernel, its functions and Is Linux a kernel or an OS? - 2EMBEDDEDROBOTICS http://2embeddedrobotics.blogspot.com/2012/10/what-is-kernel-its-functions-and-is.html [4] sysctl(8) - Linux man page https://linux.die.net/man/8/sysctl [5] LANDOFLINUX.COM - ULIMIT COMMAND http://landoflinux.com/linux_ulimit_command.html [6] ulimit Man Page - Linux - SS64.com https://ss64.com/bash/ulimit.html [7] I/O Scheduling - From Wikipedia, the free encyclopedia https://en.wikipedia.org/wiki/I/O_scheduling [8] Linux I/O 스케줄러의 종류 와 운영환경에 따른 최적화 방법 - made by 덕 https://duksoo.tistory.com/entry/Linux-IO-스케줄러의-종류-와-운영환경에-따른-최적화-방법 [창고]
옵션값
설명
-n
특정키에 대한 값을 출력
-w
커널 변수 설정값 변경
-p
sysctl 환경변수파일의 설정 상태 표시
-a
현재 커널 매개변와 값을 출력