Intel DPDK 패키지 배치 시험

inteldpdk(Intel® Data Plane Development Kit)  intel 이 개발 한 네트워크 패 킷 처리 퍼 가기 세트 입 니 다.홈 페이지:http://dpdk.org
1. 시스템 환경 요구
1) intel 네트워크 카드
$lspci |grep Ethernet    //네트워크 카드 보기, 네트워크 카드 2 장 설정
2) CPU 핵 수
$cat /proc/cpuinfo     //시스템 에 cpu 가 몇 개 있 는 지, 하드웨어 스 레 드 를 얼마나 지원 하 는 지, 2 개 설정 합 니 다.
3) 시스템 메모리
$cat /proc/meminfo   //시스템 메모리 지원 hugepage 기술
4) hpet 보기
$grep hpet/proc/timer_list   //hpet 지원 필요
표시 되 지 않 으 면 BIOS: Advanced - > PCH - IO Configuration - > High Precision Timer - > 를 설정 해 야 합 니 다 (필요 한 경우 비활성화 에서 활성화 로 변경)
Virtualbox 에서 가상 컴퓨터 Ubuntu 는 어떻게 BIOS 를 설정 합 니까?
5) 시스템 커 널
$uname –a   //가상 컴퓨터 Ubunut (호스트 명 c) GNU / Linux x8664
/ / 4.2.0 - 16. generic (Kernelsversion 요구 > = 2.6.34, hugepage 지원)
/ / 커 널 은 UIO, HUGETLBFS, PROC 를 지원 해 야 합 니 다.PAGE_MONITOR
6) 구성 요소 라 이브 러 리
$gcc –verison   //gcc 4.5. x 이상, 본 컴퓨터 gcc 5.2.1 을 요구 합 니 다.
$sudo apt-get installglibc++
$ldd –version  //요구 glibc > = 2.7 ,본기 계 2.2.1
glibc 설치 방법 컴 파일 (다운로드 주소:http://ftp.gnu.org/gnu/glibc/) 승급?
$sudo apt-get install libpcap-dev   //pcap 설치
libpcap 드라이버 분석 을 사용 하려 면 설정 파일 을 수정 하 십시오: $sudo gedit config / commonlinuxapp
       CONFIG_RTE_LIBRTE_PMD_PCAP = n: CONFIGRTE_LIBRTE_PMD_PCAP=y
$sudo apt-get installpython  //python 설치
$sudo apt-get installpython-dev
2. DPDK 컴 파일 설치
1) GIT 다운로드
 $sudo apt-get install git  //git 다운로드 설치
 $git clone git://dpdk.org/dpdk  //git ~ / home / c / dpdk 디 렉 터 리
환경 변수 설정: $sudo gedit / etc / profile
export  RTE_SDK=/home/c/dpdk
export  RTE_TARGET= x86_64-native-linuxapp-gcc
2) 스 크 립 트 설치:
$cd dpdk
$./tools/setup.sh   
//step1:14  x86_64-native-linuxapp-gcc
  RTE_SDK=/home/c/dpdk
  RTE_TARGET= x86_64-native-linuxapp-gcc
