SlideShare a Scribd company logo
1 of 117
Download to read offline
" 리눅스, 제대로 알고 코딩하자 "
2019년 9월 5일(목) 오후 8시 ~ 10시
리얼리눅스 강의장(강남) http://kko.to/SxNc-4xjH
Real Linux 교육세미나 제 1 회
1 리눅스 커널도 C 프로그램 이다 PM 08:00 ~ 08:30 (30분)
2 Pagefault는 왜 발생할까 ? "a=b;의 진실" PM 08:30 ~ 08:55 (25분)
3 휴식 PM 08:55 ~ 09:05 (10분)
4 리얼 리눅스 교육과정 소개 PM 09:05 ~ 09:15 (10분)
5
리눅스 커널과 나의 서버 프로그램의
관계 및 성능에 미치는 영향
PM 09:15 ~ 09:35 (20분)
6 옆집 아저씨 컨테이너가 죽은 이유 PM 09:35 ~ 10:00 (25분)
http://RealLinux.co.kr링크 접속해주세요!
리눅스 커널도 C 프로그램이다.
리눅스 커널도 C 프로그램이다.
OS 란 ?
리눅스 커널도 C 프로그램이다.
OS 란 ?
리눅스 커널도 C 프로그램이다.
OS 가 하는일 ?
리눅스 커널도 C 프로그램이다.
OS 가 하는일 ?
(1)
(2)
리눅스 커널도 C 프로그램이다.
OS 가 하는일 ?
(1) 사용자 application 관리
(2)
리눅스 커널도 C 프로그램이다.
OS 가 하는일 ?
(1) 사용자 application 관리
(2) HW 자원관리 (cpu, RAM, disk 등)
리눅스 커널도 C 프로그램이다.
OS 의 구성
- Core 부분:
- I/O 처리:
- 기타:
리눅스 커널도 C 프로그램이다.
OS 의 구성
- Core 부분:
- I/O 처리:
- 기타: security, tools, sounds, ...
리눅스 커널도 C 프로그램이다.
OS 의 구성
- Core 부분: PM(process management)
MM(memory management)
- I/O 처리:
- 기타: security, tools, sounds, ...
리눅스 커널도 C 프로그램이다.
OS 의 구성
- Core 부분: PM(process management)
MM(memory management)
irq / exception 처리, locking
- I/O 처리:
- 기타: security, tools, sounds, ...
리눅스 커널도 C 프로그램이다.
OS 의 구성
- Core 부분: PM(process management)
MM(memory management)
irq / exception 처리, locking
- I/O 처리: 네트워크
- 기타: security, tools, sounds, ...
리눅스 커널도 C 프로그램이다.
OS 의 구성
- Core 부분: PM(process management)
MM(memory management)
irq / exception 처리, locking
- I/O 처리: 네트워크
스토리지 (VFS/FS/Block)
- 기타: security, tools, sounds, ...
리눅스 커널도 C 프로그램이다.
OS 의 구성
- Core 부분: PM(process management)
MM(memory management)
irq / exception 처리, locking
- I/O 처리: 네트워크
스토리지 (VFS/FS/Block)
디바이스 드라이버
- 기타: security, tools, sounds, ...
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
리눅스 커널(OS)소스를 받자 !
실습: 이해한 내용은 꼭 손으로 증명하자Real Linux
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
리눅스 커널(OS)소스를 받자 !
실습: 이해한 내용은 꼭 손으로 증명하자
리눅스 커널 소스 저장소 URL소스 다운로드
Real Linux
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
$ cd linux/
실습: 이해한 내용은 꼭 손으로 증명하자
리눅스 커널(OS)소스폴더로
들어가서
Real Linux
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
$ cd linux/
리눅스 커널(OS)소스폴더로
들어가서
실습: 이해한 내용은 꼭 손으로 증명하자Real Linux
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
$ cd linux/
$ ls
arch crypto firmware Kbuild MAINTAINERS README tools
block cscope.files fs Kconfig Makefile samples usr
certs cscope.out include kernel mm scripts virt
COPYING Documentation init lib Module.symvers security
CREDITS drivers ipc LICENSES net sound
리눅스 커널(OS) 구성을 확인하자 !
실습: 이해한 내용은 꼭 손으로 증명하자Real Linux
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
$ cd linux/
$ ls
arch crypto firmware Kbuild MAINTAINERS README tools
block cscope.files fs Kconfig Makefile samples usr
certs cscope.out include kernel mm scripts virt
COPYING Documentation init lib Module.symvers security
CREDITS drivers ipc LICENSES net sound
실습: 이해한 내용은 꼭 손으로 증명하자
리눅스 커널(OS) 구성을 확인하자 !
Real Linux
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
$ cd linux/
$ ls
arch crypto firmware Kbuild MAINTAINERS README tools
block cscope.files fs Kconfig Makefile samples usr
certs cscope.out include kernel mm scripts virt
COPYING Documentation init lib Module.symvers security
CREDITS drivers ipc LICENSES net sound
실습: 이해한 내용은 꼭 손으로 증명하자
리눅스 커널(OS) 구성을 확인하자 !
Real Linux
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
$ cd linux/
$ ls
arch crypto firmware Kbuild MAINTAINERS README tools
block cscope.files fs Kconfig Makefile samples usr
certs cscope.out include kernel mm scripts virt
COPYING Documentation init lib Module.symvers security
CREDITS drivers ipc LICENSES net sound
$ make -j8
실습: 이해한 내용은 꼭 손으로 증명하자Real Linux
리눅스 커널(OS) 소스 컴파일 해놓고
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
$ cd linux/
$ ls
arch crypto firmware Kbuild MAINTAINERS README tools
block cscope.files fs Kconfig Makefile samples usr
certs cscope.out include kernel mm scripts virt
COPYING Documentation init lib Module.symvers security
CREDITS drivers ipc LICENSES net sound
$ make -j8
실습: 이해한 내용은 꼭 손으로 증명하자
리눅스 커널(OS) 소스 컴파일 해놓고
Real Linux
$ cd ~/
$ vim hello.c
$ cat hello.c
#include <stdio.h>
void main()
{
printf("hellon");
}
실습: 이해한 내용은 꼭 손으로 증명하자
간단한 C소스코드 만들어서
Real Linux
$ cd ~/
$ vim hello.c
$ cat hello.c
#include <stdio.h>
void main()
{
printf("hellon");
}
실습: 이해한 내용은 꼭 손으로 증명하자
간단한 C소스코드 만들어서
Real Linux
$ cd ~/
$ vim hello.c
$ cat hello.c
#include <stdio.h>
void main()
{
printf("hellon");
}
$ file hello.c
hello.c: C source, ASCII text
실습: 이해한 내용은 꼭 손으로 증명하자
간단한 C소스코드 만들어서 확인
Real Linux
$ cd ~/
$ vim hello.c
$ cat hello.c
#include <stdio.h>
void main()
{
printf("hellon");
}
$ file hello.c
hello.c: C source, ASCII text
실습: 이해한 내용은 꼭 손으로 증명하자
간단한 C소스코드 만들어서 확인
Real Linux
$ file hello.c
hello.c: C source, ASCII text
$ gcc hello.c
$ ./a.out
실습: 이해한 내용은 꼭 손으로 증명하자
hello.c 컴파일해서 실행파일 a.out 실행
Real Linux
$ file hello.c
hello.c: C source, ASCII text
$ gcc hello.c
$ ./a.out
hello
실습: 이해한 내용은 꼭 손으로 증명하자
hello.c 컴파일해서 실행파일 a.out 실행
Real Linux
$ file hello.c
hello.c: C source, ASCII text
$ gcc hello.c
$ ./a.out
$ file a.out
실습: 이해한 내용은 꼭 손으로 증명하자
컴파일한 C프로그램 바이너리(a.out)를 확인
Real Linux
$ file hello.c
hello.c: C source, ASCII text
$ gcc hello.c
$ ./a.out
$ file a.out
a.out: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically
linked, interpreter /lib64/l, for GNU/Linux 3.2.0,
BuildID[sha1]=a443aa2712c9802b2f193b4678fffcdc2a7557e4, not stripped
실습: 이해한 내용은 꼭 손으로 증명하자
컴파일한 C프로그램 바이너리(a.out)를 확인
Real Linux
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
$ cd linux/
$ file kernel/fork.c
kernel/fork.c: C source, ASCII text
실습: 이해한 내용은 꼭 손으로 증명하자
리눅스 커널(OS)의 C 소스파일 확인
Real Linux
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
$ cd linux/
$ file kernel/fork.c
kernel/fork.c: C source, ASCII text
실습: 이해한 내용은 꼭 손으로 증명하자
리눅스 커널(OS)의 C 소스파일 확인
Real Linux
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
$ cd linux/
$ file kernel/fork.c
kernel/fork.c: C source, ASCII text
$ file vmlinux
실습: 이해한 내용은 꼭 손으로 증명하자
컴파일한 바이너리(vmlinux)의 C 소스 파일확인
Real Linux
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
$ cd linux/
$ file kernel/fork.c
kernel/fork.c: C source, ASCII text
$ file vmlinux
vmlinux: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically
linked, BuildID[sha1]=5738f667cb6387e77a4439dc66c2ae6c5a4cb24f, with
debug_info, not stripped
실습: 이해한 내용은 꼭 손으로 증명하자
컴파일한 바이너리(vmlinux)의 C 소스 파일확인
Real Linux
Page fault 는 왜 발생할까 ?
Page fault 는 왜 발생할까 ?
메모리를 관리하는 하나의 매커니즘
Page fault 는 왜 발생할까 ?
메모리를 관리하는 하나의 매커니즘
진짜 메모리 조각을 주지않고
가상 메모리 조각만 준다.
Page fault 는 왜 발생할까 ?
메모리를 관리하는 하나의 매커니즘
진짜 메모리 조각을 주지않고
가상 메모리 조각만 준다.
Chrome
vim
slack
메모리 사용할 친구들
Chrome
vim
slack
메모리 사용할 친구들
메모리 여러조각으로 나눠서 관리
Chrome
vim
slack
메모리 사용할 친구들
page
page
page
page
page
page
page
메모리 여러조각으로 나눠서 관리
Chrome
vim
slack
메모리 사용할 친구들
page
page
page
page
page
page
page
메모리 여러조각으로 나눠서 관리
진짜 메모리 조각은 안주고
Chrome
vim
slack
메모리 사용할 친구들
page
page
page
page
page
page
page
메모리 여러조각으로 나눠서 관리
가상 메모리 조각만 주고 시작
page
page
page
page
page
page
page
page
page
Chrome
vim
slack
메모리 사용할 친구들
page
page
page
page
page
page
page
메모리 여러조각으로 나눠서 관리
가상 메모리 조각만 주고 시작
page
page
page
page
page
page
page
page
page
한 조각
크기
4KB
Chrome
vim
slack
메모리 사용할 친구들
page
page
page
page
page
page
page
메모리 여러조각으로 나눠서 관리
가상 메모리 조각만 주고 시작
page
page
page
page
page
page
page
page
page
한 조각
크기
4KB
주소당 1 바이트
Chrome
vim
slack
메모리 사용할 친구들
page
page
page
page
page
page
page
메모리 여러조각으로 나눠서 관리
가상 메모리 조각만 주고 시작
page
page
page
page
page
page
page
page
page
한 조각
크기
4KB
주소당 1 바이트
4K 개 주소
Chrome
vim
slack
메모리 사용할 친구들
page
page
page
page
page
page
page
메모리 여러조각으로 나눠서 관리
가상 메모리 조각만 주고 시작
page
page
page
page
page
page
page
page
page
한 조각
크기
4KB
주소당 1 바이트
4K 개 주소
사용할 수
있는
가상주소도
page당
4K 개 있다.
Chrome
vim
slack
메모리 사용할 친구들
page
page
page
page
page
page
page
메모리 여러조각으로 나눠서 관리
가상 메모리 조각만 주고 시작
page
page
page
page
page
page
page
page
page
한 조각
크기
4KB
주소당 1 바이트
4K 개 주소
사용할 수
있는
가상주소도
page당
4K 개 있다.
4K == 4096 개
Chrome
vim
slack
메모리 사용할 친구들
page
page
page
page
page
page
page
메모리 여러조각으로 나눠서 관리
가상 메모리 조각만 주고 시작
page
page
page
page
page
page
page
page
page
Chrome
vim
slack
메모리 사용할 친구들
page
page
page
page
page
page
page
메모리 여러조각으로 나눠서 관리
가상 메모리 조각만 주고 시작
page
page
page
page
page
page
page
page
page
가상주소 물리주소
0x555b7 NULL
... ...
가상주소 물리주소
0x7f788 NULL
... ...
가상주소 물리주소
0x7f788 NULL
... ...
Chrome의 메모리 조각 관리 테이블
Vim의 메모리 조각 관리 테이블
Slack의 메모리 조각 관리 테이블
Chrome
vim
slack
메모리 사용할 친구들
page
page
page
page
page
page
page
메모리 여러조각으로 나눠서 관리
가상 메모리 조각만 주고 시작
page
page
page
page
page
page
page
page
page
가상주소 물리주소
0x555b7 NULL
... ...
가상주소 물리주소
0x7f788 NULL
... ...
가상주소 물리주소
0x7f788 NULL
... ...
Chrome의 메모리 조각 관리 테이블
Vim의 메모리 조각 관리 테이블
Slack의 메모리 조각 관리 테이블
실제로 사용!
Chrome
vim
slack
메모리 사용할 친구들
page
page
page
page
page
page
page
메모리 여러조각으로 나눠서 관리
가상 메모리 조각만 주고 시작
page
page
page
page
page
page
page
page
page
가상주소 물리주소
0x555b7 NULL
... ...
가상주소 물리주소
0x7f788 NULL
... ...
가상주소 물리주소
0x7f788 NULL
... ...
Chrome의 메모리 조각 관리 테이블
Vim의 메모리 조각 관리 테이블
Slack의 메모리 조각 관리 테이블
실제로 사용!
코드
.text
a = b;
Chrome
vim
slack
메모리 사용할 친구들
page
page
page
page
page
page
page
메모리 여러조각으로 나눠서 관리
가상 메모리 조각만 주고 시작
page
page
page
page
page
page
page
page
page
가상주소 물리주소
0x555b7 NULL
... ...
가상주소 물리주소
0x7f788 NULL
... ...
가상주소 물리주소
0x7f788 NULL
... ...
Chrome의 메모리 조각 관리 테이블
Vim의 메모리 조각 관리 테이블
Slack의 메모리 조각 관리 테이블
실제로 사용!
a = b;
코드
.text
Chrome
vim
slack
메모리 사용할 친구들
page
page
page
page
page
page
page
메모리 여러조각으로 나눠서 관리
가상 메모리 조각만 주고 시작
page
page
page
page
page
page
page
page
page
가상주소 물리주소
0x555b7 NULL
... ...
가상주소 물리주소
0x7f788 NULL
... ...
가상주소 물리주소
0x7f788 NULL
... ...
Chrome의 메모리 조각 관리 테이블
Vim의 메모리 조각 관리 테이블
Slack의 메모리 조각 관리 테이블
실제로 사용!
a = b;
코드
.text
Chrome
vim
slack
메모리 사용할 친구들
page
page
page
page
page
page
page
메모리 여러조각으로 나눠서 관리
가상 메모리 조각만 주고 시작
page
page
page
page
page
page
page
page
page
가상주소 물리주소
0x555b7 NULL
... ...
가상주소 물리주소
0x7f788 NULL
... ...
가상주소 물리주소
0x7f788 NULL
... ...
Chrome의 메모리 조각 관리 테이블
Vim의 메모리 조각 관리 테이블
Slack의 메모리 조각 관리 테이블
실제로 사용!
a = b;
코드
.text
페이지
폴트 !
$ sudo su
$ cd /sys/kernel/debug/tracing
실습: 이해한 내용은 꼭 손으로 증명하자
sudo 권한으로 커널 tracing 폴더로 이동
Real Linux
$ sudo su
$ cd /sys/kernel/debug/tracing
실습: 이해한 내용은 꼭 손으로 증명하자
sudo 권한으로 커널 tracing 폴더로 이동
Real Linux
$ sudo su
$ cd /sys/kernel/debug/tracing
$ echo 1 > events/exceptions/page_fault_user/enable
실습: 이해한 내용은 꼭 손으로 증명하자
pagefault 이벤트 추적 tracing 켜기(On)
Real Linux
$ sudo su
$ cd /sys/kernel/debug/tracing
$ echo 1 > events/exceptions/page_fault_user/enable
실습: 이해한 내용은 꼭 손으로 증명하자
pagefault 이벤트 추적 tracing 켜기(On)
Real Linux
$ sudo su
$ cd /sys/kernel/debug/tracing
$ echo 1 > events/exceptions/page_fault_user/enable
$ cat trace_pipe
slack-2296 [002] d... 97297.874783: page_fault_user: address=0x187d0de09000 ip=0x3d035249316c error_code=0x6
chrome-19660 [001] d... 97297.875595: page_fault_user: address=0x1f77e6754000 ip=0x7fdb53e1cb1f error_code=0x6
...
Gitter-1868 [006] d... 97297.975040: page_fault_user: address=0x7f6801054200 ip=0x7f6801054200 error_code=0x14
chrome-19660 [007] d... 97297.976004: page_fault_user: address=0x1f77e6754000 ip=0x7fdb53e1cb1f error_code=0x6
...
실습: 이해한 내용은 꼭 손으로 증명하자
지금 내 리눅스에서 발생하는
페이지 폴트(pagefault) 확인
Real Linux
$ sudo su
$ cd /sys/kernel/debug/tracing
$ echo 1 > events/exceptions/page_fault_user/enable
$ cat trace_pipe
slack-2296 [002] d... 97297.874783: page_fault_user: address=0x187d0de09000 ip=0x3d035249316c error_code=0x6
chrome-19660 [001] d... 97297.875595: page_fault_user: address=0x1f77e6754000 ip=0x7fdb53e1cb1f error_code=0x6
...
Gitter-1868 [006] d... 97297.975040: page_fault_user: address=0x7f6801054200 ip=0x7f6801054200 error_code=0x14
chrome-19660 [007] d... 97297.976004: page_fault_user: address=0x1f77e6754000 ip=0x7fdb53e1cb1f error_code=0x6
...
실습: 이해한 내용은 꼭 손으로 증명하자
지금 내 리눅스에서 발생하는
페이지 폴트(pagefault) 확인
Real Linux
$ sudo su
$ cd /sys/kernel/debug/tracing
$ echo 1 > events/exceptions/page_fault_user/enable
$ cat trace_pipe
slack-2296 [002] d... 97297.874783: page_fault_user: address=0x187d0de09000 ip=0x3d035249316c error_code=0x6
chrome-19660 [001] d... 97297.875595: page_fault_user: address=0x1f77e6754000 ip=0x7fdb53e1cb1f error_code=0x6
...
Gitter-1868 [006] d... 97297.975040: page_fault_user: address=0x7f6801054200 ip=0x7f6801054200 error_code=0x14
chrome-19660 [007] d... 97297.976004: page_fault_user: address=0x1f77e6754000 ip=0x7fdb53e1cb1f error_code=0x6
...
실습: 이해한 내용은 꼭 손으로 증명하자
지금 내 리눅스에서 발생하는
페이지 폴트(pagefault) 확인
Real Linux
$ cd git/linux
$ cat arch/x86/include/asm/traps.h
...
/*
* Page fault error code bits:
*
* bit 0 == 0: no page found 1: protection fault
* bit 1 == 0: read access 1: write access
* bit 2 == 0: kernel-mode access 1: user-mode access
* bit 3 == 1: use of reserved bit detected
* bit 4 == 1: fault was an instruction fetch
* bit 5 == 1: protection keys block access
*/
...
실습: 이해한 내용은 꼭 손으로 증명하자
0x6 == 000110
0x14 == 010100
Real Linux
$ cd git/linux
$ cat arch/x86/include/asm/traps.h
...
/*
* Page fault error code bits:
*
* bit 0 == 0: no page found 1: protection fault
* bit 1 == 0: read access 1: write access
* bit 2 == 0: kernel-mode access 1: user-mode access
* bit 3 == 1: use of reserved bit detected
* bit 4 == 1: fault was an instruction fetch
* bit 5 == 1: protection keys block access
*/
...
실습: 이해한 내용은 꼭 손으로 증명하자
0x6 == 000110
0x14 == 010100
Real Linux
$ cd git/linux
$ cat arch/x86/include/asm/traps.h
...
/*
* Page fault error code bits:
*
* bit 0 == 0: no page found 1: protection fault
* bit 1 == 0: read access 1: write access
* bit 2 == 0: kernel-mode access 1: user-mode access
* bit 3 == 1: use of reserved bit detected
* bit 4 == 1: fault was an instruction fetch
* bit 5 == 1: protection keys block access
*/
...
실습: 이해한 내용은 꼭 손으로 증명하자
0x6 == 000110
0x14 == 010100
Real Linux
$ cd git/linux
$ cat arch/x86/include/asm/traps.h
...
/*
* Page fault error code bits:
*
* bit 0 == 0: no page found 1: protection fault
* bit 1 == 0: read access 1: write access
* bit 2 == 0: kernel-mode access 1: user-mode access
* bit 3 == 1: use of reserved bit detected
* bit 4 == 1: fault was an instruction fetch
* bit 5 == 1: protection keys block access
*/
...
실습: 이해한 내용은 꼭 손으로 증명하자
0x6 == 000110
0x14 == 010100
Real Linux
$ cd git/linux
$ cat arch/x86/include/asm/traps.h
...
/*
* Page fault error code bits:
*
* bit 0 == 0: no page found 1: protection fault
* bit 1 == 0: read access 1: write access
* bit 2 == 0: kernel-mode access 1: user-mode access
* bit 3 == 1: use of reserved bit detected
* bit 4 == 1: fault was an instruction fetch
* bit 5 == 1: protection keys block access
*/
...
실습: 이해한 내용은 꼭 손으로 증명하자
0x6 == 000110
0x14 == 010100
Real Linux
$ make menuconfig
# CONFIG_X86_PTDUMP=y 설정하기
# Kernel hacking --->
# Export kernel pagetable layout to userspace via debugfs
실습: 이해한 내용은 꼭 손으로 증명하자
지금 내 리눅스에서
메모리 조각 관리 테이블인
페이지 테이블(pagetable) 확인
Real Linux
$ make menuconfig
# CONFIG_X86_PTDUMP=y 설정하기
# Kernel hacking --->
# Export kernel pagetable layout to userspace via debugfs
$ cd /sys/kernel/debug/page_tables/
실습: 이해한 내용은 꼭 손으로 증명하자Real Linux
지금 내 리눅스에서
메모리 조각 관리 테이블인
페이지 테이블(pagetable) 확인
$ make menuconfig
# CONFIG_X86_PTDUMP=y 설정하기
# Kernel hacking --->
# Export kernel pagetable layout to userspace via debugfs
$ cd /sys/kernel/debug/page_tables/
$ cat current_user | grep "--" | nl
1 ---[ User Space ]---
2 ---[ Kernel Space ]---
3 ---[ LDT remap ]---
4 ---[ Low Kernel Mapping ]---
5 ---[ vmalloc() Area ]---
...
11 ---[ Modules ]---
12 ---[ End Modules ]---
13 ---[ Fixmap Area ]---
실습: 이해한 내용은 꼭 손으로 증명하자Real Linux
지금 내 리눅스에서
메모리 조각 관리 테이블인
페이지 테이블(pagetable) 확인
$ make menuconfig
# CONFIG_X86_PTDUMP=y 설정하기
# Kernel hacking --->
# Export kernel pagetable layout to userspace via debugfs
$ cd /sys/kernel/debug/page_tables/
$ cat current_user | less
---[ User Space ]---
0x0000000000000000-0x0000560000000000 86T pgd
0x0000560000000000-0x0000562580000000 150G pud
0x0000562580000000-0x00005625bc000000 960M pmd
0x00005625bc000000-0x00005625bc038000 224K pte
0x00005625bc038000-0x00005625bc040000 32K USR ro x pte
...
실습: 이해한 내용은 꼭 손으로 증명하자Real Linux
교육과정 소개Real Linux
최신 리눅스기반으로 프로그래밍 내공쌓기
교육과정 소개Real Linux
최신 리눅스기반으로 프로그래밍 내공쌓기
이론은 압축적이고 핵심적으로 설명
교육과정 소개Real Linux
이론은 압축적이고 핵심적으로 설명
실습은 실용적이고 흥미로운 미션들과 함께
최신 리눅스기반으로 프로그래밍 내공쌓기
교육과정 소개Real Linux
이론은 압축적이고 핵심적으로
설명
최신 리눅스기반으로 프로그래밍 내공쌓기
실습은 실용적이고 흥미로운 미션들과 함께
이해한내용은 꼭 손으로 증명하자 !
교육과정 소개Real Linux
모든 개발자의 필수 기본내공
교육과정 소개Real Linux
컴퓨터 공학 기본기, SW 동작원리
모든 개발자의 필수 기본내공
OS 동작원리, 리눅스 기본기
교육과정 소개Real Linux
컴퓨터 공학 기본기, SW 동작원리
모든 개발자의 필수 기본내공
OS 동작원리, 리눅스 기본기
1~2달 만 투자하자 !
과정명 수준 기간 시간 정원
리눅스 노베이스 입문 4주과정: 매주 화,목 18:30-20:30 (2시간) 30명
리눅스 SW 기본 초중급 4주과정: 매주 화,목 20:45-22:45 (2시간) 30명
리눅스 OS 중급A,B 중급 4주과정: 매주 토 14:00-18:00 (4시간) 30명
리얼 Git 중고급 4주과정: 매주 월,수 19:30-22:30 (3시간) 30명
Real Linux 교육과정
* 개인노트북 준비물 필수
* OS 중급반A반, B반은 2달에 1회씩 개강합니다.
* 강남역 3,4번 출구 3분거리 (테헤란로4길 38-5 혜정빌딩 4층 리얼리눅스
강의장)
문의 help@reallinux.co.kr | 카카오톡: 리얼리눅스 | 자세한정보: http://www.reallinux.co.kr
새로 쌓는 진짜 SW 기본기
과정명 수준 기간 시간 정원
리눅스 노베이스 입문 4주과정: 매주 화,목 18:30-20:30 (2시간) 30명
리눅스 SW 기본 초중급 4주과정: 매주 화,목 20:45-22:45 (2시간) 30명
리눅스 OS 중급A,B 중급 4주과정: 매주 토 14:00-18:00 (4시간) 30명
리얼 Git 중고급 4주과정: 매주 월,수 19:30-22:30 (3시간) 30명
Real Linux 교육과정
* 개인노트북 준비물 필수
* OS 중급반A반, B반은 2달에 1회씩 개강합니다.
* 강남역 3,4번 출구 3분거리 (테헤란로4길 38-5 혜정빌딩 4층 리얼리눅스
강의장)
문의 help@reallinux.co.kr | 카카오톡: 리얼리눅스 | 자세한정보: http://www.reallinux.co.kr
새로 쌓는 진짜 SW 기본기
수강상담 & 문의
언제든 연락주세요!
리눅스 커널과 나의 서버프로그램의 관계 및 성능에 미치는
영향 ?
Server
Linux
nginx DB 1. Network I/O (ex. http request ..)
2. Disk I/O (ex. DB, Big file ..)
...
VFS Layer
Individual Filesystem Layer
Block Layer
System call Interface
GNU C Library user space
kernel space
User Applications
VFS Layer
Individual Filesystem Layer
Block Layer
System call Interface
GNU C Library user space
kernel space
User Applications
문제상황 : 커널버전 업그레이드 이후
Disk I/O 가 많아짐
문제상황 : 커널버전 업그레이드 이후
Disk I/O 가 많아짐
어디부터 봐야할까 ?
image from http://studyfoss.egloos.com/5585801
커널 구간별로 나눠서 지연시간 추적조사
image from http://studyfoss.egloos.com/5585801
커널 구간별로 나눠서 지연시간 추적조사
image from http://studyfoss.egloos.com/5585801
I/O 스케줄러에 따른 지연시간 비교
연이어지는 call-graph 상에서의 latency가 아니라
그냥 call count 가 많아서 생기는 latency ?
연이어지는 call-graph 상에서의 latency가 아니라
그냥 call count 가 많아서 생기는 latency ?
readahead 사이즈의 이해와 성능영향 조사
$ sudo su
# 새로운 tracepoint 추가하기
$ perf probe --add submit_bio
$ perf probe --add generic_file_read_iter
# 위 두가지 함수의 call count 추적하기
$ perf stat -e probe:submit_bio,probe:generic_file_read_iter
실습: 이해한 내용은 꼭 손으로 증명하자
submit_bio와 generic_file_read_iter
이벤트 추적 켜기(On)
Real Linux
$ sudo su
# man proc 참고: drop_caches 메모리상 disk cache drop
$ echo 3 > /proc/sys/vm/drop_caches
$ cd ~/git/linux
# read 연산 테스트
$ tree
실습: 이해한 내용은 꼭 손으로 증명하자
커널소스 읽기(read) 연산 테스트
Real Linux
$ sudo blockdev --getra /dev/sda
# readahead(미리읽기) 사이즈 변경
$ sudo blockdev --setra 8192 /dev/sda
$ echo 3 > /proc/sys/vm/drop_caches
$ cd ~/git/linux
# read 연산 테스트
$ tree
실습: 이해한 내용은 꼭 손으로 증명하자
readahead 사이즈 변경후 추적결과 비교
Real Linux
옆집 아저씨 컨테이너가 죽은 이유
옆집 아저씨 컨테이너가 죽은 이유
Container 란 ?
옆집 아저씨 컨테이너가 죽은 이유
Container 란 ?
(1)
(2)
옆집 아저씨 컨테이너가 죽은 이유
Container 란 ?
(1) namespace:
(2)
chroot
옆집 아저씨 컨테이너가 죽은 이유
Container 란 ?
(1) namespace: 나만의 공간
우리만의 공간
(2)
chroot
옆집 아저씨 컨테이너가 죽은 이유
Container 란 ?
(1) namespace: 나만의 공간
우리만의 공간
(2) cgroup:
chroot
옆집 아저씨 컨테이너가 죽은 이유
Container 란 ?
(1) namespace: 나만의 공간
우리만의 공간
(2) cgroup: 나만의 자원
우리만의 자원
chroot
옆집 아저씨 컨테이너가 죽은 이유
Container 란 ?
(1) namespace: 나만의 공간
우리만의 공간
(2) cgroup: 나만의 자원
우리만의 자원
chroot
옆집 아저씨 컨테이너가 죽은 이유
Container 란 ?
(1) namespace: 나만의 공간
우리만의 공간
(2) cgroup: 나만의 자원
우리만의 자원나만의
Linux
chroot
옆집 아저씨 컨테이너가 죽은 이유
Container 란 ?
(1) namespace: 나만의 공간
우리만의 공간
(2) cgroup: 나만의 자원
우리만의 자원나만의 Linux
우리만의 Linux
chroot
옆집 아저씨 컨테이너가 죽은 이유
Container 란 ?
Server
Host OS
Container Container Container
App A App B
App C
App D
나만의 Linux
우리만의 Linux
옆집 아저씨 컨테이너가 죽은 이유
Container 란 ?
Server
Host OS
Container Container Container
App A App B
App C
App D
나만의 Linux
우리만의 Linux
옆집 아저씨 컨테이너가 죽은 이유
Container 란 ?
Server
Host OS
Container Container Container
App A App B
App C
App D
나만의 Linux
우리만의 Linux
옆집 아저씨 컨테이너가 죽은 이유
Container 란 ?
Server
Host OS
Container Container Container
App A App B
App C
App D
Killed
나만의 Linux
우리만의 Linux
옆집 아저씨 컨테이너가 죽은 이유
Server
Host OS
Container Container Container
App A App B
App C
App D
Killed
1. 컨테이너의 커맨드가 실패한 경우
2. 컨테이너의 커맨드가 존재하지 않는 경우
3. 컨테이너가 SIGKILL 및 SIGTERM 을 받은 경우
...
$ ls /
$ wget https://github.com/ericchiang/containers-from-scratch/releases/download/v0.1.0/rootfs.tar.gz
$ ls rootfs/
# 나만의 root filesystem 공간 만들기
$ sudo chroot rootfs /bin/bash
# 실제 root filesystem / 와 현재 / 비교하기
$ ls /
실습: 이해한 내용은 꼭 손으로 증명하자Real Linux
chroot 실습: 나만의 root filesystem 공간
$ sudo chroot rootfs /bin/bash
# chroot 이후의 ps 와
$ ps aux
$ sudo unshare -p -f --mount-proc=rootfs/proc chroot rootfs /bin/bash
# PID namespace 이후의 ps 의 결과 비교하기
$ ps aux
실습: 이해한 내용은 꼭 손으로 증명하자Real Linux
PID namespace 실습: 나만의 PID 공간
$ sudo su
$ mkdir /sys/fs/cgroup/memory/test
# 100MB 제한
$ echo 100000000 > /sys/fs/cgroup/memory/test/memory.limit_in_bytes
$ echo 0 > /sys/fs/cgroup/memory/test/memory.swappiness
실습: 이해한 내용은 꼭 손으로 증명하자Real Linux
cgroup 실습: 나만의 memory 자원
$ echo $$ > /sys/fs/cgroup/memory/test/tasks
$ cat mem_eater.py
f = open("/dev/urandom", "r")
data = ""
i=0
while True:
data += f.read(10000000) # 10mb
i += 1
print "%dmb" % (i*10,)
$ python mem_eater.py
실습: 이해한 내용은 꼭 손으로 증명하자Real Linux
cgroup 실습: 프로세스 죽는 과정실습
$ cd /sys/kernel/debug/tracing
$ echo 1 > events/oom/enable
$ echo 1 > options/stacktrace
$ cat trace_pipe
# 다른 터미널로 예제 python 실행하고 OOM으로 죽는 과정 trace_pipe로 추적하기
$ python mem_eater.py
실습: 이해한 내용은 꼭 손으로 증명하자Real Linux
cgroup 실습: OOM으로 죽는 과정추적
“ 리눅스는 더이상 어두운 Hidden box가 아닙니다. ”
실용적인 커널 Tracing 실습교육과 함께 쉽고 빠르게
(1) 실제 동작과정을 추적해보고
(2) 나의 프로그램과 리눅스 커널과의 관계도 분석하고
(3) 성능에 끼치는 영향까지 이해합니다.
Thanks,
리얼리눅스
http://RealLinux.co.kr

