续前节,

测试小程序

1. 想编译测试程序首先需要设置两个环境变量,为什么呢,因为测试程序的Makefile里用了。。。 rpm装了打包好的devel包,这个rpm也会自带这两个环境变量。就是说写第三方程序的时候,习惯上,约定了这两个环境变量。

[root@dpdk tools]# cat ~/env.sh
export RTE_SDK=/root/dpdk-16.07
export RTE_TARGET=x86_64-native-linuxapp-gcc
[root@dpdk tools]#

2. 文档里说:The UIO drivers and hugepages must be setup prior to running an application.

UIO包括:uio_pci_generic, uio, igb_uio, vfio_pci

vfio_pci 在host里我已经学会怎么玩了。uio不知道是啥,好想要和igb_uio放在一起用

sudo modprobe uio
sudo insmod kmod/igb_uio.ko
[root@dpdk tools]# locate igb_uio.ko
/root/dpdk-16.07/build/build/lib/librte_eal/linuxapp/igb_uio/.igb_uio.ko.cmd
/root/dpdk-16.07/build/build/lib/librte_eal/linuxapp/igb_uio/igb_uio.ko
/root/dpdk-16.07/build/kmod/igb_uio.ko
/root/dpdk-16.07/x86_64-native-linuxapp-gcc/build/lib/librte_eal/linuxapp/igb_uio/.igb_uio.ko.cmd
/root/dpdk-16.07/x86_64-native-linuxapp-gcc/build/lib/librte_eal/linuxapp/igb_uio/igb_uio.ko
/root/dpdk-16.07/x86_64-native-linuxapp-gcc/kmod/igb_uio.ko
[root@dpdk tools]#

我觉得弄一下 uio_pci_generic

首先,有一个非常好用的工具 tools/dpdk-devbind.sh . (我就是客气一下,我并没有觉得特别好用,当然也觉得难用,因为我根本就没怎么用)

(1) 现运行这个命令,看一看

[root@dpdk tools]# ./dpdk-devbind.py --status

Network devices using DPDK-compatible driver
============================================
<none> Network devices using kernel driver
===================================
::03.0 'Virtio network device' if= drv=virtio-pci unused=
::04.0 'Ethernet Connection (3) I218-V' if=ens4 drv=e1000e unused= *Active* Other network devices
=====================
<none>

(2)加载驱动 uio_pci_generic

[root@dpdk tools]# modprobe uio_pci_generic

(3) 再运行看一下,然后发现unused发生了变化,可是也没什么大不了的。

[root@dpdk tools]# ./dpdk-devbind.py --status

Network devices using DPDK-compatible driver
============================================
<none> Network devices using kernel driver
===================================
::03.0 'Virtio network device' if= drv=virtio-pci unused=uio_pci_generic
::04.0 'Ethernet Connection (3) I218-V' if=ens4 drv=e1000e unused=uio_pci_generic *Active* Other network devices
=====================
<none>

(4)把网卡从原驱动e1000e上面解绑,和vfio_pci的操作没有区别。

[root@dpdk tools]# lspci -nn -s :04.0
:04.0 Ethernet controller []: Intel Corporation Ethernet Connection () I218-V [:15a3] (rev )
[root@dpdk tools]# echo ::04.0 > /sys/bus/pci/devices/\:\:04.0/driver/unbind
[root@dpdk tools]# ./dpdk-devbind.py --status

Network devices using DPDK-compatible driver
============================================
<none> Network devices using kernel driver
===================================
::03.0 'Virtio network device' if= drv=virtio-pci unused=uio_pci_generic Other network devices
=====================
::04.0 'Ethernet Connection (3) I218-V' unused=uio_pci_generic

(5) 绑到 uio_pci_generic 上面去。

[root@dpdk tools]# echo '0000:00:04.0' > /sys/bus/pci/drivers/uio_pci_generic/bind  
[root@dpdk tools]# ./dpdk-devbind.py --status                                   

Network devices using DPDK-compatible driver
============================================
::04.0 'Ethernet Connection (3) I218-V' drv=uio_pci_generic unused= Network devices using kernel driver
===================================
::03.0 'Virtio network device' if= drv=virtio-pci unused=uio_pci_generic Other network devices
=====================
<none>

(6) 至此,绑完了就。就文档说(4)和(5)可以用一条命令搞定。并没有测试。

./tools/dpdk-devbind.py --bind=uio_pci_generic 04:00.1

大页,我早已经在虚拟机里设置好了。

3. EAL库。

 (1) 就是dpdk的程序都可以接受命令行参数。其他是可选的,只有一个-c mask是比较主要的,用掩码觉得运行程序的逻辑核。

