BPF ๋ฐ eBPF์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์†Œ๊ฐœ

์•ˆ๋…•, ํ•˜๋ธŒ๋ฅด! ์ฑ… ์ถœ๊ฐ„์„ ์ค€๋น„ ์ค‘์ด๋ผ๋Š” ์†Œ์‹์„ ์ „ํ•ด๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค."BPF๋ฅผ ์‚ฌ์šฉํ•œ Linux ๊ด€์ธก์„ฑ".

BPF ๋ฐ eBPF์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์†Œ๊ฐœ
BPF ๊ฐ€์ƒ ๋จธ์‹ ์€ ์ง€์†์ ์œผ๋กœ ๋ฐœ์ „ํ•˜๊ณ  ์‹ค์ œ๋กœ ํ™œ๋ฐœํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์š” ๊ธฐ๋Šฅ๊ณผ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ธฐ์‚ฌ๋ฅผ ๋ฒˆ์—ญํ–ˆ์Šต๋‹ˆ๋‹ค.

์ตœ๊ทผ์—๋Š” ๊ณ ์„ฑ๋Šฅ ํŒจํ‚ท ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฆฌ๋ˆ…์Šค ์ปค๋„์˜ ํ•œ๊ณ„๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋„๊ตฌ์™€ ๊ธฐ์ˆ ์ด ์ ์  ๋Œ€์ค‘ํ™”๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ปค๋„ ์šฐํšŒ (์ปค๋„ ์šฐํšŒ) ์ปค๋„ ๋„คํŠธ์›Œํฌ ๊ณ„์ธต์„ ์šฐํšŒํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ ๋ชจ๋“  ํŒจํ‚ท ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค๋„์„ ์šฐํšŒํ•˜๋ ค๋ฉด ๋„คํŠธ์›Œํฌ ์นด๋“œ๋ฅผ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒƒ๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ณต๊ฐ„. ์ฆ‰, ๋„คํŠธ์›Œํฌ ์นด๋“œ๋กœ ์ž‘์—…ํ•  ๋•Œ ๋“œ๋ผ์ด๋ฒ„์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ณต๊ฐ„.

๋„คํŠธ์›Œํฌ ์นด๋“œ์— ๋Œ€ํ•œ ์ „์ฒด ์ œ์–ด๊ถŒ์„ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ด์ „ํ•จ์œผ๋กœ์จ ์šฐ๋ฆฌ๋Š” 10Gb/s ์ด์ƒ์˜ ์†๋„๋กœ ์‹คํ–‰ํ•  ๋•Œ ๋งค์šฐ ์ค‘์š”ํ•œ ์ปค๋„ ์˜ค๋ฒ„ํ—ค๋“œ(์ปจํ…์ŠคํŠธ ์ „ํ™˜, ๋„คํŠธ์›Œํฌ ๊ณ„์ธต ์ฒ˜๋ฆฌ, ์ธํ„ฐ๋ŸฝํŠธ ๋“ฑ)๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค. ์ปค๋„ ์šฐํšŒ์™€ ๊ธฐํƒ€ ๊ธฐ๋Šฅ์˜ ์กฐํ•ฉ(์ผ๊ด„ ์ฒ˜๋ฆฌ) ๋ฐ ์‹ ์ค‘ํ•œ ์„ฑ๋Šฅ ์กฐ์ •(NUMA ํšŒ๊ณ„, CPU ๊ฒฉ๋ฆฌ๋“ฑ)์€ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ์˜ ๊ณ ์„ฑ๋Šฅ ๋„คํŠธ์›Œํฌ ์ฒ˜๋ฆฌ์˜ ๊ธฐ๋ณธ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ํŒจํ‚ท ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ์ƒˆ๋กœ์šด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์˜ˆ์‹œ์ ์ธ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. DPDK ์ธํ…”(๋ฐ์ดํ„ฐ ํ”Œ๋ ˆ์ธ ๊ฐœ๋ฐœ ํ‚คํŠธ), ๋ฌผ๋ก  Cisco์˜ VPP(๋ฒกํ„ฐ ํŒจํ‚ท ์ฒ˜๋ฆฌ), Netmap ๋ฐ ์Šค๋ƒ….