More Related Content

What's hot

Git 더하기 GitHub(구름IDE 환경)
Git 더하기 GitHub(구름IDE 환경)Git 더하기 GitHub(구름IDE 환경)
Git 더하기 GitHub(구름IDE 환경)Junyoung Lee
 
Git & Github Seminar-1
Git & Github Seminar-1Git & Github Seminar-1
Git & Github Seminar-1sangyun han
 
2011년 KTH H3 컨퍼런스 Track B, 세션4 "Advanced Git" by A.J
2011년 KTH H3 컨퍼런스 Track B, 세션4 "Advanced Git" by A.J2011년 KTH H3 컨퍼런스 Track B, 세션4 "Advanced Git" by A.J
2011년 KTH H3 컨퍼런스 Track B, 세션4 "Advanced Git" by A.JAndrew J. Kim
 
제로부터시작하는 Git 두번째 이야기
제로부터시작하는 Git 두번째 이야기제로부터시작하는 Git 두번째 이야기
제로부터시작하는 Git 두번째 이야기Mario Cho
 
Git 사용 가이드
Git 사용 가이드Git 사용 가이드
Git 사용 가이드도형 임
 
2nd ROS Tutorial Seminar Section 2
2nd ROS Tutorial Seminar Section 22nd ROS Tutorial Seminar Section 2
2nd ROS Tutorial Seminar Section 2Yoonseok Pyo
 
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git민태 김
 
