测试版本
dpdk-19.11
primary 进程主动申请内存的用例
primary 进程修改
以 l2fwd 为 primary 进程,在 dpdk 初始化完成后增加如下调用:
sleep(20);
void *ptr = rte_malloc(NULL, 209715200, RTE_CACHE_LINE_SIZE);
测试过程
primary 进程启动后延时 20s 后分配大量的内存,需要超过 100 个大页数目,secondary 进程设置 ulimit -n 为 100,在 20s 内运行。
primary 进程运行相关打印
EAL: Secondary process failed to synchronize
alloc ptr 0x400001e00000
primary 进程打印了 secondary 进程同步失败的错误,内存申请是成功的。从结果看,primary 进程
secondary 进程运行相关打印
EAL: rte_mem_virt2phy(): cannot open /proc/self/pagemap: Too many open files
secondary 进程由于 ulimit 限制,内存同步失败,不能同步 primary 进程的大页内存。
secondary 进程主动申请内存的用例
secondary 进程修改
以 dpdk-procinfo 为 secondary 进程,在 dpdk 初始化完成后增加如下调用:
sleep(20);
void *ptr = rte_malloc(NULL, 209715200, RTE_CACHE_LINE_SIZE);
printf("ptr is %p\n", ptr);
并增加 while 循环,持续 sleep 常驻。
测试过程
- 运行未修改的 l2fwd 程序
- 设置 ulimit -n 为 100,启动 dpdk-procinfo 进程
测试结果
dpdk-procinfo 进程报了 Too man open files 的错误,申请内存为空,ptr 指针的值为空。
为什么在 secondary 进程中跟 primary 进程中申请内存表现不同?
在 primary 进程中申请大页内存的主要逻辑
- rte_malloc 内部函数调用逻辑判断现有的大小能否满足,不满足则需要动态映射更多的大页扩充 heap
- try_expand_heap 子函数调用负责映射大页并扩充 heap,判断到是 primary 进程,调用 try_expand_heap_primary 函数
- try_expand_heap_primary 函数根据传入参数映射新的大页并更新内部数据结构,在映射完成后通过 unix 本地套接字发 mp_malloc_sync 消息给每个 secondary 进程同步内存并等待回复消息
- 当有 secondary 进程回复失败消息后,跳过失败,向上返回
当 primary 进程分配内存成功,secondary 进程同步失败时,内存分配仍旧成功。
在 secondary 进程中申请大页内存的主要逻辑
- rte_malloc 内部函数调用逻辑判断现有的大小能否满足,不满足则需要动态映射更多的大页扩充 heap
- try_expand_heap 子函数调用负责映射大页并扩充 heap,判断到是 primary 进程,调用 try_expand_heap_secondary 函数
- try_expand_heap_secondary 函数构造 mp_malloc_request 请求发送到 primary 进程中
- primary 进程接收到 mp_malloc_request 消息后,调用回调函数完成所有的大页内存映射后,失败则构造 mp_malloc_response 回复失败的结果,成功则构造 mp_malloc_sync 请求发送到 secondary 进程同步内存信息
- secondary 进程收到 mp_malloc_sync 消息后,更新大页,构造 mp_malloc_sync 消息与执行成功的状态发往 primary 进程
- primary 进程收到 handle_sync_response 回复消息后,查看成功状态,存在失败则执行 rollback 动作,然后构造 mp_malloc_rollback 消息发到 secondary 进程
- secondary 进程收到 mp_malloc_rollback 消息后,执行回调并回复一条 mp_malloc_rollback 消息,并附带执行的结果
- primary 进程收到 mp_malloc_rollback 消息,构造 mp_malloc_response 消息发送给 secondary 进程标示内存申请结束
当 primary 进程分配内存成功,secondary 进程同步失败时,内存分配 rollback,分配失败。