์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ ๋„คํŠธ์›Œํฌ ์ƒํ˜ธ ์ž‘์šฉ์„ ๊ตฌ์„ฑํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • OS ์ปค๋„์€ ํ•˜๋“œ์›จ์–ด ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ถ”์ƒํ™” ๊ณ„์ธต์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ํ”„๋กœ๊ทธ๋žจ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž์ฒด ํ•˜๋“œ์›จ์–ด๋„ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ข…์ข… ์ž์‹ ์˜ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ์ปค๋„ ๊ณต๊ฐ„์„ ์™„์ „ํžˆ ํฌ๊ธฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปค๋„์ด ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ๋„คํŠธ์›Œํ‚น ๊ธฐ๋Šฅ๋„ ํฌ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ํ”„๋กœ๊ทธ๋žจ์€ ์ปค๋„์ด๋‚˜ ์šด์˜ ์ฒด์ œ์—์„œ ์ด๋ฏธ ์ œ๊ณตํ–ˆ์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋กœ๊ทธ๋žจ์€ ์ƒŒ๋“œ๋ฐ•์Šค ๋ชจ๋“œ์—์„œ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์ƒํ˜ธ ์ž‘์šฉ์ด ์‹ฌ๊ฐํ•˜๊ฒŒ ์ œํ•œ๋˜๊ณ  ์šด์˜ ์ฒด์ œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„๊ณผ ํ†ตํ•ฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ณธ์งˆ์ ์œผ๋กœ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ ๋„คํŠธ์›Œํ‚นํ•  ๋•Œ ํŒจํ‚ท ์ฒ˜๋ฆฌ๋ฅผ ์ปค๋„์—์„œ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์œผ๋กœ ์ด๋™ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. XDP๋Š” ์ •๋ฐ˜๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋„คํŠธ์›Œํ‚น ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„(ํ•„ํ„ฐ, ํ™•์ธ์ž, ๋ผ์šฐํŒ… ๋“ฑ)์—์„œ ์ปค๋„ ๊ณต๊ฐ„์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. XDP๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒจํ‚ท์ด ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค์— ๋„๋‹ฌํ•˜์ž๋งˆ์ž ์ปค๋„ ๋„คํŠธ์›Œํฌ ํ•˜์œ„ ์‹œ์Šคํ…œ์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ์ „์— ๋„คํŠธ์›Œํฌ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ํŒจํ‚ท ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ปค๋„์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ปค๋„ ๊ณต๊ฐ„์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์–ด๋–ป๊ฒŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ? ์ด ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ธฐ ์ „์— BPF๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

BPF ๋ฐ eBPF

ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์ด๋ฆ„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  BPF(Berkeley Packet Filtering)๋Š” ์‹ค์ œ๋กœ ๊ฐ€์ƒ ๋จธ์‹  ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ€์ƒ ๋จธ์‹ ์€ ์›๋ž˜ ํŒจํ‚ท ํ•„ํ„ฐ๋ง์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด๋ฆ„์ด ๋ถ™์—ฌ์กŒ์Šต๋‹ˆ๋‹ค.

BPF๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜๋Š” tcpdump. ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ท์„ ์บก์ฒ˜ํ•  ๋•Œ tcpdump ์‚ฌ์šฉ์ž๋Š” ํŒจํ‚ท์„ ํ•„ํ„ฐ๋งํ•˜๋Š” ํ‘œํ˜„์‹์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ‘œํ˜„์‹๊ณผ ์ผ์น˜ํ•˜๋Š” ํŒจํ‚ท๋งŒ ์บก์ฒ˜๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "tcp dst port 80โ€๋Š” ํฌํŠธ 80์— ๋„์ฐฉํ•˜๋Š” ๋ชจ๋“  TCP ํŒจํ‚ท์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด ํ‘œํ˜„์‹์„ BPF ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ sudo tcpdump -d "tcp dst port 80"
(000) ldh [12] (001) jeq #0x86dd jt 2 jf 6
(002) ldb [20] (003) jeq #0x6 jt 4 jf 15
(004) ldh [56] (005) jeq #0x50 jt 14 jf 15
(006) jeq #0x800 jt 7 jf 15
(007) ldb [23] (008) jeq #0x6 jt 9 jf 15
(009) ldh [20] (010) jset #0x1fff jt 15 jf 11
(011) ldxb 4*([14]&0xf)
(012) ldh [x + 16] (013) jeq #0x50 jt 14 jf 15
(014) ret #262144
(015) ret #0

