我确实有一些 DPDK 经验,但目前我正在阅读许多有关 XDP 的博客。我正在尝试比较这两种技术并了解 DPDK 和 XDP 之间的差异。这引发了一些问题。我希望有人能帮助我解决以下问题:
预先感谢您的帮助!
我正在运行一个 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)
为什么这些页面是多余的而不是免费的?有什么办法可以释放他们吗?我想重新启动系统,因为可能有其他作业正在运行或有人在使用它。
编辑:重新启动机器,分配更多的大页面,它们是免费的。执行测试,它崩溃了,现在大页又丢失了。
没有有效答案的相关问题(至少对我来说):
当我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版(核心版).
我该如何解决这个问题?
一些软件(通常是面向性能的,例如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()) …
我有一个四端口 Intel 1G 网卡。我正在使用 DPDK 在一个物理端口上发送数据并在另一个物理端口上接收数据。
我在 DPDK 代码中看到了一些示例,但无法使其工作。如果有人知道如何做到这一点,请给我发送简单的说明,以便我可以遵循和理解。我为大页面正确设置我的电脑,加载驱动程序,并分配网络端口以使用 dpdk 驱动程序等...我可以从 DPDK 运行 helloworld,所以系统设置对我来说看起来没问题。
提前致谢。温度5556
当我使用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:无法请求内存错误。我还能尝试什么吗?
我用的是centos 7.3。当我运行 insmod igb_uio.ko 时,我在 /var/logs/message 中收到此错误:
在我对操作系统和内核做了一些补丁之后,就会发生这种情况。打补丁后,内核版本为:3.10.0.957.21.3.e17.x86_64
打补丁之前,效果很好。该补丁针对一些 TCP 严重漏洞。我更喜欢运行补丁。
我使用DPDK 17.08.1,我也尝试过18.11.2。两者都得到相同的错误。
我尝试在修补后从源代码重建。重建出现错误:(在修补之前,构建成功。):
我试图在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) 我是一个相当新手的程序员,我遇到了一个我认为我理解但不知道如何修复的问题.我正在尝试使用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) 在 DPKD 中,ETH_RSS_IPV4默认情况下不会激活 XL710 Intel NIC 的数据流。因此,当您想要在 lcore 之间分发数据包时,您必须选择 XL710 支持的其他 IPv4 数据流,即ETH_RSS_FRAG_IPV4、ETH_RSS_NONFRAG_IPV4_TCP、ETH_RSS_NONFRAG_IPV4_UDP、ETH_RSS_NONFRAG_IPV4_SCTP和ETH_RSS_NONFRAG_IPV4_OTHER。然而,当您处理分段的 IP 数据包时,您将面临一个愚蠢的问题。如果您选择使用ETH_RSS_FRAG_IPV4和ETH_RSS_NONFRAG_IPV4_TCP选项,那么连接的一些碎片数据包将落入另一个队列,因为它们没有 L4 端口号。如果排除ETH_RSS_NONFRAG_IPV4_TCP函数,则ETH_RSS_FRAG_IPV4哈希函数将不会应用于非分段数据包,这些数据包将进入队列 0。哈希函数的所有其他组合将不起作用。那么,我们应该做什么呢?