f-stack 队列和进程关系

f-stack官网:http://www.f-stack.org/

f-stack详细解释:https://www.qcloud.com/community/article/841415

f-stack是支持多进程的,进程分为RTE_PROC_PRIMARY(只有一个)和RTE_PROC_SECONDARY(可以多个)

RTE_PROC_PRIMARY进程是主进程,做所有初始化的工作,RTE_PROC_SECONDARY进程会通过共享内存获取RTE_PROC_PRIMARY进程初始化好的数据。

各进程绑定独立的网卡队列和 CPU,请求通过设置网卡 RSS 散落到各进程进行处理,

队列和进程是怎么分配的呢?

最好先理解dpdk收发包原理(http://www.cnblogs.com/yhp-smarthome/p/6705638.html

config.ini里参数lcore_mask决定了启用几个进程,eg lcore_mask=1 启用一个;lcore_mask=3启用2个进程。16进制的位掩码。

init_port_start函数中调用rte_eth_dev_configure(port_id, nb_procs, nb_procs, &port_conf)设置接收和发送队列。假如nb_procs=2的话,这个动作会初始化0,1接收队列和0,1发送队列,0号进程使用0号接收和发送队列,以此类推。
f-stack启动脚本在解析config.ini(lcore_mask=3)后执行启动命令,以nginx为例
nginx ./config.ini -c 3 --proc-type=primary --num-procs=2 --proc-id=0

nginx./config.ini -c 3 --proc-type=primary --num-procs=2 --proc-id=1

f-stack库解析参数,num-procs参数解析ff_global_cfg.dpdk.nb_procs,也就是上面的nb_procs,proc-id解析为ff_global_cfg.dpdk.procs_id.lcore_conf.nb_rx_queue变量会存储进程队列个数,lcore_conf.rx_queue_list存储队列编号。

在main_loop函数里
for (i = 0; i < qconf->nb_rx_queue; ++i) {
            
            port_id = qconf->rx_queue_list[i].port_id;
            queue_id = qconf->rx_queue_list[i].queue_id;
            ctx = veth_ctx[port_id];
            
            if (enable_kni && rte_eal_process_type() == RTE_PROC_PRIMARY) {
                ff_kni_process(port_id, queue_id, pkts_burst, MAX_PKT_BURST);
            }


            process_arp_ring(port_id, queue_id, pkts_burst, ctx);
            
            nb_rx = rte_eth_rx_burst(port_id, queue_id, pkts_burst,
                MAX_PKT_BURST);
            if (nb_rx == 0)
                {
                    continue;
                }
上面代码就是进程在自己接收队列接收数据,按照上面配置,0号进程只会从0号接收队列接收数据,1号进程只会接收1号接收队列数据。发送同理。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
F-stack是一个高性能网络框架,其特点在于能够轻松实现高性能,低延迟的应用程序,而其中的多队列特性更是让它具有出色的表现。 多队列的实现方式是利用不同的队列处理不同的网络连接,从而把网络连接分流到不同的队列中,使得每一个队列都能独立地处理网络连接,从而实现了高效、高吞吐量的网络传输。对于高并发的任务来说,多队列是一个必要的方案,因为它可以充分利用CPU的多核心来执行并行处理,从而加速网络连接的处理速度,降低延迟。 F-stack的多队列功能与其他网络框架比较有几个明显的优势:首先,它利用了DPDK(Data Plane Development Kit)来实现高速数据包的处理,进而将数据包分配到不同队列中去。其次,它支持多种处理方式,包括多线程、多进程、异步I/O等多种方式,这些都能够提供更好的性能,更灵活的解决方案以及更加可靠的网络连接操作。 另外,F-stack的多队列还能够有效地解决应用程序在高并发下遇到的问题。比如,当某个队列的处理能力达到瓶颈时,还可以通过动态分配网络连接的方式,将网络连接分配到其他队列当中去,从而充分利用CPU的多核心来提高应用程序的并发能力。 总的来说,F-stack队列功能为应对高并发、低延迟的网络传输需求提供了一个非常高效的解决方案,而其采用的多种处理方式以及动态分配功能,也使得它在运行过程中十分稳定、可靠。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值