//step2:17Insert IGB UIO module
//step3:20Setup hugepage mappings for non-NUMA systems 64 또는 128 입력
//step4:23Bind Ethernet device to IGB UIO module
네트워크 카드 미리 닫 기: $ifconfig enp0s 8 down //enp0s 8 네트워크 카드 인터페이스 이름, 주소 00.08.0
PCI 주소 보기; $lspci   //네트워크 카드 주소 찾기
PCI 주소 입력: 00.08.0
//step5:22Display current Ethernet device settings
//step6:26Run test application($RTE_TARGET/app/test)
입력 bitmask: 0x3 
CPU 마스크 를 설정 하고 CPU 개수 에 따라 설정 합 니 다. 예 를 들 어 cpu 가 2 개 밖 에 없 으 면 16 진수 마스크 에 따라 0x3 를 선택 합 니 다.
HPET 를 사용 할 수 없 음 을 알려 줍 니 다. BIOS 설정 이 필요 합 니 다.
3) 수 동 설치:
- 컴 파일
$makeinstall T=x86_64-native-linuxapp-gcc
- 큰 페이지 메모리 설정 (NUMA 가 아 닌)
$echo 128> /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
$mkdir/mnt/huge
$mount -thugetlbfs nodev /mnt/huge
$cat/proc/meminfo | grep Huge   //큰 페이지 메모리 상태 보기
- igb 설치uio 구동
$modprobeuio
$insmodx86_64-native-linuxapp-gcc/kmod/igb_uio.ko
- 귀속 망 카드
$./tools/dpdk_nic_bind.py--status
$ ./tools/dpdk_nic_bind.py -b igb_uio 00.03.0  //네트워크 카드 1 의 PCI 주소, eth 1 인터페이스 이름 사용 가능
$./tools/dpdk_nic_bind.py-b igb_uio 00.08.0   //네트워크 카드 2 의 PCI 주소, eth 2 인터페이스 이름 사용 가능
- testpmd 테스트 프로그램 실행
$ ./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 2 -- -i
4) 실행 예시
$cdexamples/helloworld
$make
$./build/helloworld-c 0xf -n 2
매개 변수 설명: c 는 몇 개의 core 를 사용 하고 bit 비트 설정 을 사용 합 니 다. 예 를 들 어 f 코드 바 이 너 리 등 입 니 다. 1111 은 0 에서 3 까지 4 개의 core 를 모두 사용 하 는 것 과 같다.메모리 설정 채널 수 를 표시 합 니 다.
3. DPDK 예제 코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <inttypes.h>
#include <sys/types.h>
#include <sys/queue.h>
#include <netinet/in.h>
#include <setjmp.h>
#include <stdarg.h>
#include <ctype.h>
#include <errno.h>
#include <getopt.h>
#include <unistd.h>
 
#include <rte_common.h>
#include <rte_log.h>
#include <rte_memory.h>
#include <rte_memcpy.h>
#include <rte_memzone.h>
#include <rte_eal.h>
#include <rte_per_lcore.h>
#include <rte_launch.h>
#include <rte_atomic.h>
#include <rte_cycles.h>
#include <rte_prefetch.h>
#include <rte_lcore.h>
#include <rte_per_lcore.h>
#include <rte_branch_prediction.h>
#include <rte_interrupts.h>
#include <rte_pci.h>
#include <rte_random.h>
#include <rte_debug.h>
#include <rte_ether.h>
#include <rte_ethdev.h>
#include <rte_ring.h>
#include <rte_mempool.h>
#include <rte_mbuf.h>
 
#define RTE_LOGTYPE_L2FWD RTE_LOGTYPE_USER1
 
#define MBUF_SIZE (2048 + sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM)
#define NB_MBUF   8192
 
#define MAX_PKT_BURST 32
#define BURST_TX_DRAIN_US 100 /* TX drain every ~100us */
 
 /*
  * Configurable number of RX/TX ring descriptors
  */
#define RTE_TEST_RX_DESC_DEFAULT 128
#define RTE_TEST_TX_DESC_DEFAULT 512
 static uint16_t nb_rxd = RTE_TEST_RX_DESC_DEFAULT;
 static uint16_t nb_txd = RTE_TEST_TX_DESC_DEFAULT;
 
 /* ethernet addresses of ports */
 static struct ether_addr l2fwd_ports_eth_addr[RTE_MAX_ETHPORTS];
 
 /* mask of enabled ports */
 static uint32_t l2fwd_enabled_port_mask = 0;
 
 /* list of enabled ports */
 static uint32_t iweb_dst_ports[RTE_MAX_ETHPORTS];
 
 static unsigned int l2fwd_rx_queue_per_lcore = 1;
 
 struct mbuf_table {
     unsigned len;
     struct rte_mbuf *m_table[MAX_PKT_BURST];
 };
 