[root@dpdk build]# ./helloworld -c  |grep hello
hello from core
[root@dpdk build]# ./helloworld -c |grep hello
hello from core
[root@dpdk build]# ./helloworld -c |grep hello
hello from core
[root@dpdk build]# ./helloworld -c |grep hello
hello from core
hello from core
[root@dpdk build]# ./helloworld -c |grep hello
hello from core
hello from core
[root@dpdk build]#

给mask参数之前,你必须知道你的cpu结构。

这么多年都是这样的。

[root@dpdk build]# cat /proc/cpuinfo 

后来觉得可视性不好,于是写了个脚本整理了一下输出结果。可是那又怎么样呢? 依然很土。

然后,对,刚刚,dpdk的文档里介绍了这个:lstopo (pkg: hwloc). 输出结果是酱紫的!

牛逼的!我还能说什么。。。 还有nographic版本:

[tong@T7 ~]$ lstopo-no-graphics
Machine (7927MB)
Package L# + L3 L# (4096KB)
L2 L# (256KB) + L1d L# (32KB) + L1i L# (32KB) + Core L#
PU L# (P#)
PU L# (P#)
L2 L# (256KB) + L1d L# (32KB) + L1i L# (32KB) + Core L#
PU L# (P#)
PU L# (P#)
HostBridge L#
PCI :
GPU L# "card1"
GPU L# "renderD129"
GPU L# "controlD65"
PCI :15a3
PCIBridge
PCI :095b
Net L# "wlan0"
PCIBridge
PCI 10de:
GPU L# "card0"
GPU L# "renderD128"
GPU L# "controlD64"
PCI :9c83
Block(Disk) L# "sda"
Block(Disk) L# "sdb"
[tong@T7 ~]$

(2) 内存参数。可以申请在hugepage中预申请内存,并决定node。

使用参数 -m ,或 --socket-mem

(3)  测试程序。test, testpmd

4. HPET (High Precision Event Timer) 高精度定时器。

  (1)查看硬件支持与BOIS状态,如下有输出,代表启用,没有任何输入代表没有启用或不支持:

[root@dpdk ~]# grep hpet /proc/timer_list
Clock Event Device: hpet
set_next_event: hpet_legacy_next_event
set_mode: hpet_legacy_set_mode
[root@dpdk ~]#

  (2)内核支持。内核参数 HPET_MMAP 可以将计数器映射近用户态进程地址空间。

  (3)dpdk支持。CONFIG_RTE_LIBEAL_USE_HPET 编译时设置编译选项,默认为n。

5. 使用非超级用户运行。

6. 电源管理。

7. Isolation Core。指定的CPU将不参加系统内核任务调度,从而可以单独被专用。

支持内核参数如下:

isolcpus=,,

8. KNI kernel Mode (Dpdk Kernel NIC Interface) 并不知道是干嘛的。

9. IOMMU。与之前的类似。

10. 40G网卡。 i40e驱动

  确保 firmware 支持。我也不知道怎么确保。。。

快速设置脚本 dpdk-setup.sh

自动化工具用于完成前边提到的大部分内容。

获取最佳网卡性能

内存:

查看通道数,频率之类的,不太懂。先这么地把。(下图例子为host主机 T450 板载4G,外插4G。均为DDR3 1600 ;我还看了我的台式机输出,台式机DDR2 800 X 4 双通道。然而并不能通过输出很显然的反馈出上述信息,所以这部分知识还是需要仔细学习的。)

[tong@T7 ~]$ sudo dmidecode -t memory |grep Locator
Locator: ChannelA-DIMM0
Bank Locator: BANK
Locator: ChannelB-DIMM0
Bank Locator: BANK
[tong@T7 ~]$ sudo dmidecode -t memory |grep Speed
Speed: MHz
Configured Clock Speed: MHz
Speed: MHz
Configured Clock Speed: MHz
[tong@T7 ~]$

网卡:

设备相关的内容。最近无业,手上都是家庭环境,没有专有设备。略。

BOIS:

硬件 passthrough 启用 vt-d。前文介绍过了。

Kernel设置:

大页 / isolation core / iommu

dpdk设置:

基于硬件编译库 / 挂载大页 / 查看cpu node 相关信息

[root@dpdk tools]# lstopo-no-graphics 

查看网卡在哪个Node上:

[root@dpdk tools]# cat /sys/bus/pci/devices/\:\:04.0/numa_node
-
[root@dpdk tools]#

很显然这个输出结果证明没有node绑定。那么这玩意应该怎么绑上去啊???愿意分享的请留言  : )

网卡绑定到用户态驱动 vfio uio 等:

略,跟前边一样。

l3fwd

就是个check list。看源文档。

至此,入门指南读完,下一节读开发指南 : )