์œ„ ํ”„๋กœ๊ทธ๋žจ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ช…๋ น(000): ์˜คํ”„์…‹ 12์˜ ํŒจํ‚ท์„ 16๋น„ํŠธ ์›Œ๋“œ๋กœ ๋ˆ„์‚ฐ๊ธฐ์— ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์˜คํ”„์…‹ 12๋Š” ํŒจํ‚ท์˜ ์—ํ…Œ๋ฅด ์œ ํ˜•์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ๋ช…๋ น(001): ๋ˆ„์‚ฐ๊ธฐ์˜ ๊ฐ’์„ 0x86dd, ์ฆ‰ IPv6์˜ ์—ํ…Œ๋ฅด ์œ ํ˜• ๊ฐ’๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ ์ฐธ์ด๋ฉด ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ๋Š” ๋ช…๋ น์–ด(002)๋กœ ์ด๋™ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ช…๋ น์–ด(006)๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ช…๋ น(006): ๊ฐ’์„ 0x800(IPv4์˜ ์—ํ…Œ๋ฅด ์œ ํ˜• ๊ฐ’)๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋‹ต์ด ์ฐธ์ด๋ฉด ํ”„๋กœ๊ทธ๋žจ์€ (007)๋กœ ์ด๋™ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด (015)๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

ํŒจํ‚ท ํ•„ํ„ฐ๋ง ํ”„๋กœ๊ทธ๋žจ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถ€์šธ์ž…๋‹ˆ๋‹ค. 014์ด ์•„๋‹Œ ๊ฐ’(๋ช…๋ น์–ด(015))์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํŒจํ‚ท์ด ์Šน์ธ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•˜๊ณ , XNUMX(๋ช…๋ น์–ด(XNUMX))์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํŒจํ‚ท์ด ์Šน์ธ๋˜์ง€ ์•Š์•˜์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

BPF ๊ฐ€์ƒ ๋จธ์‹ ๊ณผ ํ•ด๋‹น ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” 1992๋…„ ํ›„๋ฐ˜์— Steve McCann๊ณผ Van Jacobson์ด ๋…ผ๋ฌธ์„ ๋ฐœํ‘œํ•˜๋ฉด์„œ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. BSD ํŒจํ‚ท ํ•„ํ„ฐ: ์‚ฌ์šฉ์ž ์ˆ˜์ค€ ํŒจํ‚ท ์บก์ฒ˜๋ฅผ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜์ด ๊ธฐ์ˆ ์€ 1993๋…„ ๊ฒจ์šธ Usenix ์ปจํผ๋Ÿฐ์Šค์—์„œ ์ฒ˜์Œ ๋ฐœํ‘œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

BPF๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์ด๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ํ™˜๊ฒฝ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”์ดํŠธ์ฝ”๋“œ ์™ธ์—๋„ ๋ฐฐ์น˜ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ(๋กœ๋“œ ๋ช…๋ น์ด ๋ฐฐ์น˜์— ์•”์‹œ์ ์œผ๋กœ ์ ์šฉ๋จ), ๋ ˆ์ง€์Šคํ„ฐ(A ๋ฐ X, ๋ˆ„์‚ฐ๊ธฐ ๋ฐ ์ธ๋ฑ์Šค ๋ ˆ์ง€์Šคํ„ฐ), ์Šคํฌ๋ž˜์น˜ ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ์†Œ ๋ฐ ์•”์‹œ์  ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ๋„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กญ๊ฒŒ๋„ BPF ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” Motorola 6502 ISA๋ฅผ ๋ชจ๋ธ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์Šคํ‹ฐ๋ธŒ ๋งฅ์บ”(Steve McCann)์ด ๊ทธ์˜ ๊ธ€์—์„œ ํšŒ์ƒํ–ˆ๋“ฏ์ด ์ „์ฒด๋ณด๊ณ  Sharkfest '11์—์„œ ๊ทธ๋Š” ๊ณ ๋“ฑํ•™๊ต ์‹œ์ ˆ Apple II ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ†ตํ•ด ๋นŒ๋“œ 6502์— ์ต์ˆ™ํ–ˆ์œผ๋ฉฐ ์ด ์ง€์‹์€ BPF ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ์ž‘์—…์— ์˜ํ–ฅ์„ ๋ฏธ์ณค์Šต๋‹ˆ๋‹ค.

