如何调试使用大页面的 DPDK 应用程序
How to debug a DPDK app that uses hugepages
我正在处理一个使用 DPDK-1.6.0r0 编写的应用程序,我想对其进行调试。我的第一个想法是使用 gdb,但我得到了这个错误:
EAL:在 hugepages-2048kB
中没有报告免费的大页面
我是这样编译环境的:
make install T=x86_64-default-linuxapp-gcc EXTRA_CFLAGS='-g -ggdb'
1
hugepages 预订:
cd /tmp
sudo mkdir -p /mnt/huge
grep -s '/mnt/huge' /proc/mounts > /dev/null
if [ $? -ne 0 ] ; then
sudo mount -t hugetlbfs nodev /mnt/huge
fi
Pages=256
echo "echo $Pages > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages" > .echo_tmp
echo "Reserving hugepages"
sudo sh .echo_tmp
rm -f .echo_tmp
然后我 运行 使用 gdb 的应用程序:
gdb appname`
...
(gdb) start appname -c 7e -n 3 --no-hpet -- -p 1`
你有解决的办法吗?
使用 --no-huge
和 -m
EAL 选项,因此您不需要大页面。
例如,在 GDB 中使用 128MB 的 "malloc" 内存:
gdb --args appname -c 7e -n 3 --no-hpet --no-huge -m 128 -- -p 1
如果您真的想使用具有特定挂载点的大页面,请使用 --huge-dir
EAL 选项:
gdb --args appname -c 7e -n 3 --no-hpet --huge-dir /mnt/huge -- -p 1
您可以使用GDB 在hugepage 中调试DPDK 应用程序,这不是问题。 hugepage只涉及一些设置(hugetlbfs映射,rte_memseg设置,使用rte_malloc)并且在运行时,它应该看起来和普通页面一样。
是的,评论是对的,你必须是root才能访问hugepage。某处说通过使非特权用户可以访问大页面挂载点,您可以启动 DPDK 应用程序。但是,这不再正确了,因为出于安全考虑,Linux 已向具有 CAP_SYS_ADMIN 权限的用户添加了 /proc/self/pagemap 访问控制。没有 pgemap,DPDK 将无法工作,因为它无法为其拉模式驱动程序 DMA 找到物理地址映射。
在下面的方法中,我假设您可以毫无问题地启动您的应用程序。如果你能够启动你的应用程序,你可以尝试下面的技巧,我总是在 GDB 中调试我的应用程序。确保你已经编译了带有 GDB 标志的 DPDK 库,无论如何你都会这样做。
int loop_hack=1
while(loop_hack);
使用上面的代码,您的应用程序将从一开始就在循环中等待。一旦您的应用程序成功启动所有参数,然后将其附加到 gdb。不是您应用程序的 PID
gdb <app_withsymbol> -p <pid>
set loop_hack=0
c
我正在处理一个使用 DPDK-1.6.0r0 编写的应用程序,我想对其进行调试。我的第一个想法是使用 gdb,但我得到了这个错误: EAL:在 hugepages-2048kB
中没有报告免费的大页面我是这样编译环境的:
make install T=x86_64-default-linuxapp-gcc EXTRA_CFLAGS='-g -ggdb'
1
hugepages 预订:
cd /tmp
sudo mkdir -p /mnt/huge
grep -s '/mnt/huge' /proc/mounts > /dev/null
if [ $? -ne 0 ] ; then
sudo mount -t hugetlbfs nodev /mnt/huge
fi
Pages=256
echo "echo $Pages > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages" > .echo_tmp
echo "Reserving hugepages"
sudo sh .echo_tmp
rm -f .echo_tmp
然后我 运行 使用 gdb 的应用程序:
gdb appname`
...
(gdb) start appname -c 7e -n 3 --no-hpet -- -p 1`
你有解决的办法吗?
使用 --no-huge
和 -m
EAL 选项,因此您不需要大页面。
例如,在 GDB 中使用 128MB 的 "malloc" 内存:
gdb --args appname -c 7e -n 3 --no-hpet --no-huge -m 128 -- -p 1
如果您真的想使用具有特定挂载点的大页面,请使用 --huge-dir
EAL 选项:
gdb --args appname -c 7e -n 3 --no-hpet --huge-dir /mnt/huge -- -p 1
您可以使用GDB 在hugepage 中调试DPDK 应用程序,这不是问题。 hugepage只涉及一些设置(hugetlbfs映射,rte_memseg设置,使用rte_malloc)并且在运行时,它应该看起来和普通页面一样。
是的,评论是对的,你必须是root才能访问hugepage。某处说通过使非特权用户可以访问大页面挂载点,您可以启动 DPDK 应用程序。但是,这不再正确了,因为出于安全考虑,Linux 已向具有 CAP_SYS_ADMIN 权限的用户添加了 /proc/self/pagemap 访问控制。没有 pgemap,DPDK 将无法工作,因为它无法为其拉模式驱动程序 DMA 找到物理地址映射。
在下面的方法中,我假设您可以毫无问题地启动您的应用程序。如果你能够启动你的应用程序,你可以尝试下面的技巧,我总是在 GDB 中调试我的应用程序。确保你已经编译了带有 GDB 标志的 DPDK 库,无论如何你都会这样做。
int loop_hack=1
while(loop_hack);
使用上面的代码,您的应用程序将从一开始就在循环中等待。一旦您的应用程序成功启动所有参数,然后将其附加到 gdb。不是您应用程序的 PID
gdb <app_withsymbol> -p <pid>
set loop_hack=0
c