#define MAX_RX_QUEUE_PER_LCORE 16
#define MAX_TX_QUEUE_PER_PORT 16
 struct lcore_queue_conf {
     unsigned n_rx_port;
     unsigned rx_port_list[MAX_RX_QUEUE_PER_LCORE];
     struct mbuf_table tx_mbufs[RTE_MAX_ETHPORTS];
 
 } __rte_cache_aligned;
 struct lcore_queue_conf lcore_queue_conf[RTE_MAX_LCORE];
 
 static const struct rte_eth_conf port_conf = {
     .rxmode = {
         .split_hdr_size = 0,
         .header_split   = 0, /**< Header Split disabled */
         .hw_ip_checksum = 0, /**< IP checksum offload disabled */
         .hw_vlan_filter = 0, /**< VLAN filtering disabled */
         .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
         .hw_strip_crc   = 0, /**< CRC stripped by hardware */
     },
     .txmode = {
         .mq_mode = ETH_MQ_TX_NONE,
     },
 };
 
 struct rte_mempool * l2fwd_pktmbuf_pool = NULL;
 
 /* Per-port statistics struct */
 struct l2fwd_port_statistics {
     uint64_t tx;
     uint64_t rx;
     uint64_t dropped;
 } __rte_cache_aligned;
 struct l2fwd_port_statistics port_statistics[RTE_MAX_ETHPORTS];
 
 /* A tsc-based timer responsible for triggering statistics printout */
