标签: dpdk

测试 XDP 与 DPDK

我确实有一些 DPDK 经验,但目前我正在阅读许多有关 XDP 的博客。我正在尝试比较这两种技术并了解 DPDK 和 XDP 之间的差异。这引发了一些问题。我希望有人能帮助我解决以下问题:

  1. 通过 DPDK,我可以将工作线程映射到 CPU 内核,并隔离 DPDK 将使用的 CPU 内核。如果是 eBPF / XDP,则使用哪些 CPU 内核?是否使用了所有可用的 CPU 内核?是否可以隔离用于 eBPF / XDP 程序的 CPU 内核?
  2. 当我测试 DPDK 应用程序的吞吐量时,我可以检查环形缓冲区(内存池)是否已满,从而导致数据包丢失。但如何检查 eBPF/XDP 程序是否因吞吐量过高而导致丢包?我假设当 eBPF / XDP 程序花费太多时间来处理数据包时,最终您会看到数据包丢失?(特别是在高速率发送64B数据包时查找可以发送的最大数据包数量)

预先感谢您的帮助!

cpu dpdk ebpf xdp-bpf

10
推荐指数
1
解决办法
7043
查看次数

大页存在,但不是免费的也不是保留的。或者,如何释放大页面?

我正在运行一个 SPDK 实验(它使用 DPDK,而 DPDK 又使用大页面)并且它昨天运行正常。我在共享环境中运行它们(我认为还有一两个人使用这台机器来做其他事情)。现在,每当我尝试运行它时,我都会收到“无免费大页面”错误。

/proc/meminfo 的输出是:

HugePages_Total:    1024
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Run Code Online (Sandbox Code Playgroud)

挂载输出:

cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb,release_agent=/run/cgmanager/agents/cgm-release-agent.hugetlb)
Run Code Online (Sandbox Code Playgroud)

在我上一个环境中有效的东西不再有效:

umount -a -t hugetlbfs
mount -t hugetlbfs nodev /mnt/huge
Run Code Online (Sandbox Code Playgroud)

那么 /proc/meminfo 的输出是

HugePages_Total:    1024
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:     1024
Run Code Online (Sandbox Code Playgroud)

但如果我尝试运行它:

EAL: No free hugepages reported in hugepages-1048576kB
EAL: No free hugepages reported in hugepages-2048kB
PANIC in rte_eal_init():
Cannot get hugepage information
Run Code Online (Sandbox Code Playgroud)

为什么这些页面是多余的而不是免费的?有什么办法可以释放他们吗?我想重新启动系统,因为可能有其他作业正在运行或有人在使用它。

编辑:重新启动机器,分配更多的大页面,它们是免费的。执行测试,它崩溃了,现在大页又丢失了。

没有有效答案的相关问题(至少对我来说):

如何从崩溃的应用程序中释放大页面

如何真正释放 Linux 中的大页面以供新进程使用?

huge-pages dpdk

6
推荐指数
1
解决办法
1万
查看次数

eal_memory.c:56:18:致命错误:numa.h:没有这样的文件或目录

当我make从DPDK 的快速启动指令执行时,我收到以下错误:

eal_memory.c:56:18: fatal error: numa.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)

即使已经安装了libnuma,错误也会出现:

>sudo yum install numactl-libs.x86_64
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * elrepo: mirrors.tuna.tsinghua.edu.cn
Package numactl-libs-2.0.9-6.el7_2.x86_64 already installed and latest version
Nothing to do
Run Code Online (Sandbox Code Playgroud)

我正在使用CenOS Linux 7.3.1611版(核心版).

我该如何解决这个问题?

dpdk centos7

6
推荐指数
2
解决办法
7985
查看次数

为了获得更好的性能,可能/不可能的语句应该放在哪里?

一些软件(通常是面向性能的,例如Linux内核、DPDK)具有用于影响分支预测的C帮助程序。

我有一个绝对简单的代码片段(假设我知道 a > b 的百分比)来表示嵌套某些逻辑时条件嵌套和应用likely/的问题:unlikely

bool foo()
{
    foo1(1);
    foo2(2);

    /* if (unlikely(a > b)) */
    /* if (a > b)*/
    {
        puts("Ohhh!!! Rare case");
        return true;
    }
    return false;
}

int main(void)
{
    /* if (unlikely(foo())) */
    /* if (foo()) */
    {
        puts("Azaza");
    }
}
Run Code Online (Sandbox Code Playgroud)

