일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 파이썬
- docker
- 백엔드
- 캐시
- 카카오
- Kakao
- springboot
- 엘라스틱서치
- DPDK
- 코딩테스트
- 프로그래머스 #카카오 #IT #코딩테스트
- 리눅스
- Elasticsearch
- 스프링부트
- 스프링
- 쿠버네티스
- programmers
- 네트워크
- 도커
- 운영체제
- Python
- 자바
- 개발자
- 프로그래머스
- IT
- Linux
- 알고리즘
- Java
- Spring
- C
- Today
- Total
저고데
[Linux] DPDK가 무엇인지 알아보고 직접 설치해보자 본문
들어가며
이번시간에는 DPDK에 대해서 간단하게 알아보고, 이를 Linux 환경에서 적용해보는 시간을 가져보자.
DPDK란, Data Plane Development Kit의 약자로 intel에서 개발한 오픈소스이다.
그러면 얘를 왜 사용하는 것일까?
다양한 이유가 있겠지만 가장 큰 이유는 속도 때문이다.
기존 Linux에서는 대부분 kernel이 관여하게 되는데, User mode에서 Kernel mode로 system call을 호출하는 과정에서 추가적인 task가 일어나고 속도가 느려진다.
반면, DPDK는 그렇지 않다.
운영체제의 도움을 받지 않고 오버헤드 없이 사용자 어플리케이션이 직접 하드웨어를 독점 제어할 수 있는 자체 인터페이스를 제공한다.
한 마디로, 커널을 우회하는 것이다.(Kernel Bypass)
또한, 일반적인 커널 네트워크 드라이버는 인터럽트 기반으로 동작한다. 이는 NIC에서 새로운 패킷을 수신할 때마다 인터럽트를 발생시켜 CPU가 해당 인터럽트를 처리하도록 하는 방식으로 패킷 수신량이 많아질수록 인터럽트가 자주 발생하여 CPU 부하가 증가하고 성능이 저하될 수 있다.
반면, DPDK는 인터럽트 방식 대신 폴링(Polling) 방식을 사용한다.
이는 애플리케이션이 지속적으로 NIC의 패킷 버퍼를 확인하여 새로운 패킷이 있는지 확인하는 방식으로 이로 인해 인터럽트에 의한 성능 저하가 없고, 매우 짧은 지연 시간으로 패킷을 처리할 수 있다.
그럼, 설치 방법에 대해서 알아보자.
Linux 환경에 DPDK 설치하기
0. vm에 DPDK 설치 및 빌드
wget https://fast.dpdk.org/rel/dpdk-23.07.tar.xz
tar xvf dpdk-23.07.tar.xz
cd dpdk-23.07
당연한 말이겠지만, DPDK를 사용하기 위해서는 DPDK를 다운로드 해야한다.
wget 명령어를 이용하여 원하는 버전의 압축을 다운받고 풀어주자.
meson setup -Dexamples=all build
sudo ninja -C build install
그리고 DPDK를 빌드하기 위해서 meson과 ninja를 다운받아준다.
sudo apt install meson ninja-build
meson은 프로젝트를 빌드하는 빌드 시스템 생성 도구다.
meson의 주요 목표는 빠른 빌드 속도와 사용하기 쉬운 인터페이스를 제공하는 것으로 복잡한 빌드 시스템을 쉽게 관리할 수 있도록 해준다.
주로 meson.build 형태의 파일을 사용하여 프로젝트의 빌드 규칙을 정의하고, 이 파일을 기반으로 Ninja와 같은 빌드 백엔드에 맞는 빌드 스크립트를 생성한다.
즉, 하나의 설계도를 그리는 도구인 셈이다.
ninja는 경량 빌드 시스템으로, 빠르고 효율적인 빌드를 목표로 설계되었다.
ninja는 Make와 유사한 역할을 하지만, 더 빠르게 동작하며 복잡한 빌드 작업을 최적화된 방식으로 수행한다는 것이 특징이다.
즉, meson은 빌드 파일을 생성하고, ninja를 통해 실제 빌드 작업을 수행하는 것이다.
아래의 명령어를 통해서 build를 완료해주도록 하자.
meson build # meson을 통한 빌드 준비. 해당 코드 실행을 하면 build 폴더가 생김
cd build
ninja
1. igb-uio (intel gigabit-user input output) 설치
DPDK를 설치하였으면, 네트워크 인터페이스를 DPDK로 옮겨주는 작업이 필요하다.
이게 무슨 말이냐. 현재 사용하고 있는 네트워크 인터페이스의 경우, kernel에 의해서 관리되고 있기 때문에 이를 풀어주는 것이 필요하다.
아래의 명령어를 통해서 확인할 수가 있다.
cd dpdk-xx.xx/usertools
sudo ./dpdk-devbind.py --status
현재 필자가 가지고 있는 네 가지의 네트워크 인터페이스가 모두, Kernel driver로 연결되어 있는 것을 확인할 수가 있다.
이 중에서 'enp0s8' 네트워크 인터페이스를 DPDK로 바인딩해보도록 하겠다. (가장 위에 있는 enp0s3은 매니지 인터페이스이므로 건들지 않는 것을 추천한다.)
만약, --status 명령어를 입력했을 때, 네트워크 인터페이스가 하나만 존재한다면, 현재 사용하고 있는 virtual box와 같은 machine에서 네트워크 설정을 통해 아래와 같이 추가해주도록 하자.
행여 가상 네트워크 인터페이스를 설치하면 되지 않을까? 싶기도 하지만, 가상 네트워크 인터페이스는 인식하지 못하므로 반드시 물질적인 인터페이스를 설치하도록 하자.
다음으로 IGB UIO를 설치해야한다.
이는 DPDK에서 사용되는 유저스페이스 I/O 드라이버 중 하나로 커널 드라이버의 일부를 사용자 공간에서 실행할 수 있게 하는 UIO(User Input/Output) 프레임워크를 기반으로 작동한다.
이 드라이버는 주로 네트워크 인터페이스 카드를 DPDK 애플리케이션에서 직접 제어할 때 사용한다.
아래의 명령어를 통해 igb-uio를 다운받고 활성화시켜주자.
sudo apt-get install -y dpdk-igb-uio-dkms
sudo modprobe igb_uio # Linux 커널에 igb_uio라는 DPDK 드라이버 모듈을 로드하는 명령어
2. DPDK 바인드
enp0s8 앞에 0000:00:08.0이 보이는가?
이는 네트워크 인터페이스의 아이디로 해당 아이디를 기억해야한다.
우선, DPDK로 바인딩하기 위해서는 비활성화 작업이 필요하다.
아래의 명령어를 통해서 비활성화를 해주자. (해당 작업은 이름으로 입력해도 된다.)
sudo ip link set enp0s8 down
그리고 마지막으로 다음과 같은 명령어를 입력하면 DPDK에 해당 네트워크 인터페이스가 바인딩 된 것을 확인할 수 있다.
sudo ./dpdk-devbind.py --bind=igb_uio 0000:00:08.0
만약 원래대로 되돌리고 싶다면, 아래의 명령어를 치면 된다.
sudo ./dpdk-devbind.py --bind=e1000 0000:00:08.0
--status에서 drv=XXXX라는 것을 볼 수 있는데, 이는 해당 드라이버가 연결된 곳을 의미하므로, 현재 kernel에 연결된 드라이브가 e1000이기에 kernel 드라이브에 연결시켜줌을 의미한다.
'Linux' 카테고리의 다른 글
[Linux] apt 명령어에 대해서 알아보자 (1) | 2024.12.11 |
---|---|
[Linux] service와 systemd에 대해서 알아보자 (1) | 2024.11.06 |
[Linux] DPDK 라이브러리에서 Cuckoo Hash Table 사용하기 (0) | 2024.09.17 |
[Linux] 1. Linux 부팅 과정에 대해서 알아보자 (4) | 2024.08.28 |
[Linux] 0. Linux 왜 배워야 하는가? (2) | 2024.08.28 |