BPF ์ง€์›์€ ๋ฒ„์ „ v2.5 ์ด์ƒ์˜ Linux ์ปค๋„์—์„œ ๊ตฌํ˜„๋˜๋ฉฐ ์ฃผ๋กœ Jay Schullist์˜ ๋…ธ๋ ฅ์œผ๋กœ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. BPF ์ฝ”๋“œ๋Š” Eric Dumaset์ด JIT ๋ชจ๋“œ์—์„œ ์‹คํ–‰๋˜๋„๋ก BPF ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์žฌ์„ค๊ณ„ํ•œ 2011๋…„๊นŒ์ง€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(์ถœ์ฒ˜: ํŒจํ‚ท ํ•„ํ„ฐ์šฉ JIT). ๊ทธ ํ›„ ์ปค๋„์€ BPF ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๋Š” ๋Œ€์‹  BPF ํ”„๋กœ๊ทธ๋žจ์„ x86, ARM, MIPS ๋“ฑ์˜ ๋Œ€์ƒ ์•„ํ‚คํ…์ฒ˜๋กœ ์ง์ ‘ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ดํ›„ 2014๋…„ Alexey Starovoitov๋Š” BPF๋ฅผ ์œ„ํ•œ ์ƒˆ๋กœ์šด JIT ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด ์ƒˆ๋กœ์šด JIT๋Š” ์ƒˆ๋กœ์šด BPF ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋˜์—ˆ์œผ๋ฉฐ eBPF๋ผ๊ณ  ๋ถˆ๋ ธ์Šต๋‹ˆ๋‹ค. ํ•œ๋™์•ˆ ๋‘ VM์ด ๊ณต์กดํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”๋ฐ, ํ˜„์žฌ ํŒจํ‚ท ํ•„ํ„ฐ๋ง์€ eBPF ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ํ˜„๋Œ€ ๋ฌธ์„œ์˜ ๋งŽ์€ ์˜ˆ์—์„œ BPF๋Š” eBPF๋กœ ์ดํ•ด๋˜๋ฉฐ ๊ธฐ์กด BPF๋Š” ์˜ค๋Š˜๋‚  cBPF๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

eBPF๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํด๋ž˜์‹ BPF ๊ฐ€์ƒ ๋จธ์‹ ์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.

  • ์ตœ์‹  64๋น„ํŠธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. eBPF๋Š” 64๋น„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ ˆ์ง€์Šคํ„ฐ ์ˆ˜๋ฅผ 2(๋ˆ„์‚ฐ๊ธฐ ๋ฐ X)์—์„œ 10์œผ๋กœ ๋Š˜๋ฆฝ๋‹ˆ๋‹ค. eBPF๋Š” ๋˜ํ•œ ์ถ”๊ฐ€ opcode(BPF_MOV, BPF_JNE, BPF_CALL...)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋„คํŠธ์›Œํฌ ๊ณ„์ธต ํ•˜์œ„ ์‹œ์Šคํ…œ์—์„œ ๋ถ„๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. BPF๋Š” ๋ฐฐ์น˜ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์— ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ท ํ•„ํ„ฐ๋ง์— ์‚ฌ์šฉ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ฝ”๋“œ๋Š” ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ์ œ๊ณตํ•˜๋Š” ํ•˜์œ„ ์‹œ์Šคํ…œ์— ์œ„์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ eBPF ๊ฐ€์ƒ ๋จธ์‹ ์€ ๋” ์ด์ƒ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์— ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์œผ๋ฉฐ ์–ด๋–ค ๋ชฉ์ ์œผ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ eBPF ํ”„๋กœ๊ทธ๋žจ์„ Tracepoint ๋˜๋Š” kprobe์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ์ปค๋„ ํ•˜์œ„ ์‹œ์Šคํ…œ์˜ ๋งฅ๋ฝ์—์„œ eBPF ๊ณ„์ธก, ์„ฑ๋Šฅ ๋ถ„์„ ๋ฐ ๊ธฐํƒ€ ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ๊ธธ์„ ์—ด์–ด์ค๋‹ˆ๋‹ค. ์ด์ œ eBPF ์ฝ”๋“œ๋Š” ์ž์ฒด ๊ฒฝ๋กœ์ธ kernel/bpf์— ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ง€๋„๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ธ€๋กœ๋ฒŒ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ. ๋งต์€ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„๊ณผ ์ปค๋„ ๊ณต๊ฐ„ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. eBPF๋Š” ์—ฌ๋Ÿฌ ์œ ํ˜•์˜ ๋งต์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณด์กฐ ๊ธฐ๋Šฅ. ํŠนํžˆ, ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ์ฒดํฌ์„ฌ์„ ๊ณ„์‚ฐํ•˜๊ฑฐ๋‚˜ ํŒจํ‚ค์ง€๋ฅผ ๋ณต์ œํ•˜๋ ค๋ฉด ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋Š” ์ปค๋„ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋˜๋ฉฐ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ํ”„๋กœ๊ทธ๋žจ์ด ์•„๋‹™๋‹ˆ๋‹ค. eBPF ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ†ตํ™”๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. eBPF์˜ ํ”„๋กœ๊ทธ๋žจ ํฌ๊ธฐ๋Š” 4096๋ฐ”์ดํŠธ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ํ…Œ์ผ ์ฝœ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด eBPF ํ”„๋กœ๊ทธ๋žจ์ด ์ œ์–ด๊ถŒ์„ ์ƒˆ eBPF ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ด์ „ํ•˜์—ฌ ์ด ์ œํ•œ์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์ตœ๋Œ€ 32๊ฐœ์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ).