Git 더하기 GitHub(Git클라이언트 활용) / Getting started with git+github
Git 더하기 GitHub(Git클라이언트 활용) / Getting started with git+githubGit 더하기 GitHub(Git클라이언트 활용) / Getting started with git+github
Git 더하기 GitHub(Git클라이언트 활용) / Getting started with git+githubJunyoung Lee
 
Git branch stregagy & case study
Git branch stregagy & case studyGit branch stregagy & case study
Git branch stregagy & case studyWoo Jin Kim
 
200718 덕성여대 생물정보학 강의 :: 생물정보학 파이썬
200718 덕성여대 생물정보학 강의 :: 생물정보학 파이썬200718 덕성여대 생물정보학 강의 :: 생물정보학 파이썬
200718 덕성여대 생물정보학 강의 :: 생물정보학 파이썬Joohyun Han
 
200718 덕성여대 생물정보학 강의 :: 바이오파이썬 covid-19
200718 덕성여대 생물정보학 강의 :: 바이오파이썬 covid-19200718 덕성여대 생물정보학 강의 :: 바이오파이썬 covid-19
200718 덕성여대 생물정보학 강의 :: 바이오파이썬 covid-19Joohyun Han
 
성미급한 사람들을 위한 아파치 설치
성미급한 사람들을 위한 아파치 설치성미급한 사람들을 위한 아파치 설치
성미급한 사람들을 위한 아파치 설치경민 남
 
