SlideShare ist ein Scribd-Unternehmen logo
1 von 100
Downloaden Sie, um offline zu lesen
아무 짝에도 쓸모 없을 것 같던
하나의 CPU 에 운영체제
두 개 부팅시키기
김성민
㈜구름네트웍스
1
AUTHORS
2
김성호
sungho@gurum.cc
양유석
youseok@gurum.cc
CONTENTS
1. Hypervisor, Container, 그리고 Multi-Kernel Architecture
2. 이걸 도대체 어디에 쓰나?
3. PopcornLinux 분석
4. Linux 2개 부팅 시키기
5. Linux + PacketNgin 부팅 시키기
6. Linux + PacketNgin Network Performance
3
1.
Hypervisor, Container,
그리고
Multi-Kernel Architecture
4
1.1 Hypervisor
5
Source: vmware.com
Type 1 Hypervisor Type 2 Hypervisor
1.1 Hypervisor
6
Source: vmware.com
Type 1 Hypervisor Type 2 Hypervisor
1.1 Hypervisor
7
VMware vSphere/ESXi
Microsoft Hyper-V
Citrix Xen
Linux KVM (??)
VMware Workstation
Oracle VirtualBox
QEMU
Linux KVM (??)
Source: searchservervirtualization.techtarget.com/news/2240034817/
KVM-reignites-Type-1-vs-Type-2-hypervisor-debate
1.2 Container
8Source: cloudacademy.com/blog/container-virtualization/
1.2 Container
9Source: cloudacademy.com/blog/container-virtualization/
1.2 Container
10
Linux Docker
Linux LXC
Linux OpenVZ
Solaris Container
FreeBSD jail
Source: cloudacademy.com/blog/container-virtualization/
1.3 Multi-Kernel Architecture
11Source: popcornlinux.org
1.3 Multi-Kernel Architecture
12Source: popcornlinux.org
1.3 Multi-Kernel Architecture
13
Popcorn Linux – Linux + Linux
Nucleus RTOS – Linux + Nucleus
PacketNgin RTOS – Linux + PacketNgin
Network Processors – Linux + Firmware
Source: popcornlinux.org
2.
이걸 도대체 어디에 쓰나?
14
2.1 모바일 분야 – ARM TrustZone
15Source: www.arm.com/products/processors/technologies/trustzone/tee-smc.php
2.1 모바일 분야 – ARM TrustZone
16Source: www.arm.com/files/pdf/TrustZone-and-FIDO-white-paper.pdf
2.2 서버 분야 – Many-core Architecture
Source: blogs.intel.com/technology/2012/06/intel-xeon-phi-coprocessors-accelerate-discovery-and-innovation/ 17
2.2 서버 분야 – Many-core Architecture
18Source: www.ssrg.ece.vt.edu/theses/MS_Katz.pdf
2.2 서버 분야 – Many-core Architecture
19Source: www.pugetsystems.com/labs/articles/Adobe-After-Effects-CC-2015-Multi-Core-Performance-714/
2.2 서버 분야 – Many-core Architecture
20Source: queue.acm.org/detail.cfm?id=2000516
2.2 서버 분야 – Many-core Architecture
21Source: www.intel.com/content/www/us/en/processors/xeon/xeon-phi-detail.html
2.3 네트워크 분야 –Control Plane/Data Plane
22Source: www.linkedin.com/pulse/6wind-from-data-plane-acceleration-virtual-appliances-humair-ahmed
3.
PopcornLinux 분석
23Source: http://www.popcornlinux.org/sources/slide/VTLUUG_Tech_may2013.pdf
BIOS
Disk의 MBR을 읽어 메모리에 로딩
3.1 O/S 부팅 과정 (x86_64, BIOS 기준)
24
BSP(BootStrap Processor), Core 0
AP(Application Processor), Core 1 ~ n
MBR (Stage 1, 16bit)
Stage 2 로더를 메모리에 로딩
Stage 2 로더 (16bit)
Kernel을 메모리에 로딩
16bit -> 32bit 전환
Kernel (32bit)
커널 재배치
32bit -> 64bit 전환
로더 (trampoline_64.S, 16bit)
Kernel을 메모리에 로딩
16bit -> 32bit 전환
Kernel (32bit)
커널 재배치
32bit -> 64bit 전환
3.2 Linux Kernel Booting
25Source: www.linux-arm.org/LinuxBootLoader/SMPBoot
3.3 PopcornLinux Booting
26
CPU Memory PCI
Core 0 Core 1 Core 2 Core 3
Core 4 Core 5 Core 6 Core 7
0M
~
8GB
NIC0 NIC1 NIC2 NIC3
3.3 PopcornLinux Booting (First Booting)
27
Core 0 Core 1 Core 2 Core 3
Core 4 Core 5 Core 6 Core 7
CPU Memory
0M
~
8GB
NIC0
PCI
NIC1 NIC2 NIC3
PopcornLinux Kernel
28
Core 0 Core 1 Core 2 Core 3
Core 4 Core 5 Core 6 Core 7
CPU Memory
0M
~
8GB
NIC0
PCI
NIC1 NIC2 NIC3
PopcornLinux Kernel
1. Core의 개수
2. Memory의 용량
3. PCI 디바이스 목록
4. CPU, Memory, PCI 할당 규칙
3.3 PopcornLinux Booting (First Booting)
3.3 PopcornLinux Booting (Master Booting)
29
Core 0 Core 1 Core 2 Core 3
Core 4 Core 5 Core 6 Core 7
CPU Memory
0M
~
8GB
NIC0
PCI
NIC1 NIC2 NIC3
PopcornLinux Master Kernel
3.3 PopcornLinux Booting (Secondary Booting)
30
Core 0 Core 1 Core 2 Core 3
Core 4 Core 5 Core 6 Core 7
CPU Memory
0M
~
8GB
NIC0
PCI
NIC1 NIC2 NIC3
PopcornLinux Master Kernel
PopcornLinux Secondary Kernel
3.3 PopcornLinux Booting (Source Code)
31
Booting /arch/x86/include/asm/bootparam.h
Booting /arch/x86/kernel/e820.c
Booting /arch/x86/kernel/head64.c
Booting /arch/x86/kernel/process_64.c
Booting /arch/x86/kernel/setup.c
Booting /arch/x86/kernel/smpboot.c
Booting /arch/x86/kernel/trampoline.c
Booting /arch/x86/kernel/trampoline_64_bsp.S
Booting /arch/x86/kernel/vmlinux.lds.S
Booting /include/linux/multikernel.h
Booting /kernel/multikernel.c
3.3 PopcornLinux Booting (Source Code)
32
CPU /arch/x86/include/asm/apic.h
CPU /arch/x86/kernel/apic/io_apic.c
CPU /arch/x86/kernel/cpu/common.c
CPU /arch/x86/kernel/i387.c
CPU /arch/x86/kernel/traps.c
CPU /drivers/acpi/processor_driver.c
CPU /include/linux/sched.h
Memory /arch/x86/mm/dump_pagetables.c
Memory /mm/memblock.c
Memory /mm/nobootmem.c
3.3 PopcornLinux Booting (Source Code)
33
Interrupt /arch/x86/include/asm/unistd_64.h
Interrupt /include/linux/syscalls.h
VTY /arch/x86/include/asm/entry_arch.h
VTY /drivers/tty/serial/8250.c
VTY /drivers/tty/tty_buffer.c
VTY /drivers/tty/vty.c
Core 0 Core 1 Core 2 Core 3
Core 4 Core 5 Core 6 Core 7
3.4 CPU Partitioning (Overview)
34
CPU
1. Booting parameter 추가
2. Linux Kernel의 CPU mask 정보 조작
linux/arch/x86/setup.c
arch/x86/kernel/smpboot.c
3.4 CPU Partitioning (Master Booting)
35
Core 0 Core 1 Core 2 Core 3
Core 4 Core 5 Core 6 Core 7
CPU
1. Core 0번에서 Kernel 부팅
1. BIOS가 MBR(Stage 1 Loader) 로딩 (16bit mode)
2. Stage 1 Loader는 Stage 2 Loader 로딩 (16bit mode)
3. Stage 2 Loader는 Kernel 로딩 (16bit -> 32bit mode)
4. Kernel은 메모리 주소 재배치 (32bit -> 64bit mode)
3.4 CPU Partitioning (Master Booting)
36
1. INIT IPI (Inter-Process Interrupt)
2. 100us wait
3. INIT IPI
4. 100us wait
5. STARTUP IPI
6. 200us wait
INIT, INIT, STARTUP IPI
Core 0 Core 1 Core 2 Core 3
Core 4 Core 5 Core 6 Core 7
CPU 1. Core 0번에서 Kernel 부팅
2. Core 0번이 Core 1~3에 Startup Interrupt 전송
(smpboot.c)
3.4 CPU Partitioning (Master Booting)
37
Core 0 Core 1 Core 2 Core 3
Core 4 Core 5 Core 6 Core 7
CPU
1. Core 0번에서 Kernel 부팅
2. Core 0번이 Core 1~3에 Startup Interrupt 전송
(smpboot.c)
3. Core 1~3번은 Kernel 부팅 (trampoline_64.S)
1. Core 1~3은 trampoine_64.S 를 실행
2. trampoine_64.S는 CPU mode를
16bit -> 32bit로 전환
3. Kernel로 Jump
4. Kernel은 32bit -> 64bit 전환
3.4 CPU Partitioning (Secondary Booting)
38
1. Primary Linux은
Secondary Linux의 BSP (BootStrap
Processor) Kernel을 부팅
Core 0 Core 1 Core 2 Core 3
Core 4 Core 5 Core 6 Core 7
CPU
INIT, INIT, STARTUP IPI
1. INIT IPI (Inter-Process Interrupt)
2. 100us wait
3. INIT IPI
4. 100us wait
5. STARTUP IPI
6. 200us wait
3.4 CPU Partitioning (Secondary Booting)
39
Core 0 Core 1 Core 2 Core 3
Core 4 Core 5 Core 6 Core 7
CPU 1. Primary Linux은
Secondary Linux의 BSP (BootStrap
Processor) Kernel을 부팅
2. Secondary Linux의 BSP Kernel 부팅
1. BIOS는 trampoline_64_bsp.S를 실행
2. trampoline_64_bsp.S는 Kernel 로딩
(16bit -> 32bit mode)
3. Kernel은 메모리 주소 재배치
(32bit -> 64bit mode)
3.4 CPU Partitioning (Secondary Booting)
40
INIT, INIT, STARTUP IPI
Core 0 Core 1 Core 2 Core 3
Core 4 Core 5 Core 6 Core 7
CPU 1. Primary Linux은
Secondary Linux의 BSP (BootStrap
Processor) Kernel을 부팅
2. Secondary Linux의 BSP Kernel 부팅
3. BSP Kernel은 AP Kernel 부팅
3.4 CPU Partitioning (Secondary Booting)
41
Core 0 Core 1 Core 2 Core 3
Core 4 Core 5 Core 6 Core 7
CPU 1. Primary Linux은 Secondary Linux의 BSP
(BootStrap Processor) Kernel을 부팅
2. Secondary Linux의 BSP Kernel 부팅
3. BSP Kernel은 AP Kernel 부팅
4. Secondary Linux의 AP Kernel 부팅 완료
1. Core 1~3은 trampoine_64.S 를 실행
2. trampoine_64.S는 CPU mode를
16bit -> 32bit로 전환
3. Kernel로 Jump
4. Kernel은 32bit -> 64bit 전환
3.5 Memory Partitioning (Overview)
42
1. Booting parameter 추가
2. Page table 조작
Memory
0M
~
8GB
Primary Linux Secondary Linux
0MB 4GB 0MB 4GB
43Source: cse-wiki.unl.edu/wiki/index.php/Computer_Architecture_Notes
3.5 Memory Partitioning (Overview)
44
3.5 Memory Partitioning (Overview)
45
1. Booting parameter 추가
2. Page table 조작
linux/arch/x86/kernel/e820.c
linux/arch/x86/kernel/e820.c
Memory
0M
~
8GB
Primary Linux Secondary Linux
0MB 4GB 0MB 4GB
3.5 Memory Partitioning (Master Booting)
46
Memory
0M
~
8GB
1. Booting parameter 추가
memmap=4G@0M mem=4G
1. e820.c에서 0~4GB 영역을 사용 가능한 영역으로 포함 시킴
2. 메모리는 최대한 4GB만 할당함
3.5 Memory Partitioning (Master Booting)
47
1. Booting parameter 추가
memmap=4G@0M mem=4G
2. Page Table 설정
arch/x86/mm/init_64.c
Memory
0M
~
8GB
Memory
0M
~
8GB
1. e820.c에서 0~4GB 영역을 사용
불가능한 영역으로 포함 시킴
2. 메모리는 최대한 8GB만 할당함
(8GB – 4GB = 4GB)
3.5 Memory Partitioning (Secondary Booting)
48
1. Booting parameter 추가
memmap=4G@0M mem=4G
2. Page Table 설정
3. Booting parameter 추가
memmap=4G$0M mem=8G
3.5 Memory Partitioning (Secondary Booting)
49
1. Booting parameter 추가
memmap=4G@0M mem=4G
2. Page Table 설정
3. Booting parameter 추가
memmap=4G$0M mem=4G
4. Page Table 설정
arch/x86/mm/init_64.c
Memory
0M
~
8GB
3.6 PCI Device Partitioning (Overview)
50
1. PCI black list를 Kernel 파라미터로 받음
2. 사용 가능한 PCI 목록에서 black list 제외
PCI 0 PCI 2 PCI 3PCI 1
3.6 PCI Device Partitioning (Overview)
51
Bus, Slot, Function Vendor ID, Device ID
3.6 PCI Device Partitioning (Master Booting)
52
1. PCI black list를 Kernel 파라미터로 받음
pci_dev_flag=0x8086:0x7010:b,0x8086:0
x100e:b
linux/drivers/pci/probe.c
PCI 2 PCI 3PCI 0 PCI 1
1. Boot 파라미터 해석
2. Black list에 해당 PCI device 포함
3. PCI probe 단계에서 해당 PCI
device는 제외
53
3.6 PCI Device Partitioning (Secondary Booting)
54
1. PCI black list를 Kernel 파라미터로 받음
2. 사용 가능한 PCI 목록에서 black list 제외
3. Master Kernel에서 사용하는 PCI 목록을
black list에 파라미터로 받음
4. 사용 가능한 PCI 목록에서 black list 제외
PCI 0 PCI 2 PCI 3PCI 1
1. Boot 파라미터 해석
2. Black list에 해당 PCI device 포함
3. PCI probe 단계에서 해당 PCI
device는 제외
3.7 Multi-Kernel 간의 통신
55
Memory
0M
~
8GB
1. Kernel 간에 공유하는 메모리 공간 할당
2. 모든 Kernel에게 해당 공간 주소를 Kernel 파라
미터로 넘겨줌
3. Kernel들은 공유 메모리를 통해 정보를 주고 받음
linux/drivers/tty/vty.c
VTY , Tunnel 영역
4.
Linux 2개 부팅 시키기
PopcornLinux 버그 수정 버전
https://github.com/packetngin/popcorn
56
4.1 Linux 설치
57
4.2 유틸리티 설치
58
4.3 Patch Download
59
4.4 Linux Kernel Download
60
4.5 Patch Linux Kernel
61
4.6 Build Kernel
62
4.7 Kexec Download
63
4.8 Patch Kexec
64
4.9 Build Popcorn Utils
65
4.10 VTY Configuration
66
Boot parameter 설정
Grub 설정
4.11 Reboot
67
4.12 Master Linux Booting
68
Core가 1개만 할당된
것을 확인
4.12 Master Linux Booting
69
메모리가 약 870MB 할당된 것을 확인
(VTY 등 영역 제외 한 수치)
4.13 Build Secondary Linux Image
70
ELF 형식에서 .notes, .comment 섹션을 삭제
4.14 Booting Secondary Linux
71
1. RAM disk 복사
copy_ramdisk $RAMDISK_ADDR $RAMDISK_FILE
2. Kernel parameter 복사
wr_cmdline $BOOT_ARGS
3. Kernel image 복사
kexec -d -a $BOOT_ADDR -l $KERNEL -t elf-x86_64 --args-none
4. Kernel 부팅
kexec -d -a $BOOT_ADDR -b $CPU
4.15 Secondary Linux 접속
72
4.16 Secondary Linux 확인
73
1번 Core 1개만 할당된
것을 확인
5.
Linux + PacketNgin 부팅 시키기
74
5.1 PacketNgin RTOS 소개 (1/4)
75
Eth IP TCP Payload Ether Block
IP Block
TCP Block
Web
Browser
Kernel Space
User Space
NICEth IP TCP Payload
IP TCP Payload
TCP Payload
Payload
General Purpose O/S
Eth IP TCP Payload Ether Block
Firewall
Kernel Space
User Space
NICEth IP TCP Payload
Eth IP TCP Payload
Network O/S
5.1 PacketNgin RTOS 소개 (2/4)
76
Programmability
• Linux는 Host Network Programming 하기에 적합한 O/S
• PacketNgin은 Network Node Programming 하기에 적합한 O/S
• ARP, ICMP, IPsec 소스 코드의 양이 Linux에 비해 2/3 ~ 1/2 수준
5.1 PacketNgin RTOS 소개 (3/4)
77
+ Network H/W depedent code
+ deliver_skb()
+ ret = pt_prev->func(skb, skb->dev, pt_prev);
+ ip_rcv()
+ nf_hook()
+ ip_rcv_finish()
+ ip_route_input()
+ dst_input()->ip_forward() or ip_input()
+ ip_input // Remove the IPv4 header
+ ip_input_finish
+ ret = ipprot->handler(&skb, &nhoff);
+ xfrm4_rcv()
+ xfrm_input()
+ xfrm4_parse_spi()
+ xfrm_state_lookup() // lookup IPsec SA
+ xfrm_beet_input(skb, x) //To change to inner IP header.
+ nexthdr = x->type->input(x, xfrm.decap, skb) // ==
esp_input
+ esp_input() // process ESP based on inner
address
+ returns 0 ;
+ /* beet handling in xfrm_rcv_spi */
+ netif_rx()
+ // ip_input_finish returns 0
+ // netif_receive_skb returns 0
+netif_receive_skb // Now we have an IPv4 packet. So the input flow is
for v4 packet.
+ deliver_skb()
+ ret = pt_prev->func(skb, skb->dev, pt_prev);
+ ip_rcv()
+ nf_hook() //This calls ip_rcv_finish(skb)
+ ip_rcv_finish() // Here the skb->dst is NULL and so is filled for
the input side.
+ ip6_route_input()
+ dst_input()->ip_forward() or ip_input()
+ ip_input // Remove the IPv4 header
+ ip_input_finish
+ …
+ Network H/W depedent code
+ nic_process_output()
+ fifo_push()
+ ni_input()
+ ipsec_inbound()
+ sad_get()
+ ipsec_decrypt()
+ spd_get()
+ ni_output()
5.1 PacketNgin RTOS 소개 (4/4)
78
5.2 Porting – Popcorn Utility
79
kexec 변경
1. Linux는 16MB 영역에 로딩
2. PacketNgin은 4MB 영역에 로딩
3. Hard-coding address => 16MB
Booting utility
1. Hard-coding address => 16MB
Hard-coding address => 4MB
Hard-coding address => 4MB
5.3 Porting – Kernel 변경
80
Booting logic 변경
1. BSP Booting – Grub과 호환
2. AP Booting – 자체 제작 loader에서
16bit -> 32bit 전환
Standard I/O 방식 변경
1. VGA Buffer에 직접 출력하는 방식
2. 자체 제작한 VGA 드라이버 사용
1. BSP Booting 필요 없음
2. Kexec와 호환되도록 loader 수정
1. Master Linux Kernel과 충돌
2. Serial 통신으로 대체
3. (차후)VTY와 호환 되도록 수정
5.3 Porting – Kernel 변경
81
Memory map 변경
1. PacketNgin Kernel은 2~6MB 사용
Kernel parameter 전달 방식 변경
1. Grub2에서 제공되는
Multiboot2 스펙
1. Linux Kernel과 PacketNgin
Kernel 영역이 겹치는 문제
2. PacketNgin Kernel을 4~8MB로
이동
1. Linux boot parameter 스펙과
호환되도록 변경
5.3 Porting – Kernel 변경
82
Linux Inter-Processor Interrupt와 호환되도록 변경
1. Linux IPI 번호 체계와
PacketNgin IP 번호 체계 충돌
1. Linux에서 사용하지 않는 IPI 번호를
PacketNgin IPI 번호로 할당함
5.3 Porting – Manager App 변경
83
PacketNgin Manager -> Linux로 포팅
1. PacketNgin Shell
2. PacketNgin Manage API
3. VM 관리 API
4. App 관리 API
1. Linux Shell로 대체
2. Linux에서 동작하는 Manage API
3. Linux에서 동작하는 VM 관리 API
4. Linux에서 동작하는 App 관리 API
5.3 Porting – Network I/O 고속화
84
Interrupt 방식 -> Polling 방식 변경
1. Polling 방식으로 고속으로 I/O
2. PacketNgin 자체
Device Driver 사용
1. Linux의 NAPI 최대한 활용
2. Interrupt와 Polling 방식 병행
3. Linux Device Driver 최소한으로
수정
Packet Processing API 변경
1. PacketNgin 자체 Packet 구조체
1. sk_buff <-> Packet 구조체 간
변환 로직 구현
6.
Linux + PacketNgin
Network Performance
85
6.1 Goal – 6WindGate Performance
86Source: www.slideshare.net/openstack_kr/6-wind-openstackkoreameetup27may15/4
6.1 Goal – 6WindGate Performance
87Source: blog.ipspace.net/2012/02/6wind-solving-virtual-appliance.html
6.1 Goal – 6WindGate Performance
88Source: www.linkedin.com/pulse/6wind-from-data-plane-acceleration-virtual-appliances-humair-ahmed
6.2 Goal – PacketNgin 1.0
89
Core i5 + NetFPGA NIC +420%
Linux
6.3 Network I/O– Linux vs PacketNgin
90
NIC
Core 0 Core 1 Core 2 Core 3
0M
~
8GB
UDP
Echo
Eth IP UDP Payload Ether Block
IP Block
UDP Block
UDP
Echo
Kernel Space
User Space
NICEth IP UDP Payload
IP UDP Payload
UDP Payload
Payload
6.3 Network I/O– Linux vs PacketNgin
91
UDP
Echo
Eth IP UDP Payload Ether Block
UDP Echo
Kernel Space
User Space
NICEth IP UDP Payload
Eth IP UDP Payload
NIC
Core 0 Core 1 Core 2 Core 3
0M
~
8GB
Linux PacketNgin
6.3 Network I/O–PacketNgin 2.0
92
UDP
Echo
Packet
NIC
Core 0 Core 1 Core 2 Core 3
0M
~
8GB
Linux PacketNgin
1. Packet이 NIC에 도착
6.3 Network I/O–PacketNgin 2.0
93
1. Packet이 NIC에 도착
2. Linux의 NIC Driver에서 Packet을 확인
UDP
Echo
NIC
Core 0 Core 1 Core 2 Core 3
0M
~
8GB
Linux PacketNginPacket
6.3 Network I/O–PacketNgin 2.0
94
1. Packet이 NIC에 도착
2. Linux의 NIC Driver에서 Packet을 확인
3. NIC Driver에서 패킷을 복제해
PacketNgin Kernel로 전달
Packet
UDP
Echo
NIC
Core 0 Core 1 Core 2 Core 3
0M
~
8GB
Linux PacketNgin
6.3 Network I/O–PacketNgin 2.0
95
Packet 1. Packet이 NIC에 도착
2. Linux의 NIC Driver에서 Packet을 확인
3. NIC Driver에서 패킷을 복제해
PacketNgin Kernel로 전달
4. PacketNgin Kernel은 UDP Echo App
에게 Packet을 전달
5. UDP Echo App은 Packet을 처리
UDP
Echo
NIC
Core 0 Core 1 Core 2 Core 3
0M
~
8GB
Linux PacketNgin
6.3 Network I/O–PacketNgin 2.0
96
1. Packet이 NIC에 도착
2. Linux의 NIC Driver에서 Packet을 확인
3. NIC Driver에서 패킷을 복제해
PacketNgin Kernel로 전달
4. PacketNgin Kernel은 UDP Echo App
에게 Packet을 전달
5. UDP Echo App은 Packet을 처리
6. PacketNgin Kernel -> Linux Kernel -
> NIC 순서로 Packet 출력
UDP
Echo
NIC
Core 0 Core 1 Core 2 Core 3
0M
~
8GB
Linux PacketNgin
Packet
6.4 Result–UDP Echo Performance
97
6.5 Wrap-Up
98
1. Multi-Kernel Architecture
2. Popcorn Linux
3. Control Plane / Data Plane
4. Performance – 130~1,300%↑
Q & A
99
PopcornLinux 버그 수정 버전
https://github.com/packetngin/popcorn
PacketNgin 2.0 Preview
https://goo.gl/rxET1T
Thank You
100