那么从理论角度来看,为了提高性能,哪两行应该取消注释呢?

显然有3种方法可以帮助编译器进行分支预测:

1. if (unlikely(a > b)) ... if (unlikely(foo()))

2. if (a > b) ... if (unlikely(foo()))

3. if (unlikely(a > b)) ... if (foo()) …

c linux-kernel compiler-optimization dpdk likely-unlikely

6
推荐指数
1
解决办法
199
查看次数

如何使用DPDK发送和接收数据

我有一个四端口 Intel 1G 网卡。我正在使用 DPDK 在一个物理端口上发送数据并在另一个物理端口上接收数据。

我在 DPDK 代码中看到了一些示例,但无法使其工作。如果有人知道如何做到这一点,请给我发送简单的说明,以便我可以遵循和理解。我为大页面正确设置我的电脑,加载驱动程序,并分配网络端口以使用 dpdk 驱动程序等...我可以从 DPDK 运行 helloworld,所以系统设置对我来说看起来没问题。

提前致谢。温度5556

dpdk

5
推荐指数
1
解决办法
8680
查看次数

centos 7.3 X710 (i40e) 网卡 DPDK 绑定错误

当我使用dpdk-devbind.py绑定X710的网络端口的一个端口时。我收到错误:

错误:0000:20.00.0 绑定失败 - 无法绑定到驱动程序 uio_pci_generic。错误:0000:20:00.0 取消绑定失败 - 无法打开 /sys/bus/pci/drivers//unbind

该命令由 root 用户运行。Linux版本是:3.10.0-693.21.1.el7.x86_64。它在 CentOS 7.3 上运行。

相同的硬件,相同的命令在 CentOS 7(Linux:3.10.0-123.el7.x86_64)中运行,绑定工作良好。

此外,采用 Intel X520 的 CentOS 7.3 与 dpdk 配合良好。

其他:在 dpdp 的 bind 命令之前,在 CentOS 7 中,ifconfig 无法查看 i40e 端口。但在 CentOS 7.3 中,它可以看到端口。

看起来像 Linux 内核问题,但是当我将内核升级到 4.16(主线)或 4.4(长期)时,我收到 ERST:无法请求内存错误。我还能尝试什么吗?

dpdk

5
推荐指数
1
解决办法
3430
查看次数

insmod:插入DPDK igb_uio.ko模块时出错

我用的是centos 7.3。当我运行 insmod igb_uio.ko 时,我在 /var/logs/message 中收到此错误:

  • igb_uio:加载树外模块会污染内核。
  • 警告:未启用 retpoline 的编译器构建的模块“igb_uio”可能会影响 Spectre v2 缓解措施
  • igb_uio:模块验证失败:签名和/或所需密钥丢失 - 污染内核。
  • igb_uio:不同意符号 __uio_register_device 的版本
  • igb_uio:未知符号 __uio_register_device(错误-22)...

在我对操作系统和内核做了一些补丁之后,就会发生这种情况。打补丁后,内核版本为:3.10.0.957.21.3.e17.x86_64

打补丁之前,效果很好。该补丁针对一些 TCP 严重漏洞。我更喜欢运行补丁。

我使用DPDK 17.08.1,我也尝试过18.11.2。两者都得到相同的错误。

我尝试在修补后从源代码重建。重建出现错误:(在修补之前,构建成功。):

  • make: *** /lib/modules/3.10.0-957.21.3.el7.x86_64/build: 没有这样的文件或目录。停止。
  • make[6]: *** [igb_uio.ko] 错误 2
  • make[5]: *** [igb_uio] 错误 2
  • make[4]: *** [linux] 错误 2
  • make[3]: *** [内核] > 错误 2
  • make[2]: *** [全部] 错误 2
  • make[1]: *** [预安装] 错误 2
  • make: *** [安装] 错误 2

dpdk

5
推荐指数
1
解决办法
9881
查看次数

构建igb_uio时DPDK编译错误

我试图在KVM下运行的CentOS 6.4 VM中测试DPDK示例应用程序,但我无法编译DPDK.

当试图跑

make install T=x86_64-default-linuxapp-gcc -n
Run Code Online (Sandbox Code Playgroud)

从DPDK-2.0.0,我得到以下输出:

[...]    
make S=lib/librte_eal/linuxapp -f /home/dpdk-1.6.0r2/lib/librte_eal/linuxapp/Makefile -C /home/dpdk-1.6.0r2/x86_64-default-linuxapp-gcc/build/lib/librte_eal/linuxapp all
[ -d /home/dpdk-1.6.0r2/x86_64-default-linuxapp-gcc/build/lib/librte_eal/linuxapp/igb_uio ] || mkdir -p /home/dpdk-1.6.0r2/x86_64-default-linuxapp-gcc/build/lib/librte_eal/linuxapp/igb_uio
echo "== Build lib/librte_eal/linuxapp/igb_uio"
make S=lib/librte_eal/linuxapp/igb_uio -f /home/dpdk-1.6.0r2/lib/librte_eal/linuxapp/igb_uio/Makefile -C /home/dpdk-1.6.0r2/x86_64-default-linuxapp-gcc/build/lib/librte_eal/linuxapp/igb_uio all
if [ ! -f igb_uio.c ]; then ln -nfs /home/dpdk-1.6.0r2/lib/librte_eal/linuxapp/igb_uio/igb_uio.c . ; fi
if [ ! -f Makefile ]; then ln -nfs /home/dpdk-1.6.0r2/lib/librte_eal/linuxapp/igb_uio/Makefile . ; fi
make -C /lib/modules/2.6.32-358.el6.x86_64/build M=/home/dpdk-1.6.0r2/x86_64-default-linuxapp-gcc/build/lib/librte_eal/linuxapp/igb_uio O=/lib/modules/2.6.32-358.el6.x86_64/build \
CROSS_COMPILE=
make: *** /lib/modules/2.6.32-358.el6.x86_64/build: No such file or directory.  Stop.
make[7]: *** …
Run Code Online (Sandbox Code Playgroud)

makefile centos6 dpdk

4
推荐指数
1
解决办法
4263
查看次数

从Rust FFI访问DPDK中的静态C函数

我是一个相当新手的程序员,我遇到了一个我认为我理解但不知道如何修复的问题.我正在尝试使用Rust FFI与英特尔的DPDK进行交互,这完全在C中.我的第一次尝试是重新创建helloworld示例应用程序.

我正在达到一个编译错误,我认为这是由于DPDK的函数是静态的而不能直接从库中获得.我的FFI界面在这里:

use libc::{c_uint, c_int, c_void, c_char};

pub type LcoreFunctionT =
    extern "C" fn(arg1: *mut c_void) -> c_int;

extern {
    pub fn rte_eal_init(argc: c_int,
                        argv: *mut *mut c_char) -> c_int;
    pub fn rte_eal_remote_launch(f: *mut LcoreFunctionT,
                                    arg: *mut c_void,
                                    slave_id: c_uint) -> c_int;
    pub fn rte_eal_mp_wait_lcore() -> ();
    pub fn rte_lcore_id() -> c_uint;
    pub fn rte_get_next_lcore(i: c_uint,
                                skip_master: c_int,
                                wrap: c_int) -> c_uint;
}
Run Code Online (Sandbox Code Playgroud)

我还有一个引用它的库并包装函数:

extern crate libc;

use libc::{c_uint, c_int, c_char, c_void};
use std::ffi::CString;
use std::ptr;

mod …
Run Code Online (Sandbox Code Playgroud)

c ffi rust dpdk

4
推荐指数
1
解决办法
366
查看次数

如何在XL710中设置RSS哈希功能来接收IPv4流类型?

在 DPKD 中,ETH_RSS_IPV4默认情况下不会激活 XL710 Intel NIC 的数据流。因此,当您想要在 lcore 之间分发数据包时,您必须选择 XL710 支持的其他 IPv4 数据流,即ETH_RSS_FRAG_IPV4ETH_RSS_NONFRAG_IPV4_TCPETH_RSS_NONFRAG_IPV4_UDPETH_RSS_NONFRAG_IPV4_SCTPETH_RSS_NONFRAG_IPV4_OTHER。然而,当您处理分段的 IP 数据包时,您将面临一个愚蠢的问题。如果您选择使用ETH_RSS_FRAG_IPV4ETH_RSS_NONFRAG_IPV4_TCP选项,那么连接的一些碎片数据包将落入另一个队列,因为它们没有 L4 端口号。如果排除ETH_RSS_NONFRAG_IPV4_TCP函数,则ETH_RSS_FRAG_IPV4哈希函数将不会应用于非分段数据包,这些数据包将进入队列 0。哈希函数的所有其他组合将不起作用。那么,我们应该做什么呢?

nic dpdk

4
推荐指数
1
解决办法
5260
查看次数