Git 입문자를 위한 가이드
Git 입문자를 위한 가이드Git 입문자를 위한 가이드
Git 입문자를 위한 가이드chandler0201
 
System Hacking Tutorial #4 - Buffer Overflow - Return Oriented Programming ak...
System Hacking Tutorial #4 - Buffer Overflow - Return Oriented Programming ak...System Hacking Tutorial #4 - Buffer Overflow - Return Oriented Programming ak...
System Hacking Tutorial #4 - Buffer Overflow - Return Oriented Programming ak...sanghwan ahn
 
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담Sumin Byeon
 
GitHub 실습 교육
GitHub 실습 교육GitHub 실습 교육
GitHub 실습 교육승엽 신
 

What's hot (18)

Git 더하기 GitHub(구름IDE 환경)
Git 더하기 GitHub(구름IDE 환경)Git 더하기 GitHub(구름IDE 환경)
Git 더하기 GitHub(구름IDE 환경)
 
Git & Github Seminar-1
Git & Github Seminar-1Git & Github Seminar-1
Git & Github Seminar-1
 
2011년 KTH H3 컨퍼런스 Track B, 세션4 "Advanced Git" by A.J
2011년 KTH H3 컨퍼런스 Track B, 세션4 "Advanced Git" by A.J2011년 KTH H3 컨퍼런스 Track B, 세션4 "Advanced Git" by A.J
2011년 KTH H3 컨퍼런스 Track B, 세션4 "Advanced Git" by A.J
 
Git
GitGit
Git
 
제로부터시작하는 Git 두번째 이야기
제로부터시작하는 Git 두번째 이야기제로부터시작하는 Git 두번째 이야기
제로부터시작하는 Git 두번째 이야기
 
Git 사용 가이드
Git 사용 가이드Git 사용 가이드
Git 사용 가이드
 
2nd ROS Tutorial Seminar Section 2
2nd ROS Tutorial Seminar Section 22nd ROS Tutorial Seminar Section 2
2nd ROS Tutorial Seminar Section 2
 
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
 
Advanced git
Advanced gitAdvanced git
Advanced git
 
Git 더하기 GitHub(Git클라이언트 활용) / Getting started with git+github
Git 더하기 GitHub(Git클라이언트 활용) / Getting started with git+githubGit 더하기 GitHub(Git클라이언트 활용) / Getting started with git+github
Git 더하기 GitHub(Git클라이언트 활용) / Getting started with git+github
 
Git branch stregagy & case study
Git branch stregagy & case studyGit branch stregagy & case study
Git branch stregagy & case study
 