Weitere ähnliche Inhalte

Was ist angesagt?

[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
Jaeseung Ha
 
DPDK (Data Plane Development Kit)
DPDK (Data Plane Development Kit) DPDK (Data Plane Development Kit)
DPDK (Data Plane Development Kit)
ymtech
 
Posquit0 - Fabric을 이용한 ssh streamlining
Posquit0 - Fabric을 이용한 ssh streamliningPosquit0 - Fabric을 이용한 ssh streamlining
Posquit0 - Fabric을 이용한 ssh streamlining
Byungjin Park
 
[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규
ChangKyu Song
 

Was ist angesagt? (20)

Hyperledger fabric practice(pdf)
Hyperledger fabric practice(pdf)Hyperledger fabric practice(pdf)
Hyperledger fabric practice(pdf)
 
도커 없이 컨테이너 만들기 2편
도커 없이 컨테이너 만들기 2편도커 없이 컨테이너 만들기 2편
도커 없이 컨테이너 만들기 2편
 
C# Game Server
C# Game ServerC# Game Server
C# Game Server
 
[오픈소스컨설팅] 아파치톰캣 운영가이드 v1.3
[오픈소스컨설팅] 아파치톰캣 운영가이드 v1.3[오픈소스컨설팅] 아파치톰캣 운영가이드 v1.3
[오픈소스컨설팅] 아파치톰캣 운영가이드 v1.3
 
도커없이컨테이너 만들기 8편 - pid namespace
도커없이컨테이너 만들기 8편 - pid namespace도커없이컨테이너 만들기 8편 - pid namespace
도커없이컨테이너 만들기 8편 - pid namespace
 
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
 
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
 
[164] pinpoint
[164] pinpoint[164] pinpoint
[164] pinpoint
 
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
 
Java와 Python의 만남: Jython과 Sikuli
Java와 Python의 만남: Jython과 SikuliJava와 Python의 만남: Jython과 Sikuli
Java와 Python의 만남: Jython과 Sikuli
 
Theano 와 Caffe 실습
Theano 와 Caffe 실습 Theano 와 Caffe 실습
Theano 와 Caffe 실습
 
[오픈소스컨설팅] Ansible을 활용한 운영 자동화 교육
[오픈소스컨설팅] Ansible을 활용한 운영 자동화 교육[오픈소스컨설팅] Ansible을 활용한 운영 자동화 교육
[오픈소스컨설팅] Ansible을 활용한 운영 자동화 교육
 
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint [D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
 
[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020
 
도커 없이 컨테이너 만들기 3편
도커 없이 컨테이너 만들기 3편도커 없이 컨테이너 만들기 3편
도커 없이 컨테이너 만들기 3편
 
DPDK (Data Plane Development Kit)
DPDK (Data Plane Development Kit) DPDK (Data Plane Development Kit)
DPDK (Data Plane Development Kit)
 
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOSConfd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
 
Posquit0 - Fabric을 이용한 ssh streamlining
Posquit0 - Fabric을 이용한 ssh streamliningPosquit0 - Fabric을 이용한 ssh streamlining
Posquit0 - Fabric을 이용한 ssh streamlining
 
[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규
 
DPDK
DPDKDPDK
DPDK
 

Andere mochten auch

[231]나는서버를썰터이니너는개발만하여라 양지욱
[231]나는서버를썰터이니너는개발만하여라 양지욱[231]나는서버를썰터이니너는개발만하여라 양지욱
[231]나는서버를썰터이니너는개발만하여라 양지욱
NAVER D2
 
[216]딥러닝예제로보는개발자를위한통계 최재걸
[216]딥러닝예제로보는개발자를위한통계 최재걸[216]딥러닝예제로보는개발자를위한통계 최재걸
[216]딥러닝예제로보는개발자를위한통계 최재걸
NAVER D2
 
[222]딥러닝을 활용한 이미지 검색 포토요약과 타임라인 최종 20161024
[222]딥러닝을 활용한 이미지 검색 포토요약과 타임라인 최종 20161024[222]딥러닝을 활용한 이미지 검색 포토요약과 타임라인 최종 20161024
[222]딥러닝을 활용한 이미지 검색 포토요약과 타임라인 최종 20161024
NAVER D2
 
kexec / kdump implementation in Linux Kernel and Xen hypervisor
kexec / kdump implementation in Linux Kernel and Xen hypervisorkexec / kdump implementation in Linux Kernel and Xen hypervisor
kexec / kdump implementation in Linux Kernel and Xen hypervisor
The Linux Foundation
 
Lkda facebook seminar_140419
Lkda facebook seminar_140419Lkda facebook seminar_140419
Lkda facebook seminar_140419
sprdd
 

Andere mochten auch (10)

[231]나는서버를썰터이니너는개발만하여라 양지욱
[231]나는서버를썰터이니너는개발만하여라 양지욱[231]나는서버를썰터이니너는개발만하여라 양지욱
[231]나는서버를썰터이니너는개발만하여라 양지욱
 
[216]딥러닝예제로보는개발자를위한통계 최재걸
[216]딥러닝예제로보는개발자를위한통계 최재걸[216]딥러닝예제로보는개발자를위한통계 최재걸
[216]딥러닝예제로보는개발자를위한통계 최재걸
 
[222]딥러닝을 활용한 이미지 검색 포토요약과 타임라인 최종 20161024
[222]딥러닝을 활용한 이미지 검색 포토요약과 타임라인 최종 20161024[222]딥러닝을 활용한 이미지 검색 포토요약과 타임라인 최종 20161024
[222]딥러닝을 활용한 이미지 검색 포토요약과 타임라인 최종 20161024
 
kexec / kdump implementation in Linux Kernel and Xen hypervisor
kexec / kdump implementation in Linux Kernel and Xen hypervisorkexec / kdump implementation in Linux Kernel and Xen hypervisor
kexec / kdump implementation in Linux Kernel and Xen hypervisor
 
Lkda facebook seminar_140419
Lkda facebook seminar_140419Lkda facebook seminar_140419
Lkda facebook seminar_140419
 
[233] level 2 network programming using packet ngin rtos
[233] level 2 network programming using packet ngin rtos[233] level 2 network programming using packet ngin rtos
[233] level 2 network programming using packet ngin rtos
 
[225]yarn 기반의 deep learning application cluster 구축 김제민
[225]yarn 기반의 deep learning application cluster 구축 김제민[225]yarn 기반의 deep learning application cluster 구축 김제민
[225]yarn 기반의 deep learning application cluster 구축 김제민
 
Linux Crash Dump Capture and Analysis
Linux Crash Dump Capture and AnalysisLinux Crash Dump Capture and Analysis
Linux Crash Dump Capture and Analysis
 
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기
 
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
 

Ähnlich wie [241] 하나의 cpu 에 운영제체 두 개 김성민

Linux Performan tuning Part I
Linux Performan tuning Part ILinux Performan tuning Part I
Linux Performan tuning Part I
sprdd
 
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안
GangSeok Lee
 
Power_780+(9179-MHD)표준제안서
Power_780+(9179-MHD)표준제안서Power_780+(9179-MHD)표준제안서
Power_780+(9179-MHD)표준제안서
기한 김
 

Ähnlich wie [241] 하나의 cpu 에 운영제체 두 개 김성민 (20)

Apache Tomcat ( 아파치 톰캣 ) 설치 가이드
Apache Tomcat ( 아파치 톰캣 ) 설치 가이드Apache Tomcat ( 아파치 톰캣 ) 설치 가이드
Apache Tomcat ( 아파치 톰캣 ) 설치 가이드
 
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
 
백업을 위한 USB운영체제 완료세미나
백업을 위한 USB운영체제 완료세미나백업을 위한 USB운영체제 완료세미나
백업을 위한 USB운영체제 완료세미나
 
Apache httpd ( 아파치 웹서버 ) 설치 가이드
Apache httpd ( 아파치 웹서버 ) 설치 가이드Apache httpd ( 아파치 웹서버 ) 설치 가이드
Apache httpd ( 아파치 웹서버 ) 설치 가이드
 
UNIX 시스템 2014-2018년 기말시험 기출문제
UNIX 시스템 2014-2018년 기말시험 기출문제UNIX 시스템 2014-2018년 기말시험 기출문제
UNIX 시스템 2014-2018년 기말시험 기출문제
 
Red Hat OpenStack 17 저자직강+스터디그룹_1주차
Red Hat OpenStack 17 저자직강+스터디그룹_1주차Red Hat OpenStack 17 저자직강+스터디그룹_1주차
Red Hat OpenStack 17 저자직강+스터디그룹_1주차
 
How to deploy oVirt using Nested KVM environment?
How to deploy oVirt using Nested KVM environment?How to deploy oVirt using Nested KVM environment?
How to deploy oVirt using Nested KVM environment?
 
제로부터시작하는오픈소스
제로부터시작하는오픈소스제로부터시작하는오픈소스
제로부터시작하는오픈소스
 
Linux Kernel 101 for Beginner
Linux Kernel 101 for BeginnerLinux Kernel 101 for Beginner
Linux Kernel 101 for Beginner
 
Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표
 
시스템 관리자를 위한 리눅스강의 1강 20130203
시스템 관리자를 위한 리눅스강의 1강 20130203시스템 관리자를 위한 리눅스강의 1강 20130203
시스템 관리자를 위한 리눅스강의 1강 20130203
 
Linux Performan tuning Part I
Linux Performan tuning Part ILinux Performan tuning Part I
Linux Performan tuning Part I
 
Hm10 Research sheets
Hm10 Research sheetsHm10 Research sheets
Hm10 Research sheets
 
망고210 android fastboot nand write 방법
망고210 android fastboot nand write 방법망고210 android fastboot nand write 방법
망고210 android fastboot nand write 방법
 
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
 
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안
 
[IBM 서버] POWER9
[IBM 서버] POWER9[IBM 서버] POWER9
[IBM 서버] POWER9
 
Power_780+(9179-MHD)표준제안서
Power_780+(9179-MHD)표준제안서Power_780+(9179-MHD)표준제안서
Power_780+(9179-MHD)표준제안서
 
150625 마이크로커널 운영체제 김지은
150625 마이크로커널 운영체제 김지은150625 마이크로커널 운영체제 김지은
150625 마이크로커널 운영체제 김지은
 
Rhel7 beta information
Rhel7 beta informationRhel7 beta information
Rhel7 beta information
 

Mehr von NAVER D2

Mehr von NAVER D2 (20)

[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다
 
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
 
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기
 
[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발
 
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
 
[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A
 
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기
 
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning
 
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications
 
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingOld version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
 
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
 
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
 
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화[224]네이버 검색과 개인화
[224]네이버 검색과 개인화
 
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
 
[213] Fashion Visual Search
[213] Fashion Visual Search[213] Fashion Visual Search
[213] Fashion Visual Search
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화
 
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
 
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?
 

[241] 하나의 cpu 에 운영제체 두 개 김성민

  • 1. 아무 짝에도 쓸모 없을 것 같던 하나의 CPU 에 운영체제 두 개 부팅시키기 김성민 ㈜구름네트웍스 1
  • 3. CONTENTS 1. Hypervisor, Container, 그리고 Multi-Kernel Architecture 2. 이걸 도대체 어디에 쓰나? 3. PopcornLinux 분석 4. Linux 2개 부팅 시키기 5. Linux + PacketNgin 부팅 시키기 6. Linux + PacketNgin Network Performance 3
  • 5. 1.1 Hypervisor 5 Source: vmware.com Type 1 Hypervisor Type 2 Hypervisor
  • 6. 1.1 Hypervisor 6 Source: vmware.com Type 1 Hypervisor Type 2 Hypervisor
  • 7. 1.1 Hypervisor 7 VMware vSphere/ESXi Microsoft Hyper-V Citrix Xen Linux KVM (??) VMware Workstation Oracle VirtualBox QEMU Linux KVM (??) Source: searchservervirtualization.techtarget.com/news/2240034817/ KVM-reignites-Type-1-vs-Type-2-hypervisor-debate
  • 10. 1.2 Container 10 Linux Docker Linux LXC Linux OpenVZ Solaris Container FreeBSD jail Source: cloudacademy.com/blog/container-virtualization/
  • 13. 1.3 Multi-Kernel Architecture 13 Popcorn Linux – Linux + Linux Nucleus RTOS – Linux + Nucleus PacketNgin RTOS – Linux + PacketNgin Network Processors – Linux + Firmware Source: popcornlinux.org
  • 15. 2.1 모바일 분야 – ARM TrustZone 15Source: www.arm.com/products/processors/technologies/trustzone/tee-smc.php
  • 16. 2.1 모바일 분야 – ARM TrustZone 16Source: www.arm.com/files/pdf/TrustZone-and-FIDO-white-paper.pdf
  • 17. 2.2 서버 분야 – Many-core Architecture Source: blogs.intel.com/technology/2012/06/intel-xeon-phi-coprocessors-accelerate-discovery-and-innovation/ 17
  • 18. 2.2 서버 분야 – Many-core Architecture 18Source: www.ssrg.ece.vt.edu/theses/MS_Katz.pdf
  • 19. 2.2 서버 분야 – Many-core Architecture 19Source: www.pugetsystems.com/labs/articles/Adobe-After-Effects-CC-2015-Multi-Core-Performance-714/
  • 20. 2.2 서버 분야 – Many-core Architecture 20Source: queue.acm.org/detail.cfm?id=2000516
  • 21. 2.2 서버 분야 – Many-core Architecture 21Source: www.intel.com/content/www/us/en/processors/xeon/xeon-phi-detail.html
  • 22. 2.3 네트워크 분야 –Control Plane/Data Plane 22Source: www.linkedin.com/pulse/6wind-from-data-plane-acceleration-virtual-appliances-humair-ahmed
  • 24. BIOS Disk의 MBR을 읽어 메모리에 로딩 3.1 O/S 부팅 과정 (x86_64, BIOS 기준) 24 BSP(BootStrap Processor), Core 0 AP(Application Processor), Core 1 ~ n MBR (Stage 1, 16bit) Stage 2 로더를 메모리에 로딩 Stage 2 로더 (16bit) Kernel을 메모리에 로딩 16bit -> 32bit 전환 Kernel (32bit) 커널 재배치 32bit -> 64bit 전환 로더 (trampoline_64.S, 16bit) Kernel을 메모리에 로딩 16bit -> 32bit 전환 Kernel (32bit) 커널 재배치 32bit -> 64bit 전환
  • 25. 3.2 Linux Kernel Booting 25Source: www.linux-arm.org/LinuxBootLoader/SMPBoot
  • 26. 3.3 PopcornLinux Booting 26 CPU Memory PCI Core 0 Core 1 Core 2 Core 3 Core 4 Core 5 Core 6 Core 7 0M ~ 8GB NIC0 NIC1 NIC2 NIC3
  • 27. 3.3 PopcornLinux Booting (First Booting) 27 Core 0 Core 1 Core 2 Core 3 Core 4 Core 5 Core 6 Core 7 CPU Memory 0M ~ 8GB NIC0 PCI NIC1 NIC2 NIC3 PopcornLinux Kernel
  • 28. 28 Core 0 Core 1 Core 2 Core 3 Core 4 Core 5 Core 6 Core 7 CPU Memory 0M ~ 8GB NIC0 PCI NIC1 NIC2 NIC3 PopcornLinux Kernel 1. Core의 개수 2. Memory의 용량 3. PCI 디바이스 목록 4. CPU, Memory, PCI 할당 규칙 3.3 PopcornLinux Booting (First Booting)
  • 29. 3.3 PopcornLinux Booting (Master Booting) 29 Core 0 Core 1 Core 2 Core 3 Core 4 Core 5 Core 6 Core 7 CPU Memory 0M ~ 8GB NIC0 PCI NIC1 NIC2 NIC3 PopcornLinux Master Kernel
  • 30. 3.3 PopcornLinux Booting (Secondary Booting) 30 Core 0 Core 1 Core 2 Core 3 Core 4 Core 5 Core 6 Core 7 CPU Memory 0M ~ 8GB NIC0 PCI NIC1 NIC2 NIC3 PopcornLinux Master Kernel PopcornLinux Secondary Kernel
  • 31. 3.3 PopcornLinux Booting (Source Code) 31 Booting /arch/x86/include/asm/bootparam.h Booting /arch/x86/kernel/e820.c Booting /arch/x86/kernel/head64.c Booting /arch/x86/kernel/process_64.c Booting /arch/x86/kernel/setup.c Booting /arch/x86/kernel/smpboot.c Booting /arch/x86/kernel/trampoline.c Booting /arch/x86/kernel/trampoline_64_bsp.S Booting /arch/x86/kernel/vmlinux.lds.S Booting /include/linux/multikernel.h Booting /kernel/multikernel.c
  • 32. 3.3 PopcornLinux Booting (Source Code) 32 CPU /arch/x86/include/asm/apic.h CPU /arch/x86/kernel/apic/io_apic.c CPU /arch/x86/kernel/cpu/common.c CPU /arch/x86/kernel/i387.c CPU /arch/x86/kernel/traps.c CPU /drivers/acpi/processor_driver.c CPU /include/linux/sched.h Memory /arch/x86/mm/dump_pagetables.c Memory /mm/memblock.c Memory /mm/nobootmem.c
  • 33. 3.3 PopcornLinux Booting (Source Code) 33 Interrupt /arch/x86/include/asm/unistd_64.h Interrupt /include/linux/syscalls.h VTY /arch/x86/include/asm/entry_arch.h VTY /drivers/tty/serial/8250.c VTY /drivers/tty/tty_buffer.c VTY /drivers/tty/vty.c
  • 34. Core 0 Core 1 Core 2 Core 3 Core 4 Core 5 Core 6 Core 7 3.4 CPU Partitioning (Overview) 34 CPU 1. Booting parameter 추가 2. Linux Kernel의 CPU mask 정보 조작 linux/arch/x86/setup.c arch/x86/kernel/smpboot.c
  • 35. 3.4 CPU Partitioning (Master Booting) 35 Core 0 Core 1 Core 2 Core 3 Core 4 Core 5 Core 6 Core 7 CPU 1. Core 0번에서 Kernel 부팅 1. BIOS가 MBR(Stage 1 Loader) 로딩 (16bit mode) 2. Stage 1 Loader는 Stage 2 Loader 로딩 (16bit mode) 3. Stage 2 Loader는 Kernel 로딩 (16bit -> 32bit mode) 4. Kernel은 메모리 주소 재배치 (32bit -> 64bit mode)
  • 36. 3.4 CPU Partitioning (Master Booting) 36 1. INIT IPI (Inter-Process Interrupt) 2. 100us wait 3. INIT IPI 4. 100us wait 5. STARTUP IPI 6. 200us wait INIT, INIT, STARTUP IPI Core 0 Core 1 Core 2 Core 3 Core 4 Core 5 Core 6 Core 7 CPU 1. Core 0번에서 Kernel 부팅 2. Core 0번이 Core 1~3에 Startup Interrupt 전송 (smpboot.c)
  • 37. 3.4 CPU Partitioning (Master Booting) 37 Core 0 Core 1 Core 2 Core 3 Core 4 Core 5 Core 6 Core 7 CPU 1. Core 0번에서 Kernel 부팅 2. Core 0번이 Core 1~3에 Startup Interrupt 전송 (smpboot.c) 3. Core 1~3번은 Kernel 부팅 (trampoline_64.S) 1. Core 1~3은 trampoine_64.S 를 실행 2. trampoine_64.S는 CPU mode를 16bit -> 32bit로 전환 3. Kernel로 Jump 4. Kernel은 32bit -> 64bit 전환
  • 38. 3.4 CPU Partitioning (Secondary Booting) 38 1. Primary Linux은 Secondary Linux의 BSP (BootStrap Processor) Kernel을 부팅 Core 0 Core 1 Core 2 Core 3 Core 4 Core 5 Core 6 Core 7 CPU INIT, INIT, STARTUP IPI 1. INIT IPI (Inter-Process Interrupt) 2. 100us wait 3. INIT IPI 4. 100us wait 5. STARTUP IPI 6. 200us wait
  • 39. 3.4 CPU Partitioning (Secondary Booting) 39 Core 0 Core 1 Core 2 Core 3 Core 4 Core 5 Core 6 Core 7 CPU 1. Primary Linux은 Secondary Linux의 BSP (BootStrap Processor) Kernel을 부팅 2. Secondary Linux의 BSP Kernel 부팅 1. BIOS는 trampoline_64_bsp.S를 실행 2. trampoline_64_bsp.S는 Kernel 로딩 (16bit -> 32bit mode) 3. Kernel은 메모리 주소 재배치 (32bit -> 64bit mode)
  • 40. 3.4 CPU Partitioning (Secondary Booting) 40 INIT, INIT, STARTUP IPI Core 0 Core 1 Core 2 Core 3 Core 4 Core 5 Core 6 Core 7 CPU 1. Primary Linux은 Secondary Linux의 BSP (BootStrap Processor) Kernel을 부팅 2. Secondary Linux의 BSP Kernel 부팅 3. BSP Kernel은 AP Kernel 부팅
  • 41. 3.4 CPU Partitioning (Secondary Booting) 41 Core 0 Core 1 Core 2 Core 3 Core 4 Core 5 Core 6 Core 7 CPU 1. Primary Linux은 Secondary Linux의 BSP (BootStrap Processor) Kernel을 부팅 2. Secondary Linux의 BSP Kernel 부팅 3. BSP Kernel은 AP Kernel 부팅 4. Secondary Linux의 AP Kernel 부팅 완료 1. Core 1~3은 trampoine_64.S 를 실행 2. trampoine_64.S는 CPU mode를 16bit -> 32bit로 전환 3. Kernel로 Jump 4. Kernel은 32bit -> 64bit 전환
  • 42. 3.5 Memory Partitioning (Overview) 42 1. Booting parameter 추가 2. Page table 조작 Memory 0M ~ 8GB Primary Linux Secondary Linux 0MB 4GB 0MB 4GB
  • 44. 44
  • 45. 3.5 Memory Partitioning (Overview) 45 1. Booting parameter 추가 2. Page table 조작 linux/arch/x86/kernel/e820.c linux/arch/x86/kernel/e820.c Memory 0M ~ 8GB Primary Linux Secondary Linux 0MB 4GB 0MB 4GB
  • 46. 3.5 Memory Partitioning (Master Booting) 46 Memory 0M ~ 8GB 1. Booting parameter 추가 memmap=4G@0M mem=4G 1. e820.c에서 0~4GB 영역을 사용 가능한 영역으로 포함 시킴 2. 메모리는 최대한 4GB만 할당함
  • 47. 3.5 Memory Partitioning (Master Booting) 47 1. Booting parameter 추가 memmap=4G@0M mem=4G 2. Page Table 설정 arch/x86/mm/init_64.c Memory 0M ~ 8GB
  • 48. Memory 0M ~ 8GB 1. e820.c에서 0~4GB 영역을 사용 불가능한 영역으로 포함 시킴 2. 메모리는 최대한 8GB만 할당함 (8GB – 4GB = 4GB) 3.5 Memory Partitioning (Secondary Booting) 48 1. Booting parameter 추가 memmap=4G@0M mem=4G 2. Page Table 설정 3. Booting parameter 추가 memmap=4G$0M mem=8G
  • 49. 3.5 Memory Partitioning (Secondary Booting) 49 1. Booting parameter 추가 memmap=4G@0M mem=4G 2. Page Table 설정 3. Booting parameter 추가 memmap=4G$0M mem=4G 4. Page Table 설정 arch/x86/mm/init_64.c Memory 0M ~ 8GB
  • 50. 3.6 PCI Device Partitioning (Overview) 50 1. PCI black list를 Kernel 파라미터로 받음 2. 사용 가능한 PCI 목록에서 black list 제외 PCI 0 PCI 2 PCI 3PCI 1
  • 51. 3.6 PCI Device Partitioning (Overview) 51 Bus, Slot, Function Vendor ID, Device ID
  • 52. 3.6 PCI Device Partitioning (Master Booting) 52 1. PCI black list를 Kernel 파라미터로 받음 pci_dev_flag=0x8086:0x7010:b,0x8086:0 x100e:b linux/drivers/pci/probe.c PCI 2 PCI 3PCI 0 PCI 1 1. Boot 파라미터 해석 2. Black list에 해당 PCI device 포함 3. PCI probe 단계에서 해당 PCI device는 제외
  • 53. 53
  • 54. 3.6 PCI Device Partitioning (Secondary Booting) 54 1. PCI black list를 Kernel 파라미터로 받음 2. 사용 가능한 PCI 목록에서 black list 제외 3. Master Kernel에서 사용하는 PCI 목록을 black list에 파라미터로 받음 4. 사용 가능한 PCI 목록에서 black list 제외 PCI 0 PCI 2 PCI 3PCI 1 1. Boot 파라미터 해석 2. Black list에 해당 PCI device 포함 3. PCI probe 단계에서 해당 PCI device는 제외
  • 55. 3.7 Multi-Kernel 간의 통신 55 Memory 0M ~ 8GB 1. Kernel 간에 공유하는 메모리 공간 할당 2. 모든 Kernel에게 해당 공간 주소를 Kernel 파라 미터로 넘겨줌 3. Kernel들은 공유 메모리를 통해 정보를 주고 받음 linux/drivers/tty/vty.c VTY , Tunnel 영역
  • 56. 4. Linux 2개 부팅 시키기 PopcornLinux 버그 수정 버전 https://github.com/packetngin/popcorn 56
  • 60. 4.4 Linux Kernel Download 60
  • 61. 4.5 Patch Linux Kernel 61
  • 65. 4.9 Build Popcorn Utils 65
  • 66. 4.10 VTY Configuration 66 Boot parameter 설정 Grub 설정
  • 68. 4.12 Master Linux Booting 68 Core가 1개만 할당된 것을 확인
  • 69. 4.12 Master Linux Booting 69 메모리가 약 870MB 할당된 것을 확인 (VTY 등 영역 제외 한 수치)
  • 70. 4.13 Build Secondary Linux Image 70 ELF 형식에서 .notes, .comment 섹션을 삭제
  • 71. 4.14 Booting Secondary Linux 71 1. RAM disk 복사 copy_ramdisk $RAMDISK_ADDR $RAMDISK_FILE 2. Kernel parameter 복사 wr_cmdline $BOOT_ARGS 3. Kernel image 복사 kexec -d -a $BOOT_ADDR -l $KERNEL -t elf-x86_64 --args-none 4. Kernel 부팅 kexec -d -a $BOOT_ADDR -b $CPU
  • 72. 4.15 Secondary Linux 접속 72
  • 73. 4.16 Secondary Linux 확인 73 1번 Core 1개만 할당된 것을 확인
  • 74. 5. Linux + PacketNgin 부팅 시키기 74
  • 75. 5.1 PacketNgin RTOS 소개 (1/4) 75 Eth IP TCP Payload Ether Block IP Block TCP Block Web Browser Kernel Space User Space NICEth IP TCP Payload IP TCP Payload TCP Payload Payload General Purpose O/S Eth IP TCP Payload Ether Block Firewall Kernel Space User Space NICEth IP TCP Payload Eth IP TCP Payload Network O/S
  • 76. 5.1 PacketNgin RTOS 소개 (2/4) 76 Programmability • Linux는 Host Network Programming 하기에 적합한 O/S • PacketNgin은 Network Node Programming 하기에 적합한 O/S • ARP, ICMP, IPsec 소스 코드의 양이 Linux에 비해 2/3 ~ 1/2 수준
  • 77. 5.1 PacketNgin RTOS 소개 (3/4) 77 + Network H/W depedent code + deliver_skb() + ret = pt_prev->func(skb, skb->dev, pt_prev); + ip_rcv() + nf_hook() + ip_rcv_finish() + ip_route_input() + dst_input()->ip_forward() or ip_input() + ip_input // Remove the IPv4 header + ip_input_finish + ret = ipprot->handler(&skb, &nhoff); + xfrm4_rcv() + xfrm_input() + xfrm4_parse_spi() + xfrm_state_lookup() // lookup IPsec SA + xfrm_beet_input(skb, x) //To change to inner IP header. + nexthdr = x->type->input(x, xfrm.decap, skb) // == esp_input + esp_input() // process ESP based on inner address + returns 0 ; + /* beet handling in xfrm_rcv_spi */ + netif_rx() + // ip_input_finish returns 0 + // netif_receive_skb returns 0 +netif_receive_skb // Now we have an IPv4 packet. So the input flow is for v4 packet. + deliver_skb() + ret = pt_prev->func(skb, skb->dev, pt_prev); + ip_rcv() + nf_hook() //This calls ip_rcv_finish(skb) + ip_rcv_finish() // Here the skb->dst is NULL and so is filled for the input side. + ip6_route_input() + dst_input()->ip_forward() or ip_input() + ip_input // Remove the IPv4 header + ip_input_finish + … + Network H/W depedent code + nic_process_output() + fifo_push() + ni_input() + ipsec_inbound() + sad_get() + ipsec_decrypt() + spd_get() + ni_output()
  • 78. 5.1 PacketNgin RTOS 소개 (4/4) 78
  • 79. 5.2 Porting – Popcorn Utility 79 kexec 변경 1. Linux는 16MB 영역에 로딩 2. PacketNgin은 4MB 영역에 로딩 3. Hard-coding address => 16MB Booting utility 1. Hard-coding address => 16MB Hard-coding address => 4MB Hard-coding address => 4MB
  • 80. 5.3 Porting – Kernel 변경 80 Booting logic 변경 1. BSP Booting – Grub과 호환 2. AP Booting – 자체 제작 loader에서 16bit -> 32bit 전환 Standard I/O 방식 변경 1. VGA Buffer에 직접 출력하는 방식 2. 자체 제작한 VGA 드라이버 사용 1. BSP Booting 필요 없음 2. Kexec와 호환되도록 loader 수정 1. Master Linux Kernel과 충돌 2. Serial 통신으로 대체 3. (차후)VTY와 호환 되도록 수정
  • 81. 5.3 Porting – Kernel 변경 81 Memory map 변경 1. PacketNgin Kernel은 2~6MB 사용 Kernel parameter 전달 방식 변경 1. Grub2에서 제공되는 Multiboot2 스펙 1. Linux Kernel과 PacketNgin Kernel 영역이 겹치는 문제 2. PacketNgin Kernel을 4~8MB로 이동 1. Linux boot parameter 스펙과 호환되도록 변경
  • 82. 5.3 Porting – Kernel 변경 82 Linux Inter-Processor Interrupt와 호환되도록 변경 1. Linux IPI 번호 체계와 PacketNgin IP 번호 체계 충돌 1. Linux에서 사용하지 않는 IPI 번호를 PacketNgin IPI 번호로 할당함
  • 83. 5.3 Porting – Manager App 변경 83 PacketNgin Manager -> Linux로 포팅 1. PacketNgin Shell 2. PacketNgin Manage API 3. VM 관리 API 4. App 관리 API 1. Linux Shell로 대체 2. Linux에서 동작하는 Manage API 3. Linux에서 동작하는 VM 관리 API 4. Linux에서 동작하는 App 관리 API
  • 84. 5.3 Porting – Network I/O 고속화 84 Interrupt 방식 -> Polling 방식 변경 1. Polling 방식으로 고속으로 I/O 2. PacketNgin 자체 Device Driver 사용 1. Linux의 NAPI 최대한 활용 2. Interrupt와 Polling 방식 병행 3. Linux Device Driver 최소한으로 수정 Packet Processing API 변경 1. PacketNgin 자체 Packet 구조체 1. sk_buff <-> Packet 구조체 간 변환 로직 구현
  • 86. 6.1 Goal – 6WindGate Performance 86Source: www.slideshare.net/openstack_kr/6-wind-openstackkoreameetup27may15/4
  • 87. 6.1 Goal – 6WindGate Performance 87Source: blog.ipspace.net/2012/02/6wind-solving-virtual-appliance.html
  • 88. 6.1 Goal – 6WindGate Performance 88Source: www.linkedin.com/pulse/6wind-from-data-plane-acceleration-virtual-appliances-humair-ahmed
  • 89. 6.2 Goal – PacketNgin 1.0 89 Core i5 + NetFPGA NIC +420%
  • 90. Linux 6.3 Network I/O– Linux vs PacketNgin 90 NIC Core 0 Core 1 Core 2 Core 3 0M ~ 8GB UDP Echo Eth IP UDP Payload Ether Block IP Block UDP Block UDP Echo Kernel Space User Space NICEth IP UDP Payload IP UDP Payload UDP Payload Payload
  • 91. 6.3 Network I/O– Linux vs PacketNgin 91 UDP Echo Eth IP UDP Payload Ether Block UDP Echo Kernel Space User Space NICEth IP UDP Payload Eth IP UDP Payload NIC Core 0 Core 1 Core 2 Core 3 0M ~ 8GB Linux PacketNgin
  • 92. 6.3 Network I/O–PacketNgin 2.0 92 UDP Echo Packet NIC Core 0 Core 1 Core 2 Core 3 0M ~ 8GB Linux PacketNgin 1. Packet이 NIC에 도착
  • 93. 6.3 Network I/O–PacketNgin 2.0 93 1. Packet이 NIC에 도착 2. Linux의 NIC Driver에서 Packet을 확인 UDP Echo NIC Core 0 Core 1 Core 2 Core 3 0M ~ 8GB Linux PacketNginPacket
  • 94. 6.3 Network I/O–PacketNgin 2.0 94 1. Packet이 NIC에 도착 2. Linux의 NIC Driver에서 Packet을 확인 3. NIC Driver에서 패킷을 복제해 PacketNgin Kernel로 전달 Packet UDP Echo NIC Core 0 Core 1 Core 2 Core 3 0M ~ 8GB Linux PacketNgin
  • 95. 6.3 Network I/O–PacketNgin 2.0 95 Packet 1. Packet이 NIC에 도착 2. Linux의 NIC Driver에서 Packet을 확인 3. NIC Driver에서 패킷을 복제해 PacketNgin Kernel로 전달 4. PacketNgin Kernel은 UDP Echo App 에게 Packet을 전달 5. UDP Echo App은 Packet을 처리 UDP Echo NIC Core 0 Core 1 Core 2 Core 3 0M ~ 8GB Linux PacketNgin
  • 96. 6.3 Network I/O–PacketNgin 2.0 96 1. Packet이 NIC에 도착 2. Linux의 NIC Driver에서 Packet을 확인 3. NIC Driver에서 패킷을 복제해 PacketNgin Kernel로 전달 4. PacketNgin Kernel은 UDP Echo App 에게 Packet을 전달 5. UDP Echo App은 Packet을 처리 6. PacketNgin Kernel -> Linux Kernel - > NIC 순서로 Packet 출력 UDP Echo NIC Core 0 Core 1 Core 2 Core 3 0M ~ 8GB Linux PacketNgin Packet
  • 97. 6.4 Result–UDP Echo Performance 97
  • 98. 6.5 Wrap-Up 98 1. Multi-Kernel Architecture 2. Popcorn Linux 3. Control Plane / Data Plane 4. Performance – 130~1,300%↑
  • 99. Q & A 99 PopcornLinux 버그 수정 버전 https://github.com/packetngin/popcorn PacketNgin 2.0 Preview https://goo.gl/rxET1T