查看DPDK的primary是否释放出来

查这个的本质是查 DPDK 的 primary 判定机制,它就是一个文件锁:

原理:primary 名额 = 一把 flock

rte_eal_init 用 --proc-type=auto 时(sdt 就是),走 eal_proc_type_detect():

- 对 /var/run/dpdk/<file-prefix>/config 尝试 flock(LOCK_EX | LOCK_NB)
- 拿到锁 → 自己是 PRIMARY
- 拿不到(EWOULDBLOCK)→ 有 primary 活着 → 自己是 SECONDARY

所以"名额是否释放" = "那把排他锁是否没人持有"。三级检查,从快到权威:

---

L1 进程层:sdt 还在不在

pgrep -a sdt # 列出所有 argv 含 sdt 的进程
pidof sdt
ps -ef | grep -w sdt | grep -v grep

⚠️ sdt 是多进程的(代码里有 multi_process_is_master() / multi_process_is_slave(),runmode-dpdk.c:1452、suricata.c:3731)。primary 是执行 InitDpdkSuricata()
的那个(suricata.c:1127)——必须 master 和 slave 全部退出,只杀掉一个不够。

---

L2 锁层:直接看那把锁在不在

# 1. 看 DPDK 运行时目录还在不在(正常退出会被 rte_eal_cleanup 删掉)
ls -la /var/run/dpdk/
ls -la /var/run/dpdk/rte/ # 目录名就是 --file-prefix(sdt 没指定,用默认)

# 2. 看谁开着 config 文件
fuser -v /var/run/dpdk/rte/config
lsof /var/run/dpdk/rte/config

# 3. 直接试抢锁 —— 最直接的判据
flock -n /var/run/dpdk/rte/config -c 'echo LOCK_FREE' || echo LOCK_HELD

- 打印 LOCK_FREE → primary 名额空闲,你可以起 primary
- 打印 LOCK_HELD → 还有 primary 活着

⚠️ 两个坑:
- 如果 /var/run/dpdk/rte/config 不存在,flock -n 会顺手把它创建出来。所以先 ls 确认,别盲目执行。
- 目录名不一定是 rte —— sdt 没配 --file-prefix,实际值请以 ls /var/run/dpdk/ 看到的为准,不要猜。

---

L3 权威层:跑起来看 EAL 自己怎么说

前两层都可能有边角情况,这个是不会骗人的。用你的程序(或任何 DPDK 程序)加 --proc-type=auto 启动,抓这行日志:

./mycap -l 4 -n 4 --proc-type=auto --file-prefix=mycap --huge-dir=/dev/hugepages 2>&1 | grep -i "process type"

输出只有两种:

EAL: Auto-detected process type: PRIMARY ← 名额已释放,你可以接管
EAL: Auto-detected process type: SECONDARY ← sdt 还活着

注意这是全局判定(按 file-prefix),所以用 --file-prefix=mycap 测试的是"mycap 这个前缀有没有 primary",测不出 sdt 的。要测 sdt 那个实例,得用 sdt 的 file-prefix 去测:

./mycap -l 4 -n 4 --proc-type=auto --file-prefix=<sdt实际的prefix> --huge-dir=/dev/hugepages 2>&1 | grep -i "process type"

这正好说明为什么前面建议给你的程序换一个 file-prefix:换了前缀,你的实例和 sdt 的实例在 EAL 眼里是两套独立命名空间,互不影响,也就不存在"抢名额"问题。

---

一键检查脚本

#!/bin/bash
echo "== 1. sdt 进程 =="
pgrep -a sdt || echo " (无 sdt 进程)"

echo "== 2. DPDK 运行时目录 =="
ls -la /var/run/dpdk/ 2>/dev/null || echo " (无 /var/run/dpdk)"

echo "== 3. 残留的 vfio 占用 =="
sudo lsof /dev/vfio/* 2>/dev/null || echo " (vfio 无进程占用)"

echo "== 4. 网卡绑定状态 =="
/opt/vcomponents/engine/dpdk-devbind.py --status-dev net 2>/dev/null | head -20

---

两个容易漏的点

1. vfio 容器是 IOMMU group 独占的。即使主进程退了,只要还有任何进程打开着 /dev/vfio/<group>,新的 primary 建容器就会失败。所以建议 pgrep -a sdt 干净为空再动手,别只杀
master。
2. kill -9 与优雅退出的区别:stop_sec.sh:4 用的是 kill -9,不会跑 rte_eal_cleanup,所以 /var/run/dpdk/rte/ 和 /dev/hugepages/rtemap_* 会残留。残留不影响你(换个
--file-prefix 即可),但会让 L2 的检查出现"目录还在"的假象 —— 这时候以 L3 的 EAL 日志为准。

 

posted @ 2026-10-10 20:49  雪地飞行棋  阅读(12)  评论(0)    收藏  举报