200718 덕성여대 생물정보학 강의 :: 생물정보학 파이썬
200718 덕성여대 생물정보학 강의 :: 생물정보학 파이썬200718 덕성여대 생물정보학 강의 :: 생물정보학 파이썬
200718 덕성여대 생물정보학 강의 :: 생물정보학 파이썬
 
200718 덕성여대 생물정보학 강의 :: 바이오파이썬 covid-19
200718 덕성여대 생물정보학 강의 :: 바이오파이썬 covid-19200718 덕성여대 생물정보학 강의 :: 바이오파이썬 covid-19
200718 덕성여대 생물정보학 강의 :: 바이오파이썬 covid-19
 
성미급한 사람들을 위한 아파치 설치
성미급한 사람들을 위한 아파치 설치성미급한 사람들을 위한 아파치 설치
성미급한 사람들을 위한 아파치 설치
 
Git 입문자를 위한 가이드
Git 입문자를 위한 가이드Git 입문자를 위한 가이드
Git 입문자를 위한 가이드
 
System Hacking Tutorial #4 - Buffer Overflow - Return Oriented Programming ak...
System Hacking Tutorial #4 - Buffer Overflow - Return Oriented Programming ak...System Hacking Tutorial #4 - Buffer Overflow - Return Oriented Programming ak...
System Hacking Tutorial #4 - Buffer Overflow - Return Oriented Programming ak...
 
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
 
GitHub 실습 교육
GitHub 실습 교육GitHub 실습 교육
GitHub 실습 교육
 

Similar to 리얼리눅스 제 1 회 세미나: "리눅스, 제대로 알고 코딩하자!"

도커없이 컨테이너 만들기 1편
도커없이 컨테이너 만들기 1편도커없이 컨테이너 만들기 1편
도커없이 컨테이너 만들기 1편Sam Kim
 
cross compile
cross compilecross compile
cross compilehe4722
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기Chanwoong Kim
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 YoungSu Son
 
Hyperledger fabric practice(pdf)
Hyperledger fabric practice(pdf)Hyperledger fabric practice(pdf)
Hyperledger fabric practice(pdf)wonyong hwang
 
망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9종인 전
 
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축Ji-Woong Choi
 
셸 스크립트를 이용한 클라우드 시스템 운영
셸 스크립트를 이용한 클라우드 시스템 운영셸 스크립트를 이용한 클라우드 시스템 운영
셸 스크립트를 이용한 클라우드 시스템 운영Nalee Jang
 
우분투에 시스템콜 추가하기
우분투에 시스템콜 추가하기우분투에 시스템콜 추가하기
우분투에 시스템콜 추가하기Hoyoung Jung
 
도커 없이 컨테이너 만들기 2편
도커 없이 컨테이너 만들기 2편도커 없이 컨테이너 만들기 2편
도커 없이 컨테이너 만들기 2편Sam Kim
 
kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340Samsung Electronics
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발Jeongkyu Shin
 
망고100 보드로 놀아보자 17
망고100 보드로 놀아보자 17망고100 보드로 놀아보자 17
망고100 보드로 놀아보자 17종인 전
 
안드로이드 플랫폼 설명
안드로이드 플랫폼 설명안드로이드 플랫폼 설명
안드로이드 플랫폼 설명Peter YoungSik Yun
 
소프트박스 라즈베리파이 교육키트 개발환경 설정
소프트박스 라즈베리파이 교육키트 개발환경 설정소프트박스 라즈베리파이 교육키트 개발환경 설정
소프트박스 라즈베리파이 교육키트 개발환경 설정봉조 김
 
