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분)
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
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
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
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
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