eBPF: ์˜ˆ์‹œ

Linux ์ปค๋„ ์†Œ์Šค์—๋Š” eBPF์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ˜ํ”Œ/bpf/์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜ˆ์ œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

$ sudo make samples/bpf/

eBPF์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์˜ˆ์ œ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ, Samples/bpf/์— ์žˆ๋Š” ์ƒ˜ํ”Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ์ผ๋ถ€ ๋ถ€๋ถ„์„ ์‚ดํŽด๋ณด๊ณ  ์ž‘๋™ ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ œ๊ฐ€ ์„ ํƒํ•œ ํ”„๋กœ๊ทธ๋žจ์€ tracex4.

์ผ๋ฐ˜์ ์œผ๋กœ Samples/bpf/์˜ ๊ฐ ์˜ˆ์ œ๋Š” ๋‘ ๊ฐœ์˜ ํŒŒ์ผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ:

  • tracex4_kern.c, eBPF ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ์ปค๋„์—์„œ ์‹คํ–‰๋  ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • tracex4_user.c, ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์˜ ํ”„๋กœ๊ทธ๋žจ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ์—๋Š” ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. tracex4_kern.c eBPF ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ. ํ˜„์žฌ gcc eBPF์— ๋Œ€ํ•œ ๋ฐฑ์—”๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„, clang eBPF ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Makefile ะธัะฟะพะปัŒะทัƒะตั‚ clang ์ปดํŒŒ์ผ์„ ์œ„ํ•ด tracex4_kern.c ๊ฐœ์ฒด ํŒŒ์ผ์—.

์œ„์—์„œ eBPF์˜ ๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋งต์ด๋ผ๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. Tracex4_kern์€ ํ•˜๋‚˜์˜ ๋งต์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

struct pair {
    u64 val;
    u64 ip;
};  

struct bpf_map_def SEC("maps") my_map = {
    .type = BPF_MAP_TYPE_HASH,
    .key_size = sizeof(long),
    .value_size = sizeof(struct pair),
    .max_entries = 1000000,
};

BPF_MAP_TYPE_HASH eBPF์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ์นด๋“œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ๋‹จ์ง€ ํ•ด์‹œ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ด‘๊ณ ๋ฅผ ๋ณด์…จ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค SEC("maps"). SEC๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์˜ ์ƒˆ๋กœ์šด ์„น์…˜์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋งคํฌ๋กœ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์˜ˆ์‹œ์—์„œ๋Š” tracex4_kern ๋‘ ๊ฐœ์˜ ์„น์…˜์ด ๋” ์ •์˜๋ฉ๋‹ˆ๋‹ค.

SEC("kprobe/kmem_cache_free")
int bpf_prog1(struct pt_regs *ctx)
{   
    long ptr = PT_REGS_PARM2(ctx);

    bpf_map_delete_elem(&my_map, &ptr); 
    return 0;
}
    
