메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

BPF로 리눅스 관측 가능성 향상하기

성능 분석과 네트워킹을 위한 고급 프로그래밍

한빛미디어

번역서

판매중

  • 저자 : 데이비드 칼라베라 , 로렌초 폰타나
  • 번역 : 류광
  • 출간 : 2020-05-01
  • 페이지 : 236 쪽
  • ISBN : 9791162243053
  • 물류코드 :10305
  • 초급 초중급 중급 중고급 고급
4.1점 (10명)
좋아요 : 43

유능한 엔지니어로 레벨업할 BPF 완벽 활용 가이드

 

이 책은 시스템 엔지니어를 위한 리눅스 커널의 BPF VM에 관한 전문 지식을 제공합니다. BPF 프로그램의 수명 주기를 자세히 설명할 뿐만 아니라, 커널에서 벌어지는 사건들을 감시, 추적, 관찰하는 코드를 주입해 커널의 행동을 좀 더 안전하고 안정적으로 관찰하고 수정하는 방법을 알려줍니다. C, Go, 파이썬으로 작성된 다양한 예제 코드로 BPF의 필수 개념을 익히고 나면 일상 업무를 좀 더 효율적으로 수행하게 됨은 물론 성능 최적화, 네트워킹, 보안에 관한 기본기도 향상될 것입니다.

 

 

BPF는 무엇이고 어디에 사용될까?

 

BPF(Berkeley Packet Filter)는 리눅스 4.18부터 도입된 기능으로, iptables와 nftables를 대체할 만한 기능입니다. BPF는 성능에 영향을 주지 않고도 리눅스 기능을 확장하며, 관측 가능성(observability)을 향상합니다. 여기서 관측 가능성이란 임의의 시스템에 임의의 복잡한 질문을 던지고 그 응답을 얻을 수 있는 능력을 말합니다. 관측 가능성을 향상하면 복잡한 시스템의 커널을 지속적으로 관찰하고 수정할 수 있어 안정적으로 소프트웨어를 실행할 수 있습니다.  

 

 

BPF를 배우는 데 이 책이 유용한 이유

 

이 책은 BPF의 역사부터 BPF 프로그램의 유형, BPF 맵을 생성하고 다루는 방법, BPF 유틸리티 활용법과 실제 사용 사례까지 소개합니다. 책에서 제공하는 다양한 예제를 공부하면서 자신만의 도구를 만들다 보면 BPF를 자유자재로 활용할 수 있을 것이며, 실제 업무에 BPF를 유용하게 활용할 수 있는 유능한 엔지니어로 레벨업할 것입니다.

 

 

이 책의 대상 독자

  • 시스템 엔지니어
  • 네트워크 성능 분석 전문가
  • 리눅스 커널 개발자

 

 

이 책에서 다루는 내용

  • BPF 맵으로 커널과 사용자 공간 통신 채널 확립하기
  • BCC 프레임워크로 추적 프로그램 작성하기
  • 고품질 BPF 기반 도구인 BPFTool, BPFTrace, eBPF Exporter 활용법 알아보기
  • 네트워크의 소통량(traffic)을 분석하고 메시지 전달 제어하기
  • 고성능 패킷 처리기인 XDP 프로그램 알아보기
  • 리눅스 커널 보안 능력(capability)과 seccomp로 필터 작성하기

 

데이비드 칼라베라 저자

데이비드 칼라베라

Netlify의 CTO이다. 도커의 개발 관리자로 일했으며, Runc와 Go, BCC 도구들을 비롯해 여러 오픈소스 프로젝트에 기여했다. 데이비드는 도커 프로젝트들과 관련해서 도커 플러그인 생태계를 만들고 관리한 것으로 이름을 알렸다. 불꽃 그래프와 성능 최적화에 크나큰 애착을 지니고 있다.

로렌초 폰타나 저자

로렌초 폰타나

Sysdig 사의 오픈소스 팀에서 클라우드 네이티브 컴퓨팅 파운데이션 프로젝트인 Falco를 개발한다. Falco는 커널 모듈과 eBPF를 이용해서 컨테이너 런타임 보안 및 비정상 검출을 수행하는 제품이다. 분산 시스템, 소프트웨어 정의 네트워크(SDN), 리눅스 커널, 성능 분석에 열정을 지니고 있다.

류광 역자

류광