[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래NAVER D2
 
XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 Docker
XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 DockerXECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 Docker
XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 DockerXpressEngine
 
리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리Seungyong Lee
 
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기Sumin Byeon
 

Similar to 리얼리눅스 제 1 회 세미나: "리눅스, 제대로 알고 코딩하자!" (20)

도커없이 컨테이너 만들기 1편
도커없이 컨테이너 만들기 1편도커없이 컨테이너 만들기 1편
도커없이 컨테이너 만들기 1편
 
cross compile
cross compilecross compile
cross compile
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드
 
Hyperledger fabric practice(pdf)
Hyperledger fabric practice(pdf)Hyperledger fabric practice(pdf)
Hyperledger fabric practice(pdf)
 
망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9
 
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
 
셸 스크립트를 이용한 클라우드 시스템 운영
셸 스크립트를 이용한 클라우드 시스템 운영셸 스크립트를 이용한 클라우드 시스템 운영
셸 스크립트를 이용한 클라우드 시스템 운영
 
우분투에 시스템콜 추가하기
우분투에 시스템콜 추가하기우분투에 시스템콜 추가하기
우분투에 시스템콜 추가하기
 
도커 없이 컨테이너 만들기 2편
도커 없이 컨테이너 만들기 2편도커 없이 컨테이너 만들기 2편
도커 없이 컨테이너 만들기 2편
 
Raspberry Pi Basic Usage
Raspberry Pi Basic UsageRaspberry Pi Basic Usage
Raspberry Pi Basic Usage
 
kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
 
망고100 보드로 놀아보자 17
망고100 보드로 놀아보자 17망고100 보드로 놀아보자 17
망고100 보드로 놀아보자 17
 
안드로이드 플랫폼 설명
안드로이드 플랫폼 설명안드로이드 플랫폼 설명
안드로이드 플랫폼 설명
 
소프트박스 라즈베리파이 교육키트 개발환경 설정
소프트박스 라즈베리파이 교육키트 개발환경 설정소프트박스 라즈베리파이 교육키트 개발환경 설정
소프트박스 라즈베리파이 교육키트 개발환경 설정
 
[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래
 
XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 Docker
XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 DockerXECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 Docker
XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 Docker
 
리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리
 
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
 

리얼리눅스 제 1 회 세미나: "리눅스, 제대로 알고 코딩하자!"

  • 1. " 리눅스, 제대로 알고 코딩하자 " 2019년 9월 5일(목) 오후 8시 ~ 10시 리얼리눅스 강의장(강남) http://kko.to/SxNc-4xjH Real Linux 교육세미나 제 1 회 1 리눅스 커널도 C 프로그램 이다 PM 08:00 ~ 08:30 (30분) 2 Pagefault는 왜 발생할까 ? "a=b;의 진실" PM 08:30 ~ 08:55 (25분) 3 휴식 PM 08:55 ~ 09:05 (10분) 4 리얼 리눅스 교육과정 소개 PM 09:05 ~ 09:15 (10분) 5 리눅스 커널과 나의 서버 프로그램의 관계 및 성능에 미치는 영향 PM 09:15 ~ 09:35 (20분) 6 옆집 아저씨 컨테이너가 죽은 이유 PM 09:35 ~ 10:00 (25분)
  • 3. 리눅스 커널도 C 프로그램이다.
  • 4. 리눅스 커널도 C 프로그램이다. OS 란 ?
  • 5. 리눅스 커널도 C 프로그램이다. OS 란 ?
  • 6. 리눅스 커널도 C 프로그램이다. OS 가 하는일 ?
  • 7. 리눅스 커널도 C 프로그램이다. OS 가 하는일 ? (1) (2)
  • 8. 리눅스 커널도 C 프로그램이다. OS 가 하는일 ? (1) 사용자 application 관리 (2)
  • 9. 리눅스 커널도 C 프로그램이다. OS 가 하는일 ? (1) 사용자 application 관리 (2) HW 자원관리 (cpu, RAM, disk 등)
  • 10. 리눅스 커널도 C 프로그램이다. OS 의 구성 - Core 부분: - I/O 처리: - 기타:
  • 11. 리눅스 커널도 C 프로그램이다. OS 의 구성 - Core 부분: - I/O 처리: - 기타: security, tools, sounds, ...
  • 12. 리눅스 커널도 C 프로그램이다. OS 의 구성 - Core 부분: PM(process management) MM(memory management) - I/O 처리: - 기타: security, tools, sounds, ...
  • 13. 리눅스 커널도 C 프로그램이다. OS 의 구성 - Core 부분: PM(process management) MM(memory management) irq / exception 처리, locking - I/O 처리: - 기타: security, tools, sounds, ...
  • 14. 리눅스 커널도 C 프로그램이다. OS 의 구성 - Core 부분: PM(process management) MM(memory management) irq / exception 처리, locking - I/O 처리: 네트워크 - 기타: security, tools, sounds, ...
  • 15. 리눅스 커널도 C 프로그램이다. OS 의 구성 - Core 부분: PM(process management) MM(memory management) irq / exception 처리, locking - I/O 처리: 네트워크 스토리지 (VFS/FS/Block) - 기타: security, tools, sounds, ...
  • 16. 리눅스 커널도 C 프로그램이다. OS 의 구성 - Core 부분: PM(process management) MM(memory management) irq / exception 처리, locking - I/O 처리: 네트워크 스토리지 (VFS/FS/Block) 디바이스 드라이버 - 기타: security, tools, sounds, ...
  • 17. $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 리눅스 커널(OS)소스를 받자 ! 실습: 이해한 내용은 꼭 손으로 증명하자Real Linux
  • 18. $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 리눅스 커널(OS)소스를 받자 ! 실습: 이해한 내용은 꼭 손으로 증명하자 리눅스 커널 소스 저장소 URL소스 다운로드 Real Linux
  • 19. $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git $ cd linux/ 실습: 이해한 내용은 꼭 손으로 증명하자 리눅스 커널(OS)소스폴더로 들어가서 Real Linux
  • 20. $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git $ cd linux/ 리눅스 커널(OS)소스폴더로 들어가서 실습: 이해한 내용은 꼭 손으로 증명하자Real Linux
  • 21. $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git $ cd linux/ $ ls arch crypto firmware Kbuild MAINTAINERS README tools block cscope.files fs Kconfig Makefile samples usr certs cscope.out include kernel mm scripts virt COPYING Documentation init lib Module.symvers security CREDITS drivers ipc LICENSES net sound 리눅스 커널(OS) 구성을 확인하자 ! 실습: 이해한 내용은 꼭 손으로 증명하자Real Linux
  • 22. $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git $ cd linux/ $ ls arch crypto firmware Kbuild MAINTAINERS README tools block cscope.files fs Kconfig Makefile samples usr certs cscope.out include kernel mm scripts virt COPYING Documentation init lib Module.symvers security CREDITS drivers ipc LICENSES net sound 실습: 이해한 내용은 꼭 손으로 증명하자 리눅스 커널(OS) 구성을 확인하자 ! Real Linux
  • 23. $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git $ cd linux/ $ ls arch crypto firmware Kbuild MAINTAINERS README tools block cscope.files fs Kconfig Makefile samples usr certs cscope.out include kernel mm scripts virt COPYING Documentation init lib Module.symvers security CREDITS drivers ipc LICENSES net sound 실습: 이해한 내용은 꼭 손으로 증명하자 리눅스 커널(OS) 구성을 확인하자 ! Real Linux
  • 24. $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git $ cd linux/ $ ls arch crypto firmware Kbuild MAINTAINERS README tools block cscope.files fs Kconfig Makefile samples usr certs cscope.out include kernel mm scripts virt COPYING Documentation init lib Module.symvers security CREDITS drivers ipc LICENSES net sound $ make -j8 실습: 이해한 내용은 꼭 손으로 증명하자Real Linux 리눅스 커널(OS) 소스 컴파일 해놓고
  • 25. $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git $ cd linux/ $ ls arch crypto firmware Kbuild MAINTAINERS README tools block cscope.files fs Kconfig Makefile samples usr certs cscope.out include kernel mm scripts virt COPYING Documentation init lib Module.symvers security CREDITS drivers ipc LICENSES net sound $ make -j8 실습: 이해한 내용은 꼭 손으로 증명하자 리눅스 커널(OS) 소스 컴파일 해놓고 Real Linux
  • 26. $ cd ~/ $ vim hello.c $ cat hello.c #include <stdio.h> void main() { printf("hellon"); } 실습: 이해한 내용은 꼭 손으로 증명하자 간단한 C소스코드 만들어서 Real Linux
  • 27. $ cd ~/ $ vim hello.c $ cat hello.c #include <stdio.h> void main() { printf("hellon"); } 실습: 이해한 내용은 꼭 손으로 증명하자 간단한 C소스코드 만들어서 Real Linux
  • 28. $ cd ~/ $ vim hello.c $ cat hello.c #include <stdio.h> void main() { printf("hellon"); } $ file hello.c hello.c: C source, ASCII text 실습: 이해한 내용은 꼭 손으로 증명하자 간단한 C소스코드 만들어서 확인 Real Linux
  • 29. $ cd ~/ $ vim hello.c $ cat hello.c #include <stdio.h> void main() { printf("hellon"); } $ file hello.c hello.c: C source, ASCII text 실습: 이해한 내용은 꼭 손으로 증명하자 간단한 C소스코드 만들어서 확인 Real Linux
  • 30. $ file hello.c hello.c: C source, ASCII text $ gcc hello.c $ ./a.out 실습: 이해한 내용은 꼭 손으로 증명하자 hello.c 컴파일해서 실행파일 a.out 실행 Real Linux
  • 31. $ file hello.c hello.c: C source, ASCII text $ gcc hello.c $ ./a.out hello 실습: 이해한 내용은 꼭 손으로 증명하자 hello.c 컴파일해서 실행파일 a.out 실행 Real Linux
  • 32. $ file hello.c hello.c: C source, ASCII text $ gcc hello.c $ ./a.out $ file a.out 실습: 이해한 내용은 꼭 손으로 증명하자 컴파일한 C프로그램 바이너리(a.out)를 확인 Real Linux
  • 33. $ file hello.c hello.c: C source, ASCII text $ gcc hello.c $ ./a.out $ file a.out a.out: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=a443aa2712c9802b2f193b4678fffcdc2a7557e4, not stripped 실습: 이해한 내용은 꼭 손으로 증명하자 컴파일한 C프로그램 바이너리(a.out)를 확인 Real Linux
  • 34. $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git $ cd linux/ $ file kernel/fork.c kernel/fork.c: C source, ASCII text 실습: 이해한 내용은 꼭 손으로 증명하자 리눅스 커널(OS)의 C 소스파일 확인 Real Linux
  • 35. $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git $ cd linux/ $ file kernel/fork.c kernel/fork.c: C source, ASCII text 실습: 이해한 내용은 꼭 손으로 증명하자 리눅스 커널(OS)의 C 소스파일 확인 Real Linux
  • 36. $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git $ cd linux/ $ file kernel/fork.c kernel/fork.c: C source, ASCII text $ file vmlinux 실습: 이해한 내용은 꼭 손으로 증명하자 컴파일한 바이너리(vmlinux)의 C 소스 파일확인 Real Linux
  • 37. $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git $ cd linux/ $ file kernel/fork.c kernel/fork.c: C source, ASCII text $ file vmlinux vmlinux: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=5738f667cb6387e77a4439dc66c2ae6c5a4cb24f, with debug_info, not stripped 실습: 이해한 내용은 꼭 손으로 증명하자 컴파일한 바이너리(vmlinux)의 C 소스 파일확인 Real Linux
  • 38. Page fault 는 왜 발생할까 ?
  • 39. Page fault 는 왜 발생할까 ? 메모리를 관리하는 하나의 매커니즘
  • 40. Page fault 는 왜 발생할까 ? 메모리를 관리하는 하나의 매커니즘 진짜 메모리 조각을 주지않고 가상 메모리 조각만 준다.
  • 41. Page fault 는 왜 발생할까 ? 메모리를 관리하는 하나의 매커니즘 진짜 메모리 조각을 주지않고 가상 메모리 조각만 준다.
  • 43. Chrome vim slack 메모리 사용할 친구들 메모리 여러조각으로 나눠서 관리
  • 45. Chrome vim slack 메모리 사용할 친구들 page page page page page page page 메모리 여러조각으로 나눠서 관리 진짜 메모리 조각은 안주고
  • 46. Chrome vim slack 메모리 사용할 친구들 page page page page page page page 메모리 여러조각으로 나눠서 관리 가상 메모리 조각만 주고 시작 page page page page page page page page page
  • 47. Chrome vim slack 메모리 사용할 친구들 page page page page page page page 메모리 여러조각으로 나눠서 관리 가상 메모리 조각만 주고 시작 page page page page page page page page page 한 조각 크기 4KB
  • 48. Chrome vim slack 메모리 사용할 친구들 page page page page page page page 메모리 여러조각으로 나눠서 관리 가상 메모리 조각만 주고 시작 page page page page page page page page page 한 조각 크기 4KB 주소당 1 바이트
  • 49. Chrome vim slack 메모리 사용할 친구들 page page page page page page page 메모리 여러조각으로 나눠서 관리 가상 메모리 조각만 주고 시작 page page page page page page page page page 한 조각 크기 4KB 주소당 1 바이트 4K 개 주소
  • 50. Chrome vim slack 메모리 사용할 친구들 page page page page page page page 메모리 여러조각으로 나눠서 관리 가상 메모리 조각만 주고 시작 page page page page page page page page page 한 조각 크기 4KB 주소당 1 바이트 4K 개 주소 사용할 수 있는 가상주소도 page당 4K 개 있다.
  • 51. Chrome vim slack 메모리 사용할 친구들 page page page page page page page 메모리 여러조각으로 나눠서 관리 가상 메모리 조각만 주고 시작 page page page page page page page page page 한 조각 크기 4KB 주소당 1 바이트 4K 개 주소 사용할 수 있는 가상주소도 page당 4K 개 있다. 4K == 4096 개
  • 52. Chrome vim slack 메모리 사용할 친구들 page page page page page page page 메모리 여러조각으로 나눠서 관리 가상 메모리 조각만 주고 시작 page page page page page page page page page
  • 53. Chrome vim slack 메모리 사용할 친구들 page page page page page page page 메모리 여러조각으로 나눠서 관리 가상 메모리 조각만 주고 시작 page page page page page page page page page 가상주소 물리주소 0x555b7 NULL ... ... 가상주소 물리주소 0x7f788 NULL ... ... 가상주소 물리주소 0x7f788 NULL ... ... Chrome의 메모리 조각 관리 테이블 Vim의 메모리 조각 관리 테이블 Slack의 메모리 조각 관리 테이블
  • 54. Chrome vim slack 메모리 사용할 친구들 page page page page page page page 메모리 여러조각으로 나눠서 관리 가상 메모리 조각만 주고 시작 page page page page page page page page page 가상주소 물리주소 0x555b7 NULL ... ... 가상주소 물리주소 0x7f788 NULL ... ... 가상주소 물리주소 0x7f788 NULL ... ... Chrome의 메모리 조각 관리 테이블 Vim의 메모리 조각 관리 테이블 Slack의 메모리 조각 관리 테이블 실제로 사용!
  • 55. Chrome vim slack 메모리 사용할 친구들 page page page page page page page 메모리 여러조각으로 나눠서 관리 가상 메모리 조각만 주고 시작 page page page page page page page page page 가상주소 물리주소 0x555b7 NULL ... ... 가상주소 물리주소 0x7f788 NULL ... ... 가상주소 물리주소 0x7f788 NULL ... ... Chrome의 메모리 조각 관리 테이블 Vim의 메모리 조각 관리 테이블 Slack의 메모리 조각 관리 테이블 실제로 사용! 코드 .text a = b;
  • 56. Chrome vim slack 메모리 사용할 친구들 page page page page page page page 메모리 여러조각으로 나눠서 관리 가상 메모리 조각만 주고 시작 page page page page page page page page page 가상주소 물리주소 0x555b7 NULL ... ... 가상주소 물리주소 0x7f788 NULL ... ... 가상주소 물리주소 0x7f788 NULL ... ... Chrome의 메모리 조각 관리 테이블 Vim의 메모리 조각 관리 테이블 Slack의 메모리 조각 관리 테이블 실제로 사용! a = b; 코드 .text
  • 57. Chrome vim slack 메모리 사용할 친구들 page page page page page page page 메모리 여러조각으로 나눠서 관리 가상 메모리 조각만 주고 시작 page page page page page page page page page 가상주소 물리주소 0x555b7 NULL ... ... 가상주소 물리주소 0x7f788 NULL ... ... 가상주소 물리주소 0x7f788 NULL ... ... Chrome의 메모리 조각 관리 테이블 Vim의 메모리 조각 관리 테이블 Slack의 메모리 조각 관리 테이블 실제로 사용! a = b; 코드 .text
  • 58. Chrome vim slack 메모리 사용할 친구들 page page page page page page page 메모리 여러조각으로 나눠서 관리 가상 메모리 조각만 주고 시작 page page page page page page page page page 가상주소 물리주소 0x555b7 NULL ... ... 가상주소 물리주소 0x7f788 NULL ... ... 가상주소 물리주소 0x7f788 NULL ... ... Chrome의 메모리 조각 관리 테이블 Vim의 메모리 조각 관리 테이블 Slack의 메모리 조각 관리 테이블 실제로 사용! a = b; 코드 .text 페이지 폴트 !
  • 59. $ sudo su $ cd /sys/kernel/debug/tracing 실습: 이해한 내용은 꼭 손으로 증명하자 sudo 권한으로 커널 tracing 폴더로 이동 Real Linux
  • 60. $ sudo su $ cd /sys/kernel/debug/tracing 실습: 이해한 내용은 꼭 손으로 증명하자 sudo 권한으로 커널 tracing 폴더로 이동 Real Linux
  • 61. $ sudo su $ cd /sys/kernel/debug/tracing $ echo 1 > events/exceptions/page_fault_user/enable 실습: 이해한 내용은 꼭 손으로 증명하자 pagefault 이벤트 추적 tracing 켜기(On) Real Linux
  • 62. $ sudo su $ cd /sys/kernel/debug/tracing $ echo 1 > events/exceptions/page_fault_user/enable 실습: 이해한 내용은 꼭 손으로 증명하자 pagefault 이벤트 추적 tracing 켜기(On) Real Linux
  • 63. $ sudo su $ cd /sys/kernel/debug/tracing $ echo 1 > events/exceptions/page_fault_user/enable $ cat trace_pipe slack-2296 [002] d... 97297.874783: page_fault_user: address=0x187d0de09000 ip=0x3d035249316c error_code=0x6 chrome-19660 [001] d... 97297.875595: page_fault_user: address=0x1f77e6754000 ip=0x7fdb53e1cb1f error_code=0x6 ... Gitter-1868 [006] d... 97297.975040: page_fault_user: address=0x7f6801054200 ip=0x7f6801054200 error_code=0x14 chrome-19660 [007] d... 97297.976004: page_fault_user: address=0x1f77e6754000 ip=0x7fdb53e1cb1f error_code=0x6 ... 실습: 이해한 내용은 꼭 손으로 증명하자 지금 내 리눅스에서 발생하는 페이지 폴트(pagefault) 확인 Real Linux
  • 64. $ sudo su $ cd /sys/kernel/debug/tracing $ echo 1 > events/exceptions/page_fault_user/enable $ cat trace_pipe slack-2296 [002] d... 97297.874783: page_fault_user: address=0x187d0de09000 ip=0x3d035249316c error_code=0x6 chrome-19660 [001] d... 97297.875595: page_fault_user: address=0x1f77e6754000 ip=0x7fdb53e1cb1f error_code=0x6 ... Gitter-1868 [006] d... 97297.975040: page_fault_user: address=0x7f6801054200 ip=0x7f6801054200 error_code=0x14 chrome-19660 [007] d... 97297.976004: page_fault_user: address=0x1f77e6754000 ip=0x7fdb53e1cb1f error_code=0x6 ... 실습: 이해한 내용은 꼭 손으로 증명하자 지금 내 리눅스에서 발생하는 페이지 폴트(pagefault) 확인 Real Linux
  • 65. $ sudo su $ cd /sys/kernel/debug/tracing $ echo 1 > events/exceptions/page_fault_user/enable $ cat trace_pipe slack-2296 [002] d... 97297.874783: page_fault_user: address=0x187d0de09000 ip=0x3d035249316c error_code=0x6 chrome-19660 [001] d... 97297.875595: page_fault_user: address=0x1f77e6754000 ip=0x7fdb53e1cb1f error_code=0x6 ... Gitter-1868 [006] d... 97297.975040: page_fault_user: address=0x7f6801054200 ip=0x7f6801054200 error_code=0x14 chrome-19660 [007] d... 97297.976004: page_fault_user: address=0x1f77e6754000 ip=0x7fdb53e1cb1f error_code=0x6 ... 실습: 이해한 내용은 꼭 손으로 증명하자 지금 내 리눅스에서 발생하는 페이지 폴트(pagefault) 확인 Real Linux
  • 66. $ cd git/linux $ cat arch/x86/include/asm/traps.h ... /* * Page fault error code bits: * * bit 0 == 0: no page found 1: protection fault * bit 1 == 0: read access 1: write access * bit 2 == 0: kernel-mode access 1: user-mode access * bit 3 == 1: use of reserved bit detected * bit 4 == 1: fault was an instruction fetch * bit 5 == 1: protection keys block access */ ... 실습: 이해한 내용은 꼭 손으로 증명하자 0x6 == 000110 0x14 == 010100 Real Linux
  • 67. $ cd git/linux $ cat arch/x86/include/asm/traps.h ... /* * Page fault error code bits: * * bit 0 == 0: no page found 1: protection fault * bit 1 == 0: read access 1: write access * bit 2 == 0: kernel-mode access 1: user-mode access * bit 3 == 1: use of reserved bit detected * bit 4 == 1: fault was an instruction fetch * bit 5 == 1: protection keys block access */ ... 실습: 이해한 내용은 꼭 손으로 증명하자 0x6 == 000110 0x14 == 010100 Real Linux
  • 68. $ cd git/linux $ cat arch/x86/include/asm/traps.h ... /* * Page fault error code bits: * * bit 0 == 0: no page found 1: protection fault * bit 1 == 0: read access 1: write access * bit 2 == 0: kernel-mode access 1: user-mode access * bit 3 == 1: use of reserved bit detected * bit 4 == 1: fault was an instruction fetch * bit 5 == 1: protection keys block access */ ... 실습: 이해한 내용은 꼭 손으로 증명하자 0x6 == 000110 0x14 == 010100 Real Linux
  • 69. $ cd git/linux $ cat arch/x86/include/asm/traps.h ... /* * Page fault error code bits: * * bit 0 == 0: no page found 1: protection fault * bit 1 == 0: read access 1: write access * bit 2 == 0: kernel-mode access 1: user-mode access * bit 3 == 1: use of reserved bit detected * bit 4 == 1: fault was an instruction fetch * bit 5 == 1: protection keys block access */ ... 실습: 이해한 내용은 꼭 손으로 증명하자 0x6 == 000110 0x14 == 010100 Real Linux
  • 70. $ cd git/linux $ cat arch/x86/include/asm/traps.h ... /* * Page fault error code bits: * * bit 0 == 0: no page found 1: protection fault * bit 1 == 0: read access 1: write access * bit 2 == 0: kernel-mode access 1: user-mode access * bit 3 == 1: use of reserved bit detected * bit 4 == 1: fault was an instruction fetch * bit 5 == 1: protection keys block access */ ... 실습: 이해한 내용은 꼭 손으로 증명하자 0x6 == 000110 0x14 == 010100 Real Linux
  • 71. $ make menuconfig # CONFIG_X86_PTDUMP=y 설정하기 # Kernel hacking ---> # Export kernel pagetable layout to userspace via debugfs 실습: 이해한 내용은 꼭 손으로 증명하자 지금 내 리눅스에서 메모리 조각 관리 테이블인 페이지 테이블(pagetable) 확인 Real Linux
  • 72. $ make menuconfig # CONFIG_X86_PTDUMP=y 설정하기 # Kernel hacking ---> # Export kernel pagetable layout to userspace via debugfs $ cd /sys/kernel/debug/page_tables/ 실습: 이해한 내용은 꼭 손으로 증명하자Real Linux 지금 내 리눅스에서 메모리 조각 관리 테이블인 페이지 테이블(pagetable) 확인
  • 73. $ make menuconfig # CONFIG_X86_PTDUMP=y 설정하기 # Kernel hacking ---> # Export kernel pagetable layout to userspace via debugfs $ cd /sys/kernel/debug/page_tables/ $ cat current_user | grep "--" | nl 1 ---[ User Space ]--- 2 ---[ Kernel Space ]--- 3 ---[ LDT remap ]--- 4 ---[ Low Kernel Mapping ]--- 5 ---[ vmalloc() Area ]--- ... 11 ---[ Modules ]--- 12 ---[ End Modules ]--- 13 ---[ Fixmap Area ]--- 실습: 이해한 내용은 꼭 손으로 증명하자Real Linux 지금 내 리눅스에서 메모리 조각 관리 테이블인 페이지 테이블(pagetable) 확인
  • 74. $ make menuconfig # CONFIG_X86_PTDUMP=y 설정하기 # Kernel hacking ---> # Export kernel pagetable layout to userspace via debugfs $ cd /sys/kernel/debug/page_tables/ $ cat current_user | less ---[ User Space ]--- 0x0000000000000000-0x0000560000000000 86T pgd 0x0000560000000000-0x0000562580000000 150G pud 0x0000562580000000-0x00005625bc000000 960M pmd 0x00005625bc000000-0x00005625bc038000 224K pte 0x00005625bc038000-0x00005625bc040000 32K USR ro x pte ... 실습: 이해한 내용은 꼭 손으로 증명하자Real Linux
  • 75. 교육과정 소개Real Linux 최신 리눅스기반으로 프로그래밍 내공쌓기
  • 76. 교육과정 소개Real Linux 최신 리눅스기반으로 프로그래밍 내공쌓기 이론은 압축적이고 핵심적으로 설명
  • 77. 교육과정 소개Real Linux 이론은 압축적이고 핵심적으로 설명 실습은 실용적이고 흥미로운 미션들과 함께 최신 리눅스기반으로 프로그래밍 내공쌓기
  • 78. 교육과정 소개Real Linux 이론은 압축적이고 핵심적으로 설명 최신 리눅스기반으로 프로그래밍 내공쌓기 실습은 실용적이고 흥미로운 미션들과 함께 이해한내용은 꼭 손으로 증명하자 !
  • 79. 교육과정 소개Real Linux 모든 개발자의 필수 기본내공
  • 80. 교육과정 소개Real Linux 컴퓨터 공학 기본기, SW 동작원리 모든 개발자의 필수 기본내공 OS 동작원리, 리눅스 기본기
  • 81. 교육과정 소개Real Linux 컴퓨터 공학 기본기, SW 동작원리 모든 개발자의 필수 기본내공 OS 동작원리, 리눅스 기본기 1~2달 만 투자하자 !
  • 82. 과정명 수준 기간 시간 정원 리눅스 노베이스 입문 4주과정: 매주 화,목 18:30-20:30 (2시간) 30명 리눅스 SW 기본 초중급 4주과정: 매주 화,목 20:45-22:45 (2시간) 30명 리눅스 OS 중급A,B 중급 4주과정: 매주 토 14:00-18:00 (4시간) 30명 리얼 Git 중고급 4주과정: 매주 월,수 19:30-22:30 (3시간) 30명 Real Linux 교육과정 * 개인노트북 준비물 필수 * OS 중급반A반, B반은 2달에 1회씩 개강합니다. * 강남역 3,4번 출구 3분거리 (테헤란로4길 38-5 혜정빌딩 4층 리얼리눅스 강의장) 문의 help@reallinux.co.kr | 카카오톡: 리얼리눅스 | 자세한정보: http://www.reallinux.co.kr 새로 쌓는 진짜 SW 기본기
  • 83. 과정명 수준 기간 시간 정원 리눅스 노베이스 입문 4주과정: 매주 화,목 18:30-20:30 (2시간) 30명 리눅스 SW 기본 초중급 4주과정: 매주 화,목 20:45-22:45 (2시간) 30명 리눅스 OS 중급A,B 중급 4주과정: 매주 토 14:00-18:00 (4시간) 30명 리얼 Git 중고급 4주과정: 매주 월,수 19:30-22:30 (3시간) 30명 Real Linux 교육과정 * 개인노트북 준비물 필수 * OS 중급반A반, B반은 2달에 1회씩 개강합니다. * 강남역 3,4번 출구 3분거리 (테헤란로4길 38-5 혜정빌딩 4층 리얼리눅스 강의장) 문의 help@reallinux.co.kr | 카카오톡: 리얼리눅스 | 자세한정보: http://www.reallinux.co.kr 새로 쌓는 진짜 SW 기본기 수강상담 & 문의 언제든 연락주세요!
  • 84. 리눅스 커널과 나의 서버프로그램의 관계 및 성능에 미치는 영향 ? Server Linux nginx DB 1. Network I/O (ex. http request ..) 2. Disk I/O (ex. DB, Big file ..) ...
  • 85. VFS Layer Individual Filesystem Layer Block Layer System call Interface GNU C Library user space kernel space User Applications
  • 86. VFS Layer Individual Filesystem Layer Block Layer System call Interface GNU C Library user space kernel space User Applications
  • 87. 문제상황 : 커널버전 업그레이드 이후 Disk I/O 가 많아짐
  • 88. 문제상황 : 커널버전 업그레이드 이후 Disk I/O 가 많아짐 어디부터 봐야할까 ?
  • 89. image from http://studyfoss.egloos.com/5585801 커널 구간별로 나눠서 지연시간 추적조사
  • 90. image from http://studyfoss.egloos.com/5585801 커널 구간별로 나눠서 지연시간 추적조사
  • 91. image from http://studyfoss.egloos.com/5585801 I/O 스케줄러에 따른 지연시간 비교
  • 92. 연이어지는 call-graph 상에서의 latency가 아니라 그냥 call count 가 많아서 생기는 latency ?
  • 93. 연이어지는 call-graph 상에서의 latency가 아니라 그냥 call count 가 많아서 생기는 latency ? readahead 사이즈의 이해와 성능영향 조사
  • 94. $ sudo su # 새로운 tracepoint 추가하기 $ perf probe --add submit_bio $ perf probe --add generic_file_read_iter # 위 두가지 함수의 call count 추적하기 $ perf stat -e probe:submit_bio,probe:generic_file_read_iter 실습: 이해한 내용은 꼭 손으로 증명하자 submit_bio와 generic_file_read_iter 이벤트 추적 켜기(On) Real Linux
  • 95. $ sudo su # man proc 참고: drop_caches 메모리상 disk cache drop $ echo 3 > /proc/sys/vm/drop_caches $ cd ~/git/linux # read 연산 테스트 $ tree 실습: 이해한 내용은 꼭 손으로 증명하자 커널소스 읽기(read) 연산 테스트 Real Linux
  • 96. $ sudo blockdev --getra /dev/sda # readahead(미리읽기) 사이즈 변경 $ sudo blockdev --setra 8192 /dev/sda $ echo 3 > /proc/sys/vm/drop_caches $ cd ~/git/linux # read 연산 테스트 $ tree 실습: 이해한 내용은 꼭 손으로 증명하자 readahead 사이즈 변경후 추적결과 비교 Real Linux
  • 98. 옆집 아저씨 컨테이너가 죽은 이유 Container 란 ?
  • 99. 옆집 아저씨 컨테이너가 죽은 이유 Container 란 ? (1) (2)
  • 100. 옆집 아저씨 컨테이너가 죽은 이유 Container 란 ? (1) namespace: (2) chroot
  • 101. 옆집 아저씨 컨테이너가 죽은 이유 Container 란 ? (1) namespace: 나만의 공간 우리만의 공간 (2) chroot
  • 102. 옆집 아저씨 컨테이너가 죽은 이유 Container 란 ? (1) namespace: 나만의 공간 우리만의 공간 (2) cgroup: chroot
  • 103. 옆집 아저씨 컨테이너가 죽은 이유 Container 란 ? (1) namespace: 나만의 공간 우리만의 공간 (2) cgroup: 나만의 자원 우리만의 자원 chroot
  • 104. 옆집 아저씨 컨테이너가 죽은 이유 Container 란 ? (1) namespace: 나만의 공간 우리만의 공간 (2) cgroup: 나만의 자원 우리만의 자원 chroot
  • 105. 옆집 아저씨 컨테이너가 죽은 이유 Container 란 ? (1) namespace: 나만의 공간 우리만의 공간 (2) cgroup: 나만의 자원 우리만의 자원나만의 Linux chroot
  • 106. 옆집 아저씨 컨테이너가 죽은 이유 Container 란 ? (1) namespace: 나만의 공간 우리만의 공간 (2) cgroup: 나만의 자원 우리만의 자원나만의 Linux 우리만의 Linux chroot
  • 107. 옆집 아저씨 컨테이너가 죽은 이유 Container 란 ? Server Host OS Container Container Container App A App B App C App D 나만의 Linux 우리만의 Linux
  • 108. 옆집 아저씨 컨테이너가 죽은 이유 Container 란 ? Server Host OS Container Container Container App A App B App C App D 나만의 Linux 우리만의 Linux
  • 109. 옆집 아저씨 컨테이너가 죽은 이유 Container 란 ? Server Host OS Container Container Container App A App B App C App D 나만의 Linux 우리만의 Linux
  • 110. 옆집 아저씨 컨테이너가 죽은 이유 Container 란 ? Server Host OS Container Container Container App A App B App C App D Killed 나만의 Linux 우리만의 Linux
  • 111. 옆집 아저씨 컨테이너가 죽은 이유 Server Host OS Container Container Container App A App B App C App D Killed 1. 컨테이너의 커맨드가 실패한 경우 2. 컨테이너의 커맨드가 존재하지 않는 경우 3. 컨테이너가 SIGKILL 및 SIGTERM 을 받은 경우 ...
  • 112. $ ls / $ wget https://github.com/ericchiang/containers-from-scratch/releases/download/v0.1.0/rootfs.tar.gz $ ls rootfs/ # 나만의 root filesystem 공간 만들기 $ sudo chroot rootfs /bin/bash # 실제 root filesystem / 와 현재 / 비교하기 $ ls / 실습: 이해한 내용은 꼭 손으로 증명하자Real Linux chroot 실습: 나만의 root filesystem 공간
  • 113. $ sudo chroot rootfs /bin/bash # chroot 이후의 ps 와 $ ps aux $ sudo unshare -p -f --mount-proc=rootfs/proc chroot rootfs /bin/bash # PID namespace 이후의 ps 의 결과 비교하기 $ ps aux 실습: 이해한 내용은 꼭 손으로 증명하자Real Linux PID namespace 실습: 나만의 PID 공간
  • 114. $ sudo su $ mkdir /sys/fs/cgroup/memory/test # 100MB 제한 $ echo 100000000 > /sys/fs/cgroup/memory/test/memory.limit_in_bytes $ echo 0 > /sys/fs/cgroup/memory/test/memory.swappiness 실습: 이해한 내용은 꼭 손으로 증명하자Real Linux cgroup 실습: 나만의 memory 자원
  • 115. $ echo $$ > /sys/fs/cgroup/memory/test/tasks $ cat mem_eater.py f = open("/dev/urandom", "r") data = "" i=0 while True: data += f.read(10000000) # 10mb i += 1 print "%dmb" % (i*10,) $ python mem_eater.py 실습: 이해한 내용은 꼭 손으로 증명하자Real Linux cgroup 실습: 프로세스 죽는 과정실습
  • 116. $ cd /sys/kernel/debug/tracing $ echo 1 > events/oom/enable $ echo 1 > options/stacktrace $ cat trace_pipe # 다른 터미널로 예제 python 실행하고 OOM으로 죽는 과정 trace_pipe로 추적하기 $ python mem_eater.py 실습: 이해한 내용은 꼭 손으로 증명하자Real Linux cgroup 실습: OOM으로 죽는 과정추적
  • 117. “ 리눅스는 더이상 어두운 Hidden box가 아닙니다. ” 실용적인 커널 Tracing 실습교육과 함께 쉽고 빠르게 (1) 실제 동작과정을 추적해보고 (2) 나의 프로그램과 리눅스 커널과의 관계도 분석하고 (3) 성능에 끼치는 영향까지 이해합니다. Thanks, 리얼리눅스 http://RealLinux.co.kr