SEC("kretprobe/kmem_cache_alloc_node") 
int bpf_prog2(struct pt_regs *ctx)
{
    long ptr = PT_REGS_RC(ctx);
    long ip = 0;

    // ะฟะพะปัƒั‡ะฐะตะผ ip-ะฐะดั€ะตั ะฒั‹ะทั‹ะฒะฐัŽั‰ะตะน ัั‚ะพั€ะพะฝั‹ kmem_cache_alloc_node() 
    BPF_KRETPROBE_READ_RET_IP(ip, ctx);

    struct pair v = {
        .val = bpf_ktime_get_ns(),
        .ip = ip,
    };
    
    bpf_map_update_elem(&my_map, &ptr, &v, BPF_ANY);
    return 0;
}   

์ด ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ง€๋„์—์„œ ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(kprobe/kmem_cache_free) ์ง€๋„์— ์ƒˆ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(kretprobe/kmem_cache_alloc_node). ๋Œ€๋ฌธ์ž๋กœ ์ž‘์„ฑ๋œ ๋ชจ๋“  ํ•จ์ˆ˜ ์ด๋ฆ„์€ ๋‹ค์Œ์— ์ •์˜๋œ ๋งคํฌ๋กœ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. bpf_helpers.h.

๊ฐœ์ฒด ํŒŒ์ผ์˜ ์„น์…˜์„ ๋คํ”„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒˆ ์„น์…˜์ด ์ด๋ฏธ ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ objdump -h tracex4_kern.o

tracex4_kern.o: file format elf64-little

Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000000 0000000000000000 0000000000000000 00000040 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 kprobe/kmem_cache_free 00000048 0000000000000000 0000000000000000 00000040 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
2 kretprobe/kmem_cache_alloc_node 000000c0 0000000000000000 0000000000000000 00000088 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
3 maps 0000001c 0000000000000000 0000000000000000 00000148 2**2
CONTENTS, ALLOC, LOAD, DATA
4 license 00000004 0000000000000000 0000000000000000 00000164 2**0
CONTENTS, ALLOC, LOAD, DATA
5 version 00000004 0000000000000000 0000000000000000 00000168 2**2
CONTENTS, ALLOC, LOAD, DATA
6 .eh_frame 00000050 0000000000000000 0000000000000000 00000170 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA

์•„์ง ๊ฐ€์ง€๊ณ ์žˆ๋‹ค. tracex4_user.c, ๋ฉ”์ธ ํ”„๋กœ๊ทธ๋žจ. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ํ”„๋กœ๊ทธ๋žจ์€ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. kmem_cache_alloc_node. ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น eBPF ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ๊ฐœ์ฒด์˜ IP ์†์„ฑ์„ ๋งต์— ์ €์žฅํ•˜๊ณ  ๊ฐœ์ฒด๋Š” ๊ธฐ๋ณธ ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•ด ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค. ์˜ˆ:

$ sudo ./tracex4
obj 0xffff8d6430f60a00 is 2sec old was allocated at ip ffffffff9891ad90
obj 0xffff8d6062ca5e00 is 23sec old was allocated at ip ffffffff98090e8f
obj 0xffff8d5f80161780 is 6sec old was allocated at ip ffffffff98090e8f

์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ํ”„๋กœ๊ทธ๋žจ๊ณผ eBPF ํ”„๋กœ๊ทธ๋žจ์€ ์–ด๋–ค ๊ด€๋ จ์ด ์žˆ๋‚˜์š”? ์ดˆ๊ธฐํ™” ์‹œ tracex4_user.c ๊ฐ์ฒด ํŒŒ์ผ ๋กœ๋“œ tracex4_kern.o ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ load_bpf_file.

int main(int ac, char **argv)
{
    struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY};
    char filename[256];
    int i;

    snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);

    if (setrlimit(RLIMIT_MEMLOCK, &r)) {
        perror("setrlimit(RLIMIT_MEMLOCK, RLIM_INFINITY)");
        return 1;
    }

    if (load_bpf_file(filename)) {
        printf("%s", bpf_log_buf);
        return 1;
    }

    for (i = 0; ; i++) {
        print_old_objects(map_fd[1]);
        sleep(1);
    }

    return 0;
}