25년 이상의 번역 경력을 가진 전문 번역가로, 『컴퓨터 프로그래밍의 예술』(The Art of Computer Programming) 시리즈와 『UNIX 고급 프로그래밍』(Advanced Programming in UNIX Environment ) 제2판 및 제3판, 『인공지능: 현대적 접근방식』(Artificial Intelligence: A Modern Approach) 제3판 및 제4판, 『Game Programming Gems』 시리즈를 비롯해 80권 이상의 다양한 IT 전문서를 번역했다. 본서와 관련이 깊은 번역서로는 『유연한 소프트웨어를 만드는 설계 원칙』(한빛미디어, 2020)이 있다.

 

개인 웹사이트 류광의 번역 이야기(https://occamsrazr.net)와 게임 개발 웹사이트 Gpg Study(https://gpgstudy.com)를 운영한다. 

 

 

제1장 소개

__1.1 BPF의 역사

__1.2 구조

__1.3 결론

 

제2장 생애 첫 BPF 프로그램

__2.1 BPF 프로그램 작성

__2.2 BPF 프로그램 유형

__2.3 BPF 검증기

__2.4 BPF 메타자료

__2.5 BPF 꼬리 호출

__2.6 결론

 

제3장 BPF 맵

__3.1 BPF 맵 생성

__3.2 BPF 맵 다루기

__3.3 BPF 맵 유형

__3.4 BPF 가상 파일 시스템

__3.5 결론

 

제4장 BPF를 이용한 실행 추적

__4.1 탐침

__4.2 추적 자료의 시각화

__4.3 결론

 

제5장 BPF 유틸리티

__5.1 BPFTool

__5.2 BPFTrace

__5.3 kubectl-trace

__5.4 eBPF Exporter

__5.5 결론

 

제6장 리눅스 네트워킹과 BPF

__6.1 BPF와 패킷 필터링

__6.2 BPF 기반 TC 분류기

__6.3 결론

 

제7장 XDP 프로그램

__7.1 XDP 프로그램의 개요

__7.2 XDP와 BCC

__7.3 XDP 프로그램의 검사

__7.4 XDP 활용 사례

__7.5 결론

 

제8장 리눅스 커널 보안, 능력, seccomp

__8.1 능력

__8.2 seccomp

__8.3 BPF LSM 훅

__8.4 결론

 

제9장 실제 응용 사례

__9.1 Sysdig의 eBPF ‘신(god)’ 모드

__9.2 Flowmill

IMG_1510.JPG

 

 

현업에서 high level의 시스템 영역을 개발하면서, 이따금씩 CPU, MEM 자체 불량의 이슈, 네트워크 레이턴시의 저하 등등

저의 책임영역과는 거리가 있지만 의존관계에 있기때문에 low level 계층에서 뭔가 이슈사항이 있다면

고스란히 영향이 오곤 했습니다.

이런 상황에서 top, syslog 등을 최대한 활용해 지속적으로 가정을 내리고 '만약 이렇다면..? 이렇지 않을까?'

란 자문자답을 거듭하며 문제점의 범위를 좁히고 오랜시간이 걸려 문제를 찾고 해결하곤했습니다. 

본 서적에 의하면, 이와 같은 방식은 observability 관점에서 질문을 던지고 답을 얻는 방식이라 합니다.

또한, 제 경험에선 metricbeat나 sar를 사용해 CPU, MEM의 자원모니터링과 같이 지표를 설정하고 이에 대해

임의의 이상치 임계값을 설정하는 등은 metric 기반의 방식이라 합니다.

무엇이 되었든, 저수준의 OS, kernel레벨에서 시스템콜과 같은 기록 들을 여과없이 남길 수 있다면

이 또한 큰 정보가 되겠습니다.

 

본 서적에서 소개하는 BPF는 저수준의 kernel레벨에서 다양한 추적방식을 제공하는 도구 입니다.

저에게는 좀 난이도가 있는 책이었는데요. 최소한 정보수집과 이벤트 추적에 있어서 넓은 가능성과 희망을

보여주었다는 점에 대해서는 BPF에 대해서 시간을 두고 더 깊이 파보고 싶은 생각입니다.

 

bpf를 기반으로 도움을 주는 유틸리티와 다양한 대상(소켓, k8s 노드, cgroups, runtime process, system call 등) 들에 대해 추적 데이터를 얻어내고 시각화하는 방법을 소개한 책입니다.

 

저수준에서 시스템을 면밀히 모니터링하고자 하는 분들에게 추천드립니다.

본 서적에서 소개하는 BPF는 저수준의 kernel레벨에서 다양한 추적방식을 제공하는 도구 입니다.

저에게는 좀 난이도가 있는 책이었는데요. 최소한 정보수집과 이벤트 추적에 있어서 넓은 가능성과 희망을

보여주었다는 점에 대해서는 BPF에 대해서 시간을 두고 더 깊이 파보고 싶은 생각입니다.

 

 

컴퓨터 기술이 발전하면서 관측의 중요성이 올라가는데요. 중요 정보가 있는 사이트의 경우 보안 부분에 민감한 경우들이 많이 있습니다. 일반 사이트 경우 보안이 취약할 경우 회원가입을 했는지 확인하기 위해 아이디를 쳐보고 확인합니다. 비밀번호만 틀렸다고 알려주는 창이 나오면 회원 가입한 아이디이기 때문에 아이디 정보를 얻을 수 있는 문제가 발생합니다. 그래서 보안을 유지하기 위해서는 아이디, 비밀번호 둘 중 하나라도 틀릴 경우 동일한 응답이 나오게 해야 됩니다.

 

응답은 아이디와 비밀번호가 틀렸다는 것을 응답하므로 추측을 못 하게 보완됐습니다. 이번에 알아볼 저서는 BPF로 리눅스 관측 가능성 향상하기입니다. BPF는 버클리 패킷 필터로 네트워크 트래픽을 분석하기 위해 사용되는 기술입니다. 이 저서에 가장 먼저 만나게 되는 문장은 비야네 스트롭스트룹의 우리의 문명은 소프트웨어를 바탕으로 돌아간다.” 인용글을 볼 수 있는데요. 소프트웨어의 기반으로 현대 문명을 지탱하는 컴퓨팅 기반구조에서 큰 자리를 차지하고 있는 것이 바로 리눅스 커널입니다.

 

우리 사람에 직·간접적으로 영향을 미치는 수많은 소프트웨어가 리눅스 커널에 의존하며, 어떤 운영체제이든 커널은 극도의 성능과 보안이 요구되는 영역입니다. 리눅스 커널은 아무나 건드릴 수 없는 소수의 전문가에게만 허용되는 영역으로 간주하는데요. 그 점을 생각하면, 평범한 개발자도 스크립팅과 vm을 통해 편하고 안전하게 리눅스 커널 안에서 원하는 코드를 실행하게 하는 BPF의 기술은 흥미롭다고 생각합니다.

 

먼저 관측 가능성 접근 방식은 주어진 임의의 시스템에 대해 임의의 복잡한 질문을 던지고 그 응답을 얻을 수 있는 능력을 정의하는데요. 관측 가능성과 로그, 측정치 취합의 차이점은 각각이 수집하는 자료에 있습니다. 관측 가능성을 활용한다는 것이 임의의 시점에서 임의의 질문에 대한 답을 얻을 필요가 있다는 뜻이라고 할 때, 자료로부터 응용 프로그램의 행동을 추론하려면 시스템이 생성하는 모든 자료를 수집해야 하며, 그러면서도 질문에 대한 답을 얻어야 할 필요가 있을 때만 그 자료를 취합해야 합니다.

 

이 저서는 컴퓨팅 시스템의 관측 가능성을 높이는 데 도움이 되는 BPF의 여러 강력한 기능들을 제시합니다.

 

BPF 패킷 필터는 시스템 네트워크를 감시하는 데 사용하는데요. 커널과 사용자 공간 사이의 주된 자료를 교환할 때는 BPF 맵을 사용하며, BPF 확장되면서 커널 시스템의 변화 된 것도 볼 수 있습니다. eBPF는 기존 BPF 구현보다 최대 4배 빠르게 작동합니다. 예전 32bit 레지스터 2개에서 64bit 레지스터 열개로 확장됐습니다. BPF로 표기를 하지만 업그레이 된 부분으로 이해하고 개념을 배울 수 있습니다.

 

직접 자료를 취합하거나 분류할 수 있다는 점이다. 이는 수집한 자료를 손실 가능성 있는 대기열을 거쳐 사용자 공간에 보낸 후 거기서 취합, 처리해야 하는 기존 도구들에 비해 BPF의 확실한 장점을 볼 수 있습니다. 다양한 프로그래밍 언어로 BPF 프로그램을 작성하는 방법도 설명하고 있습니다. 또한 예제 코드를 https://oreil.ly/lbpf-repo에서 확인 할 수 있습니다.

 

BPF는 리눅스 4.18부터 도입된 기능으로 리눅스 기능을 확장해줍니다. 기능 확장을 통해 관측 가능성도 향상할 수 있으며, 관측하게 되면 시스템을 안정적으로 운영 가능합니다. BPF 학습을 통해 보안능력이 향상되시길 바랍니다. 이 저서의 주 독자층은 시스템 엔지니어와 네트워크 성능 분석 전문가, 리눅스 커널 개발자 등이 많을 거로 생각합니다. 이번 기회에 BPF를 이용해서 자신을 업글할 수 있는 추적 프로그램을 작성하는 방법을 추천합니다.

본 리뷰는 한빛미디어로부터 도서를 지원받아 작성되었습니다.

표지

올빼미책

따로 말 할 필요가 없다. 올빼기가 그려진 표지를 가지고 있다.

내용

BPF

Berkeley Packet Filter의 약자로, 대부분의 유닉스 계약 운영체제에서 사용 가능한 데이터 링크 계층의 원시 인터페이스를 제공한다.

리눅스 관측 가능성 향상

이 책은 리눅스에서 BPF를 어떻게 이용해야 커널 내에서 일어나는 일들을 효율적으로 분석하여 필요로 하는 정보를 얻을 수 있는지를 단계적으로 설명하고 있다. 기초적인 것 부터 차근차근 설명 해 주고 있기에 필자와 같이 BPF를 처음 잡하는 사람이라도 천천히 책의 흐름을 따라가며 공부한다면 어느새 BPF를 이용해 이전에는 상상도 못 하였던 다양한 작업을 할 수 있게 된다.

결론

이 책은 사실 개발을 위해 꼭 필요한 정보를 담은 책은 아니다. 하지만, BPF에 대해 알게 된다면 할 수 있는 것이 늘어난다는 사실에 변함은 없을 것이다. 리눅스를 이용하는 유저들은 이 책을 한 번쯤 읽어본다면 이전에는 알지 못 하였던 세상을 엿볼 수 있을 것이라 확신한다. 결론적으로, 이 책은 개발을 공부하는 데에 필수적인 요소라고 말할 수는 없지만 누군가에게 유용한 정보가 될 가능성을 가진 좋은 책이라 말하고 싶다.

책은 크게 3 부분으로 나뉜다.

기본적인 BPF 소개와 BPF 프로그램 유형에 따라 실행 추적과 네트워킹 부분으로 나뉜다.

BPF를 사용하는 방법을 소개한 후, 추적 및 네트워킹을 설명한다.

추적 부분은 BPF 프로그램을 이용해서 시스템에서 일어나는 일들을 추적하는 방법과 관련 툴에 대한 내용이고, 네트워킹은  BPF를 이용한 패킷 필터링과 툴에 대한 내용이다.

책의 설명은 주로 C 언어를 사용하고 Python과 GO도 쓰인다. 

책이 기본적으로 이미 BPF를 경험해 본 독자를 대상으로 작성된 책이기 때문에 처음 보는 사람 입장에서는 어려울 수 있다.

특히 리눅스 시스템에 대한 이해가 필요하며 예제 코드를 실행해보기 위해서는 준비도 해줘야 한다. 

책의 github에서 관련자료를 얻을 수 있지만 필요한데 의 경우도 설명이 친절히 일일이 돼있지 않아서 직접 찾아봐야 하는 것도 많다.



Linux_Observability_with_BPF.jpeg

 

이번에는 Linux Observability with BPF라는 제목을 가진 올빼미과의 소쩍새가 매력적인 책을 리뷰하게 되었다.

 

리눅스를 접하고 관련 일을 한지는 오래되었지만 BPF라는 내용은 생소하여 호기심에 신청하게 되었다.

 

 

3장까지 책을 천천히 읽은 후 든 가장 먼저 든 느낌은 ...

* 번역의 아쉬움, 번역된 내용으로 인한 집중력 저하?

 

 

마치 대학 때 교재 중 커널을 알맹이라고 해석했던 그 시절 기억이 다시금 드는 번역이었다.

영문 발음을 그대로 번역해도 IT서적에서는 문제될 부분이 없어보이는데 굳이 이런단어까지 번역을 했어야 하나 싶을 정도였다.

 

예로 SpinLock을 회전 자물쇠라고 표현하고 있었다.

나만 그렇게 느꼈을 수도 있지만 스핀락 이라고 씌인 책들은 많이 봤었도 회전 자물쇠라고 쓴 책은 처음 접하게 되었다.

읽는 동안에 가끔은 원서를 보고 싶어지게 하는 전체적인 번역에 아쉬움이 남는 책이었다.

 

 

책의 내용은 eBPF(Extended Berkeley Packet Filter)를 소개한다.

BPF 프로그램 빌드 방법 및 커널과 유저단에서 데이터 공유를 할 수 있는 방법은 BPF맵에 대한 설명을 하고 있다.

 

개념도 없던 나는 3장까지의 내용을 보니 대략적인 감을 잡을 수 있었다.

 

 

이 책을 선택한 이유는 BPF 프로그램을 직접 만들어보겠다는 생각보다는 내용중에 tcpdump에 대한 동작사항이 어떻게 이뤄지는지 궁금하여 보게되었다.

간단한 설명 후 특정 인터페이스의 패킷을 필터링하는 예제도 설명하고 있었다.

일단은 글로만 보고 넘어갔는데, 향후 커널 빌드 환경 구축 후 테스트 바이너리를 만들어봐야겠다.

 

 

정리하면..

번역에 대한 아쉬움은 남지만

저자들이 원했던 독자가 일상 업무에서 리눅스 하위 시스템을 다루는데 필요한 기본적인 BPF개념들에 익숙해지는데 도움을 주기 위해 책을 썼다 라고 했다.

그 의도에는 맞아 떨어지는 책이라고 생각하며 리뷰를 정리한다.



BPF 라이브러리가 갖는 각종 기능에 대해 여러 예제와 더불어 설명한 책

다만 책 자체의 목적 상 리눅스 시스템에 어느 정도 숙련된 경우가 아니라면 추천하기 힘들 것 같다.

종이책보다는 전자책이 활용에 더 도움이 될 것으로 보인다.

  • 이 책은 한빛미디어의 «나는 리뷰어다» 이벤트로 받은 서적입니다.

책표지!

1

혼자서 집에 있으면 라즈베리파이 커널 모듈리눅스 커널 모듈 등을 만지면서 여전히 리눅스 커널에 대해서 관심을 가지고 있어서, 잘 모르지만 ‘BPF’ 관련 서적 리뷰를 신청했다. 이 책은 단점과 장점이 공존하는데, 이 책의 장점 중 하나로 번역을 ‘류광’님이 해주셔서 읽는데 전혀 문제가 없다. 하지만 BPF 자체가 리눅스 커널과 관련된 내용이 많다보니 아무래도 책의 난이도가 높다.

프로젝트에서 Docker를 사용할 때, 모니터링 때문에 애를 먹었는데 이 기사를 참고하면서 처음으로 BPF에 대해서 알게되었다. BPF는 Berkeley Packet filter 의 약자로 이름에서 알 수 있듯이 네트워크 분석을 위해 사용되던 툴인데 지금은 마개조 되어서 어플리케이션 분석 및 프로파일링을 지원하는 툴로 발전하였다.

아마 이 책의 서평을 읽으시는 분들은 위에 기술한 내용은 대부분 알것으로 생각된다. 나도 BPF에 대해서 관심을 가지고 책을 찾아봤는데, 대부분 영문 서적이라서 약간 실망한 기억이 있고 국내에 BPF 관련 교재는 이 책이 처음이지 싶다.

2

이 책을 읽으면서 제일 기대했던 것은 Python 코드와 Go 코드를 사용해서 BPF를 활용할 수 있는 방법을 소개한다는 점이다. 제4장 BPF를 이용한 실행 추적을 보면 Python과 Go 코드를 사용하는 예제들이 많아서, BPF를 처음 시작할 때 오는 부담감을 조금 덜 수 있다. 그리고 실무적으로 사용하기엔 너무 간단하지만 기본적으로 C를 사용해서 프로젝트를 진행하기 힘든 환경의 경우 많은 참고가 된다. 예제를 참고해서 책을 구매하기 전에 확인해봐도 좋을 듯 싶다.

3

얼마만에 보는 C 코드인가?!

하지만 제8장 리눅스 커널 보안, 능력, seccomp에서 와 같이 실무에서 사용할 수 있는 예제는 C로 만들어져 있어서 C 언어가 익숙하지 않으면 약간의 부담감이 있다. 하지만 로우-레벨에서 작업하기 때문에 C언어 뿐만 아니라 커널에 관한 기본적인 지식이 필요해서 해당 교재만 가지고 쉽사리 접근하기 쉽진 않다. 하지만 BPF가 리눅스 프로파일링 분야에서 다양하게 사용되고 있기 때문에 기능이 엄청나게 확장되고 있다. Go언어도 적절히 사용할 수 있다는 점이 BPF의 또 다른 장점인 듯 싶다.

4

가격이 저렴하고, 번역이 잘 되어있기 때문에 커널이나 프로파일링 혹은 로우 레벨에 관심이 있으시면 한 번 질러봐도 좋을 듯 싶습니다.

리눅스 커널은 소수의 전문가에게만 허용되는 영역으로 아무나 건드릴 수 있는 영역이 아니었다. BPF는 평범한 개발자도 스크립팅과 VM을 통해서 편하고 안전하게 리눅스 커널 안에서 원하는 코드를 실행하게 하는 흥미로운 기술이다. 프로그래머라면 디자인 패턴 중 옵저버 패턴을 생각하면 비슷할 것이다.

 

BPF를 사용하면 임의의 시스템 호출 또는 커널 함수를 추적할 수 있으며, 임의의 사용자 공간 프로그램도 추적할 수 있다. bpftrace(https://github.com/iovisor/bpftrace)는 리눅스에서 DTrace와 비슷한 기능을 제공하는 명령줄 도구이다. 이 도구를 이용하면 예를 들어 열린 파일들과 그것을 연 프로세스들을 추적하거나, 프로그램이 요청한 시스템 호출들을 세거나, OOM 킬러를 추적하는 등의 다양한 추적 작업을 수행할 수 있다. 간단히 말해서, 이 도구가 있으면 리눅스 시스템의 내부 상황을 완전히 파악할 BPF와 XDP는 Cloudflare(https://oreil.ly/OZdmj)와 페이스북(https://oreil.ly/wrM5-)의 부하 분산기에서 DDos 공격을 방지하는 용도로도 쓰인다.

 

 BPF 프로그램을 작성하는 것은 의외로 정말 간단하다. 책에서도 첫 머리에 소개되고 있지만 가장 간단한 예제를 소개하는 것 만큼 BPF를 잘 소개하는 것은 없다고 생각하기에 본문의 예제를 그대로 적어 보았다. 아래의 코드는 "Hello World"를 출력하는 프로그램과 비슷한 BPF 프로그램이다. 

이 예제는 execve 시스템 추적점이 검출되었을 때, BPF VM이 프로그램을 실행해야 함을 SEC매크로로 저장한다. 개발자는 추적점을 이용해서 커널의 실행 흐름 안의 특정 지점에 자신이 원하는 코드를 주입한다. 결과적으로 execve가 프로그램을 실행하는 상황을 커널이 포착할 때마다 Hello, BPF World!라는 메세지가 출력된다.

 

소스 코드의 마지막 줄은 이 프로그래므이 사용권(License)을 명시한 것이다. 리눅스 커널은 GPL 사용권을 따르므로 오직 GPL을 따르는 프로그램만 커널에 적재할 수 있다.

 

앞의 예제 코드를 bpf_program.c라는 이름의 소스 파일로 저장했다고 할 때, 이를 컴파일하는 명령은 다음과 같다. 

컴파일된 코드는 커널에 적재해야 한다. 커널은 프로그램의 컴파일과 적재(load)과정을 추상화하는 보조 함수들을 제공한다. 다음은 load_bpf_file 함수를 이용해서 앞에서 만든 이진 파일을 커널에 적재하는 프로그램이다. 

다음은 이 소스 코드를 컴파일, 링크해도 ELF 실행 파일을 만드는 셸 스크립트이다. 이 프로그램은 BPF VM에 적재할 것이 아니므로 -target 옵션을 지정할 필요가 없다. 각종 디렉토리를 지정한 것 외에, load_bpf_file 함수의 정의가 있는 bpf_load.c 파일도 함께 컴파일, 링크함을 주의하기 바란다. 여러 파일이 관여하는 빌드 작업을 수행할 때는 이처럼 스크립트를 사용하는 것이 편하다. 

이 스크립트를 통해서 컴파일 및 링크가 잘 진행되었다면 loader라는 실행 파일이 생긴다.

 

이 실행 파일은 반드시 sudo로 실행해야 한다.(이를테면 sudo ./loader). 이 프로그램을 실행하면 여러분이 컴퓨터로 아무 일도 하지 않았는데도 몇 초 후에 Hello, BPF World!라는 메세지가 나타나기 시작할 것이다. 이는 백그라운드에서 실행되는 프로그램이 다른 프로그램들을 실행하기 때문이다. 

 

2장까지는 생애 첫 BPF프로그램을 다룬다. 3장부터는 BPF 맵을 다루는데 이것은 커널 안에 존재하는 키-값 저장소이다. BPF맵은 그 위치를 아는 모든 BPF 프로그램이 접근할 수 있다. 커널 내의서 처리하는 여러 데이터와 장치들의 BPF맵에 대해 학습할 수 있다.

 

4장에서는 BPF를 이용해 커널과 사용자 공간을 탐침해 보고 히스토그램을 만드는 등 자료를 시각화 해 본다.

 

5장에서는 BPF를 편리하게 사용하도록 도와주는 BPFTool, BPFTrace, kubectl-trace 그리고 eBPF Exporter와 같은 유틸리티를 소개한다. 

 

6장과 7장에서는 패킷 필터링 등, 리눅스 네트워킹을 탐침하는 것을 배우고 XDP(Express Data Path)를 배운다. XDP는 안전하고 프로그래밍 가능하며 커널에 통합된 고성능 패킷 처리기이다. 리눅스 네트워크 자료 경로 안에서 XDP는 네트워크 인터페이스 카드(NIC)의 드라이브가 패킷을 받았을 때 적절한 BPF프로그램을 실행한다. XDP프로그램은 수신된 패킷의 운명(폐기, 수정, 허용)을 최대한 이른 시점에서 결정한다.

 

8장에서는 리눅스 커널 보안, 능력 그리고 seccomp에 대해 다룬다. BPF는 안정성과 속도를 해치지 않고 커널을 확장하는 강력한 수단이다. 그래서 커널 개발자들은 seccomp의 프로세스 격리 기능을 개선하는 데 BPF의 다재다능한 능력을 활용하기로 하고, BPF 프로그램을 seccomp의 필터로 사용할 수 있게 했다. 이를 seccomp BPF라고 부르기도 한다. Secure Computing(보안 컴퓨팅)을 줄인 SECCOMP는 리눅스 커널의 한 보안 계층으로, 개발자가 특정 시스템 호출을 필터링하게 만드는 용도로 쓰인다. 어떤 작업을 허용 또는 금지하는 수단이라는 점에서 seccomp는 커널 능력과 비슷하지만, 구체적인 시스템 호출들을 제어할 수 있다는 점에서 커널 능력보다 유연하다.

 

마지막으로 9장에서는 실제 응용 사례를 다룬다. 실제 응용 사례는 아래와 같다.

 

1. Sysdig의 eEBF '신(god)' 모드 

- Sysdig(시스디그)는 최초의 오픈소스 리눅스 문제해결(troubleshooting) 도구이자 그것을 만든 회사의 이름이다.

- Sysdig의 eBPF 구조는 아래와 같다. 219p이다. 

 - Sysdig BPF 성능 비교표는 아래와 같다. 221p이다.

2. Flowmill

 

- Flowmill(플로밀)은 관측 가능성 관련 스타트업으로, 창업자 조너선 페리(Jonathan Perry)가 참여한 Flowtune(https://oreil.ly/e9heR)이라는 학술 연구 프로젝트를 뿌리로 한다. Flowtune은 개별 패킷들의 처리 일정을 효율적으로 관리함으로서 데이터 센터 네트워크의 혼잡(congestion; 또는 밀집)을 해소하는 문제를 연구하는 프로젝트인데, 그러한 혼잡 해소에는 네트워크 관련 수치들을 아주 낮은 추가 부담으로 수집하느 기술이 필요했다. Flowmill은 BPF(eBPF)의 커널 탐침을 이용해서 모든 연린 소켓을 추적하고 소켓 연산 관련 수치들을 주기적으로 수집한다.

 

BPF는 리눅스 커널 내에서 일어나느 일들을 우리가 더욱 잘 탐침하고 그것을 활용할 수 있도록 도움을 준다. 리눅스 유저라면 BPF를 통해 커널과 유저레벨에서 일어나는 지표들을 BPF를 통해 편리하게 탐침할 수 있을 것이다. 여기엔 어떤 커널 모듈 관련 지식도 필요하지 않다. 오직 BPF를 활용하는 방법에 대한 지식만이 필요할 뿐이다. 리눅스 유저들은 BPF로 할 수 있는 일들에 대해 체계적으로 설명한 이 책을 통해 BPF를 단계별로 활용해 가면 꽤 괜찮으리라 생각한다. 

BPF_LINUX

목차

제1장 소개

제2장 생애 첫 BPF 프로그램

제3장 BPF 맵

제4장 BPF를 이용한 실행 추적

제5장 BPF 유틸리티

제6장 리눅스 네트워킹과 BPF

제7장 XDP 프로그램

제8장 리눅스 커널 보안, 능력, seccomp

제9장 실제 응용 사례

BPF 란 최초 Berkeley Packet filter 의 약자로 사용되었다. 리눅스 커널 네트워크 분석을 위해 사용되던 툴이 지금은 리눅스 커널과 어플리케이션 모두를 분석, 프로파일링 할 수 있는 유용한 툴로 발전하였습니다.

BPF를 온라인으로 학습하고 사용하다 처음 접한 도서가 Brendan Gregg가 작성한 'BPF Performance Tools' 란 책이였다. 외서로써 약 950페이지..? 정도의 책이였다. 스터디를 위해 공부하기 시작하였던 책이였는데, 이 책을 읽고 부족한 점을 느낀 분들은 해당 책을 읽어보는 것을 추천한다. 책은 매우 두껍고, 작가의 개인적인 내용도 있기에 필요한 부분만 찾아서 공부하는 것을 추천한다.

이 책은 내가 읽은 BPF에 관련된 두 번째 책이다. 솔직하게 말하자면, 이 책을 본다고 모두가 리눅스 성능 분석을 할 수 있는 것은 아니다. 분석은 분석하려는 시스템에 대한 이해도가 깊어야한다. 내가 분석하려는 시스템이 어떤 동작을 하는지, 적어도 분석하려는 특정 부분에 대해서는 이해하고, 트레이싱하려는 포인트 또한 알아야 한다. 간단한 예시로 시스템에서 특정 동작 중 파일 I/O 가 매우 느리다고 하자. 이 때 어디를 분석하겠는가? 이 책만 보고는 절대 알 수 없는 부분이다. 아니, Brendan Gregg가 작성한 'BPF Performance Tools' 책을 봐도 마찬가지 일 것 이다.

지금의 BPF 툴은 리눅스 프로파일링에서 점점 자리를 잡아가고 있으며 빠르게 다양한 기능이 확장되고 있습니다. 가장 좋은 건 제가 직접 코드를 작성하여 분석할 수 있다는 것입니다. 이 점은 dynamic tracing을 위한 다양한 기능과 더불어 매우 유용하게 사용될 수 있습니다.

프로파일링 업무를 하시는 분들에겐 BPF를 깊게 공부하는 것이 아닌, BPF가 이렇게 확장되서 사용되고 있구나 정도는 알 수 있는 책입니다. 좀 더 깊게 학습이 필요한 분들 Brendan Gregg 의 블로그나 github BPF 코드를 보는 것을 추천드려요!

감사합니다.

 

BPF(Berkeley Packet Filter) 즉 필터다.

최신 Linux에서 사용되는 네트워크 패킹 필터라고 할 수 있다.

책을 읽어봐도 Low Level 수준에 관련된 내용이 많이 나와서 잘 모르겠다.

처음에는 C언어를 활용해서 BPF예제를 만드는 내용이 좀 나오고,

GO언어를 활용하는 부분도 좀 나온다.

내 경우에는 직접 코드를 작성할 일은 별로 없을 뜻 하다.

하지만 Docker를 활용할 때 대부분 Linux 기반이기 때문에 tcpdump나 Sysdig정도는 알고 있으면

나중에 Docker를 사용할 때 풀리지 않는 문제가 있으면 활용해 볼 수 있을 듯하다.

결론은 Linux를 잘 모르는 독자에게는 몹시 어려운 책이다.

용어나 유틸리티 정도를 알아서 나중에 써 볼 수는 있을 듯하다.

결제하기
• 문화비 소득공제 가능
• 배송료 : 2,000원배송료란?

배송료 안내

  • 20,000원 이상 구매시 도서 배송 무료
  • 브론즈, 실버, 골드회원이 주문하신 경우 무료배송

무료배송 상품을 포함하여 주문하신 경우에는 구매금액에 관계없이 무료로 배송해 드립니다.

닫기

리뷰쓰기

닫기
* 도서명 :
BPF로 리눅스 관측 가능성 향상하기
* 제목 :
* 별점평가
* 내용 :

* 리뷰 작성시 유의사항

글이나 이미지/사진 저작권 등 다른 사람의 권리를 침해하거나 명예를 훼손하는 게시물은 이용약관 및 관련법률에 의해 제재를 받을 수 있습니다.

1. 특히 뉴스/언론사 기사를 전문 또는 부분적으로 '허락없이' 갖고 와서는 안됩니다 (출처를 밝히는 경우에도 안됨).
2. 저작권자의 허락을 받지 않은 콘텐츠의 무단 사용은 저작권자의 권리를 침해하는 행위로, 이에 대한 법적 책임을 지게 될 수 있습니다.

오탈자 등록

닫기
* 도서명 :
BPF로 리눅스 관측 가능성 향상하기
* 구분 :
* 상품 버전
종이책 PDF ePub
* 페이지 :
* 위치정보 :
* 내용 :

도서 인증

닫기
도서명*
BPF로 리눅스 관측 가능성 향상하기
구입처*
구입일*
부가기호*
부가기호 안내

* 온라인 또는 오프라인 서점에서 구입한 도서를 인증하면 마일리지 500점을 드립니다.

* 도서인증은 일 3권, 월 10권, 년 50권으로 제한되며 절판도서, eBook 등 일부 도서는 인증이 제한됩니다.

* 구입하지 않고, 허위로 도서 인증을 한 것으로 판단되면 웹사이트 이용이 제한될 수 있습니다.

닫기

해당 상품을 장바구니에 담았습니다.이미 장바구니에 추가된 상품입니다.
장바구니로 이동하시겠습니까?

자료실

최근 본 책0