#define TIMER_MILLISECOND 2000000ULL /* around 1ms at 2 Ghz */
#define MAX_TIMER_PERIOD 86400 /* 1 day max */
static int64_t timer_period = 10 * TIMER_MILLISECOND * 1000; /* default period is 10 seconds */
 
 /* main processing loop */
 static void
 l2fwd_main_loop(void)
 {
     struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
     struct rte_mbuf *m;
     unsigned lcore_id;
     uint64_t prev_tsc, diff_tsc, cur_tsc, timer_tsc;
     unsigned i, j, portid, nb_rx;
     struct lcore_queue_conf *qconf;
     const uint64_t drain_tsc = (rte_get_tsc_hz() + US_PER_S - 1) / US_PER_S * BURST_TX_DRAIN_US;
 
     prev_tsc = 0;
     timer_tsc = 0;
 
     lcore_id = rte_lcore_id();
     qconf = &lcore_queue_conf[lcore_id];
 
     if (qconf->n_rx_port == 0) {
         RTE_LOG(INFO, L2FWD, "lcore %u has nothing to do
", lcore_id); return; } //RTE_LOG(INFO, L2FWD, "entering main loop on lcore %u
", lcore_id); for (i = 0; i < qconf->n_rx_port; i++) { portid = qconf->rx_port_list[i]; RTE_LOG(INFO, L2FWD, " -- lcoreid=%u portid=%u
", lcore_id, portid); } while (1) { cur_tsc = rte_rdtsc(); #if 0 /* * TX burst queue drain */ diff_tsc = cur_tsc - prev_tsc; if (unlikely(diff_tsc > drain_tsc)) { for (portid = 0; portid < RTE_MAX_ETHPORTS; portid++) { if (qconf->tx_mbufs[portid].len == 0) continue; l2fwd_send_burst(&lcore_queue_conf[lcore_id], qconf->tx_mbufs[portid].len, (uint8_t) portid); qconf->tx_mbufs[portid].len = 0; } /* if timer is enabled */ if (timer_period > 0) { /* advance the timer */ timer_tsc += diff_tsc; /* if timer has reached its timeout */ if (unlikely(timer_tsc >= (uint64_t) timer_period)) { /* do this only on master core */ if (lcore_id == rte_get_master_lcore()) { print_stats(); /* reset the timer */ timer_tsc = 0; } } } prev_tsc = cur_tsc; } #endif /* * Read packet from RX queues */ usleep(1); for (i = 0; i < qconf->n_rx_port; i++) { portid = qconf->rx_port_list[i]; nb_rx = rte_eth_rx_burst((uint8_t) portid, 0, pkts_burst, MAX_PKT_BURST); if (nb_rx <= 0) { //printf("xxxxxxxxxxxxxxxxxxxx
"); break; } port_statistics[portid].rx += nb_rx; printf("rcv packets %d
", port_statistics[portid].rx); printf("this timer packets is %d
", nb_rx); for (j = 0; j < nb_rx; j++) { m = pkts_burst[j]; rte_pktmbuf_free(m); //printf("packet %d
", j); //printf("rcv packets %d
", port_statistics[portid].rx); } } } } static int l2fwd_launch_one_lcore(__attribute__((unused)) void *dummy) { l2fwd_main_loop(); return 0; } /* Parse the argument given in the command line of the application */ static int iweb_parse_args(int argc, char **argv) { } int main(__attribute__((unused)) int argc, __attribute__((unused)) char **argv) { struct lcore_queue_conf *qconf; struct rte_eth_dev_info dev_info; int ret; uint8_t nb_ports; uint8_t nb_ports_available; uint8_t portid, last_port; unsigned lcore_id, rx_lcore_id; unsigned nb_ports_in_mask = 0; /* init EAL */ ret = rte_eal_init(argc, argv); if (ret < 0) { rte_exit(EXIT_FAILURE, "Invalid EAL arguments
"); } argc -= ret; argv += ret; /* parse application arguments (after the EAL ones) */ ret = iweb_parse_args(argc, argv); if (ret < 0) { rte_exit(EXIT_FAILURE, "Invalid L2FWD arguments
"); } /* create the mbuf pool */ l2fwd_pktmbuf_pool = rte_mempool_create("mbuf_pool", NB_MBUF, MBUF_SIZE, 32, sizeof(struct rte_pktmbuf_pool_private), rte_pktmbuf_pool_init, NULL, rte_pktmbuf_init, NULL, rte_socket_id(), 0); if (l2fwd_pktmbuf_pool == NULL) { rte_exit(EXIT_FAILURE, "Cannot init mbuf pool
"); } nb_ports = rte_eth_dev_count(); if (nb_ports != 1) { rte_exit(EXIT_FAILURE, "No Ethernet ports - bye
"); } /* reset l2fwd_dst_ports */ iweb_dst_ports[0] = 0; /* port */ rx_lcore_id = 0; qconf = NULL; qconf = &lcore_queue_conf[rx_lcore_id]; qconf->rx_port_list[0] = portid; qconf->n_rx_port = 1; printf("Initializing port %u... ", (unsigned) portid); fflush(stdout); ret = rte_eth_dev_configure(portid, 1, 1, &port_conf); if (ret < 0) { rte_exit(EXIT_FAILURE, "Cannot configure device: err=%d, port=%u
", ret, (unsigned)portid); } fflush(stdout); ret = rte_eth_rx_queue_setup(portid, 0, nb_rxd, rte_eth_dev_socket_id(portid),NULL,l2fwd_pktmbuf_pool); if (ret < 0) { rte_exit(EXIT_FAILURE, "rte_eth_rx_queue_setup:err=%d, port=%u
", ret, (unsigned)portid); } /* init one TX queue on each port */ fflush(stdout); ret = rte_eth_tx_queue_setup(portid, 0, nb_txd, rte_eth_dev_socket_id(portid), NULL); if (ret < 0) { rte_exit(EXIT_FAILURE, "rte_eth_tx_queue_setup:err=%d, port=%u
", ret, (unsigned)portid); } /* Start device */ ret = rte_eth_dev_start(portid); if (ret < 0) { rte_exit(EXIT_FAILURE, "rte_eth_dev_start:err=%d, port=%u
", ret, (unsigned)portid); } printf("done:
"); /* */ rte_eth_promiscuous_enable(portid); /* launch per-lcore init on every lcore */ rte_eal_mp_remote_launch(l2fwd_launch_one_lcore, NULL, CALL_MASTER); RTE_LCORE_FOREACH_SLAVE(lcore_id) { if (rte_eal_wait_lcore(lcore_id) < 0) { return -1; } } return 0; }

좋은 웹페이지 즐겨찾기