[dpdk] 读官方文档(3)的更多相关文章

  1. [dpdk] 读官方文档(1)

    前提:已读了这本书<<深入浅出dpdk(朱清河等著)>>. 目标:读官方文档,同时跟着文档进行安装编译等工作. http://dpdk.org/doc/guides/index ...

  2. [dpdk] 读官方文档(2)

    续前节.切好继续: 一,文档里提到uio_pci_generic, igb_uio, vfio_pci三个内核模块,完全搞不懂,以及dpdk-devbind.py用来查看网卡状态,我得到了下边的输出: ...

  3. 一起来读官方文档-----SpringIOC(04)

    1.4.2.依赖性和详细配置 如上一节所述,您可以将bean属性和构造函数参数定义为对其他托管bean(协作者)的引用或内联定义的值.Spring的基于XML的配置元数据为此目的在其和元素中支持子元素 ...

  4. 一起来读官方文档-----SpringIOC(03)

    1.4.依存关系 典型的企业应用程序不坑你只包含单个对象或单个bean.即使是最简单的应用程序,也有一些对象可以协同工作,以呈现最终用户视为一致的应用程序.下一部分将说明如何从定义多个独立的Bean定 ...

  5. 【苦读官方文档】2.Android应用程序基本原理概述

    官方文档原文地址 应用程序原理 Android应用程序是通过Java编程语言来写.Android软件开发工具把你的代码和其它数据.资源文件一起编译.打包成一个APK文件,这个文档以.apk为后缀,保存 ...

  6. 官方文档粗读 - Tutorial

    参考: https://www.jianshu.com/p/0d234e14b5d3 1.Connecting 我们通过 create_engine() 来链接数据库,假设我们我们采用SQLite. ...

  7. 第0001题 : 产生随机数(顺便读random模块官方文档)

    看这个之前我准备先看一下random模块的官方文档... 在整个随机模块中,  最基础的就是random, 它产生一个 [0.0, 1.0)的浮点数. 这个模块下所有的函数实际上是绑定在一个叫做ran ...

  8. 读BeautifulSoup官方文档之与bs有关的对象和属性(1)

    自从10号又是5天没更, 是, 我再一次断更... 原因是朋友在搞python, 老问我问题, 我python也是很久没碰了, 于是为了解决他的问题, 我只能重新开始研究python, 为了快速找回感 ...

  9. 读vue-cli3 官方文档的一些学习记录

    原来一直以为vue@cli3 就是创建模板的工具,读了官方文档才知道原来这么有用,不少配置让我长见识了 Prefetch 懒加载配置 懒加载相信大家都是知道的,使用Import() 语法就可以在需要的 ...

随机推荐

  1. 【bzoj1051】 [HAOI2006]受欢迎的牛 tarjan缩点判出度算点数

    [bzoj1051] [HAOI2006]受欢迎的牛 2014年1月8日7450 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B ...

  2. MS SQL SERVER 2000 常用 Tran-SQL 语句

    一.创建数据库:create database mydb-创建数据库mydbon primary-在primary文件组中( name = mydb_data1,filename = 'd:\sql ...

  3. 【log4j2 加载配置文件】 加载配置文件的三种方法

    log4j 2读取的配置文件可以分为三类:src下的配置文件.绝对路径的配置文件.相对路径的配置文件. package com.herman.test; import java.io.File; im ...

  4. 启动mysql出现了error the server quit without updating pid file (/var/lib/mysql/localhost.localdomain.pid)

    原来是我的mysql日志太多,所以去/data/log/mysql目录(这个目录是从/etc/my.cnf中的log-error确定的)下删除了 rm -rf mysql_binary_log.*的日 ...

  5. Java Web应用调优线程池

    最简单的单线程 我们先从基础开始.无论使用哪种应用服务器或者框架(如Tomcat.Jetty等),他们都有类似的基础实现.Web服务的基础是套接字(socket),套接字负责监听端口,等待TCP连接, ...

  6. mysql之对表的操作

    1. 表的基本概念 在数据库中,表是一种非常重要的数据库对象,是组成数据库的基本对象,由若干个字段组成,主要用来储存数据记录. 表中的数据库对象包含列,索引和触发器. 列:也称属性列,在具体创建表时必 ...

  7. 什么是 IntentService

    service 默认也运行在 UI 线程,所以里面不能直接做耗时操作,要做耗时操作还得开启子线程来做. IntentService 就是一个 Service, 只不过里面给你默认开启了一个子线程来处理 ...

  8. BZOJ1444 : [Jsoi2009]有趣的游戏

    建立AC自动机,并求出转移矩阵. 再用$\sum E(终止节点)=1$去替换第一个方程,高斯消元即可. 时间复杂度$O(n^3l^3)$. 注意精度问题,要特判0.00的情况. #include< ...

  9. BZOJ 1001 & SPFA

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MB Description 现在小朋友们最喜欢的"喜羊羊与灰太狼 ...

  10. c++ insert iterators 插入型迭代器

    insert iterators 插入型迭代器 (1)front inserters 前向插入迭代器 只适用于提供有push_front()成员函数的容器,在标准程序库中这样的容器是deque和lis ...