ํ•˜๊ณ ์žˆ์„ ๋•Œ load_bpf_file eBPF ํŒŒ์ผ์— ์ •์˜๋œ ํ”„๋กœ๋ธŒ๊ฐ€ ๋‹ค์Œ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. /sys/kernel/debug/tracing/kprobe_events. ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์—์„œ ์กฐ์น˜๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ sudo cat /sys/kernel/debug/tracing/kprobe_events
p:kprobes/kmem_cache_free kmem_cache_free
r:kprobes/kmem_cache_alloc_node kmem_cache_alloc_node

Sample/bpf/์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์€ ์œ ์‚ฌํ•˜๊ฒŒ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ํ•ญ์ƒ ๋‘ ๊ฐœ์˜ ํŒŒ์ผ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • XXX_kern.c: eBPF ํ”„๋กœ๊ทธ๋žจ.
  • XXX_user.c: ๋ฉ”์ธ ํ”„๋กœ๊ทธ๋žจ.

eBPF ํ”„๋กœ๊ทธ๋žจ์€ ์„น์…˜๊ณผ ์—ฐ๊ด€๋œ ๋งต ๋ฐ ๊ธฐ๋Šฅ์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ์ปค๋„์ด ํŠน์ • ์œ ํ˜•์˜ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœํ–‰ํ•  ๋•Œ(์˜ˆ: tracepoint), ๋ฐ”์ธ๋”ฉ๋œ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์นด๋“œ๋Š” ์ปค๋„ ํ”„๋กœ๊ทธ๋žจ๊ณผ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„์˜ ํ†ต์‹ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” BPF์™€ eBPF๋ฅผ ์ผ๋ฐ˜์ ์ธ ์šฉ์–ด๋กœ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ eBPF์— ๋Œ€ํ•œ ๋งŽ์€ ์ •๋ณด์™€ ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ถ”๊ฐ€ ์—ฐ๊ตฌ๋ฅผ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋” ์ถ”์ฒœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ฝ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค :

  • BPF: ๋ฒ”์šฉ ์ปค๋„ ๋‚ด ๊ฐ€์ƒ ๋จธ์‹  ์กฐ๋‚˜๋‹จ ์ฝ”๋ฒ ํŠธ. BPF์— ๋Œ€ํ•œ ์†Œ๊ฐœ์™€ ์ด๊ฒƒ์ด eBPF๋กœ ์–ด๋–ป๊ฒŒ ๋ฐœ์ „ํ–ˆ๋Š”์ง€ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  • eBPF์— ๋Œ€ํ•œ ์ฒ ์ €ํ•œ ์†Œ๊ฐœ ๋ธŒ๋ Œ๋“  ๊ทธ๋ ˆ๊ทธ. LWN.net์˜ ๊ธฐ์‚ฌ. Brendan์€ eBPF์— ๋Œ€ํ•ด ์ž์ฃผ ํŠธ์œ—ํ•˜๊ณ  ์ž์‹ ์˜ ์ฃผ์ œ์— ๋Œ€ํ•œ ๋ฆฌ์†Œ์Šค ๋ชฉ๋ก์„ ์œ ์ง€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ธ”๋กœ๊ทธ.
  • BPF ๋ฐ eBPF์— ๋Œ€ํ•œ ์ฐธ๊ณ  ์‚ฌํ•ญ ์ค„๋ฆฌ์•„ ์—๋ฐ˜์Šค. Suchakra Sharma์˜ "BSD ํŒจํ‚ท ํ•„ํ„ฐ: ์‚ฌ์šฉ์ž ์ˆ˜์ค€ ํŒจํ‚ท ์บก์ฒ˜๋ฅผ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜" ํ”„๋ ˆ์  ํ…Œ์ด์…˜์— ๋Œ€ํ•œ ์˜๊ฒฌ์ž…๋‹ˆ๋‹ค. ๋Œ“๊ธ€์ด ํ›Œ๋ฅญํ•˜๊ณ  ์Šฌ๋ผ์ด๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • eBPF, 1๋ถ€: ๊ณผ๊ฑฐ, ํ˜„์žฌ, ๋ฏธ๋ž˜ ํŽ˜๋ฆฌ์Šค ์—˜๋ฆฌ์Šค. ์žฅ๋ฌธ ๊ณ„์†, ํ•˜์ง€๋งŒ ์ฝ์–ด๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. eBPF์— ๊ด€ํ•ด ๋‚ด๊ฐ€ ๋ณธ ์ตœ๊ณ ์˜ ๊ธฐ์‚ฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€