DPDK QOS 5 -- Enqueue && Dequeue详细流程分析

【Intel DPDK】Qos_Sched实例在虚拟机中运行注意事项。 qos实例运行命令:./build/qos_sched -c 0x7 -n 4 -- --mst 0 --pfc 0,1,1,2 --pfc 1,0,1,2 --msz 1024 --cfg ./profile.cfg 1、大页内存不足,从头文件中可以看到这2个宏定义,NB_MBUF   (2*1024*1024)  #define MBUF_SIZE (1528 + sizeof(stru 阅读详情

入队流程

我们先看看,官网上是怎么说的:

Enqueue Pipeline

The sequence of steps per packet:

Access the mbuf to read the data fields required to identify the destination queue for the packet. These fields are: port, subport, traffic class and queue within traffic class, and are typically set by the classification stage.

Access the queue structure to identify the write location in the queue array. If the queue is full, then the packet is discarded.

Access the queue array location to store the packet (i.e. write the mbuf pointer).

It should be noted the strong data dependency between these steps, as steps 2 and 3 cannot start before the result from steps 1 and 2 becomes available, which prevents the processor out of order execution engine to provide any significant performance optimizations.

Given the high rate of input packets and the large amount of queues, it is expected that the data structures accessed to enqueue the current packet are not present in the L1 or L2 data cache of the current core, thus the above 3 memory accesses would result (on average) in L1 and L2 data cache misses. A number of 3 L1/L2 cache misses per packet is not acceptable for performance reasons.

The workaround is to prefetch the required data structures in advance. The prefetch operation has an execution latency during which the processor should not attempt to access the data structure currently under prefetch, so the processor should execute other work. The only other work available is to execute different stages of the enqueue sequence of operations on other input packets, thus resulting in a pipelined implementation for the enqueue operation.

Fig. 41.6 illustrates a pipelined implementation for the enqueue operation with 4 pipeline stages and each stage executing 2 different input packets. No input packet can be part of more than one pipeline stage at a given time.

 

Fig. 41.6 Prefetch Pipeline for the Hierarchical Scheduler Enqueue Operation

The congestion management scheme implemented by the enqueue pipeline described above is very basic: packets are enqueued until a specific queue becomes full, then all the packets destined to the same queue are dropped until packets are consumed (by the dequeue operation). This can be improved by enabling RED/WRED as part of the enqueue pipeline which looks at the queue occupancy and packet priority in order to yield the enqueue/drop decision for a specific packet (as opposed to enqueuing all packets / dropping all packets indiscriminately).

根据上面了解大概的流程,我们来梳理整个入队的过程:

VPP 的work线程把报文入对应接口的Ring队列的时候,需要根据一定的规则分类数据包(FILTER、FLOW、规则),并设置报文需要入队的subport\pipe\tc\queue参数(如何根据分类确定这4个参数,也就是不同的CLASS),并存放在报文描述符的sched字段里面。

然后HQOS线程从Ring队列出队报文,开始真正的QOS入队流程,函数是rte_sched_port_enqueue。

DPDK的QOS入队流程实现了4级流水线,每次流水线同时处理2个报文,除去stage 0获取报文,每次流水线可以处理6个报文,如果入队的报文数不够6个,会走到小于6个报文的处理流程,我们先梳理清楚这个逻辑,在来看后面的流水线实现。

1、预取所有报文的rte_mbuf到L1 Cache。

2、然后每个报文调用rte_sched_port_enqueue_qptrs_prefetch0,完成根据报文携带的sched字段完成subport、pipe、tc、queue值的解析,然后根据这四个值,根据前面的数据结构的关系计算出具体struct rte_sched_queue *queue的qindex,就是前面图里面的q0对应的下标,然后得到具体要入队的queue,同时预取queue。

3、然后每个报文调用rte_sched_port_qbase,根据队列的qindx定位真正入队的基地址

port->queue_array + (qindex >> 4)* port->qsize_sum + port->qsize_add[qindex & 0xF]) 获取存放rte_mbuf指针的指定队列基地址qbase。

获取了qbase后调用rte_sched_port_enqueue_qwa_prefetch0 获取队列大小以及指定的队列写入的位置,然后预取要写入的位置以及qindx对应的位图的位置。

    qsize = rte_sched_port_qsize(port, qindex);

    q_qw = qbase + (q->qw & (qsize - 1));

4、走完前面的3步终于报文要入真正的队列了,调用函数rte_sched_port_enqueue_qwa完成真正的入队,期间可能被Tail Drop或者被WRED丢弃,如果没有被丢弃,就会真正的入队,并且置位qindex对应的位图,好让dequeue出队报文。

            /* Enqueue packet */

        qbase[q->qw & (qsize - 1)] = pkt;

        q->qw++;

        /* Activate queue in the port bitmap */

        rte_bitmap_set(port->bmp, qindex);

 

流水线

如果报文>=6个,就会走到我们4级流水线的流程里面,让我们继续来看

准备工作

为了让4级流水线跑起来,我们需要做准备工作如:

运行流水线

当准备工作完成后,我们开始了真正的流水线处理,整体流程如下,需要和前面的准备工作结合一起看:

收尾工作

如果报文刚好6个或者不是2的倍数,我们需要做收尾的工作如下:

 

 

出队流程

我们先看看,官网上是怎么说的出队流程:

Dequeue State Machine

The sequence of steps to schedule the next packet from the current pipe is:

Identify the next active pipe using the bitmap scan operation, prefetch pipe.

Read pipe data structure. Update the credits for the current pipe and its subport. Identify the first active traffic class within the current pipe, select the next queue using WRR, prefetch queue pointers for all the 16 queues of the current pipe.

Read next element from the current WRR queue and prefetch its packet descriptor.

Read the packet length from the packet descriptor (mbuf structure). Based on the packet length and the available credits (of current pipe, pipe traffic class, subport and subport traffic class), take the go/no go scheduling decision for the current packet.

To avoid the cache misses, the above data structures (pipe, queue, queue array, mbufs) are prefetched in advance of being accessed. The strategy of hiding the latency of the prefetch operations is to switch from the current pipe (in grinder A) to another pipe (in grinder B) immediately after a prefetch is issued for the current pipe. This gives enough time to the prefetch operation to complete before the execution switches back to this pipe (in grinder A).

The dequeue pipe state machine exploits the data presence into the processor cache, therefore it tries to send as many packets from the same pipe TC and pipe as possible (up to the available packets and credits) before moving to the next active TC from the same pipe (if any) or to another active pipe.

Fig. 41.7 Pipe Prefetch State Machine for the Hierarchical Scheduler Dequeue Operation

QOS调度就是根据HQOS每个层的调度算法选择一个此时优先级最高的报文来发送。

DPDK在PIPE层是采用轮询的方法调度,也就是WRR 1:1的来调度,也就是说,每个PIPE之间是平等的,没有先后之分,谁准备好了数据谁就发送;

对于同一PIPE中的4个TC,采用SP的调度,对于同一TC下的4个队列,采用的是WRR(比例可配置)的方法。
为了加速内存数据的读取,充分利用cache,DPDK分4个阶段来读取 QOS 队列中的报文,也就是上面说的状态机,流水线,从队列中调度出一个报文用于发送。

出队函数

grinder

为了了解状态机的运行,我们先来认识下grinder。

数据结构如下:

出队状态机的4个阶段中

e_GRINDER_PREFETCH_PIPE,

e_GRINDER_PREFETCH_TC_QUEUE_ARRAYS,

e_GRINDER_PREFETCH_MBUF,

e_GRINDER_READ_MBUF,

前面的一个阶段是为了后面的一个阶段读取数据做内存预取准备工作, 每个阶段都需要等待前一阶段内存准备好后才能执行,由于latency of the prefetch,每个阶段之间就有一个时间空闲,如果CPU连续地执行上面 4 个阶段,则预取内存的效果没有得到体现。为了有效利用CPU,充分利用cache,在操作的时候内存已经在cache里面,dequeue设计了8个grinder,每一个 grinder执行4个阶段的步骤,轮留执行8个grinder,每个grinder只执行一个阶段,这样,可以保证每个grinder阶段执行时,本阶段所要访问的数据已经在缓存中准备好了,相当于实现了入队差不多的流水线。

还有8个grinder分阶段执行的好处还在于实现了各 PIPE之间的随机轮询,谁先准备好数据谁先发送。

图如下:

 

状态机

 PREFETCH_PIPE

这个状态是初始化的状态,主要是函数grinder_next_pipe获取下一个pipe,如果缓存的有的话直接从缓存获取,如果没有的话,scan 队列的qindex位图,一次获取64 bit,从位图中选择下一个active的PIPE(active PIPE指至少有一个队列有报文),并填充grinder里面的pipe缓存,整体流程如下:

PREFETCH_TC_QUEUE_ARRAYS

这个状态的处理比较简单,整体流程如下:

PREFETCH_MBUF

这个流程更简单了,根据前面获取的qbase和队列对应的qr获取报文,此时并同时预取MBUF到cache line,为下一个阶段做好准备。

READ_MBUF

经过前面3个状态的处理,完事具备了,就差最后出队报文,我们来看下这个状态的处理。

从报文描述符中获取报文长度,然后去过令牌桶,如果有足够的令牌,本TC可以发送报文。

如果不能发送,或者TC队列为空,那么需要重新找下一个TC来发送。

如果当前PIPE的所有TC都没有可以发送的报文,则需要重新找一个缓存的PIPE来发送。

如果当前grinder缓存的PIPE也没有可以发送的报文,重新从位图选取一个组新的PIPE cache,然后重新来一轮循环。

整体流程图如下:

 

queue的WRR实现

在QOS里面FQ或者WFQ队列的WRR算法注重于在时间上调度上的公平性,即完全按照其权值来进行调度,谁的权值大,谁优先。

而本次DPDK的WRR更多的是在空间上考虑公平性,打散整个结果,而考虑其处于的位置也许是最好的方案,让我们一起看下整个处理的过程:

初始化的时候根据传入的队列的weight[0 .. 3]的比例,根据最小公倍数计算每个队列的cost,然后保存在wrr_cost[0..3]里面,也就是权重越大的cost越小,如weight[0..3]={2:3:4:5},那么wrr_cost[0..3]={30:20:15:12}

在grinder选中新的TC调度的时候,会调用grinder_wrr_load初始化grinder的WRR参数,wrr_tokens初始化为0,wrr_mask如果有队列初始化为0xFFFF,否则初始化为0, wrr_cost初始化为前面计算的cost值

调度的时候调用grinder_wrr每次选中需要调度出队的队列,代码如下:

经过第一步操作后,如果有激活的队列wrr_tokens变成0,否则值变成0xFFFF。

第二步,选择4个队列中,wrr_tokens最小的,也就是本次需要出队的队列

第三步,所有队列的wrr_tockens减去最小的wrr_tockes_min

那么如何证明算法的正确性,我们先假设4个队列的报文长度相等

假设有3个具有不同weight的{A:a,B:b,C:c}元素供选择,cost值分别为{A:b*c,B:a*c,C:a*b}在一轮循环a+b+c中,3个元素被选中的次数为x\y\z,那么

x + y + z = a + b +c

A的tokens新增 x*b*c

B的tokens新增 y*a*c

C的tokens新增 z*a*b

然后每次循环选择tokens最小的队列,所有的队列都要减去这个值,那么问题转化为,每个元素一轮递增的tokens量中有多少个其它元素的个数。

x = x*b*c / (y*a*c + z*a*b)

y = y*a*c / (x*b*c + z*a*b)

z = z*a*b / (y*a*c + z*b*c)

解方程后可知,x = a, y = b, z = c

个人觉得有点绕,何不直接使用weight,不选最小的,选择最大的即可。

目前的这个实现有下面的几个问题:

  • 如果报文长度不相等,也就实现不了按比例调度了
  • 如果报文长度相等才实现按比例调度,也就没有实现按照字节的比例调度,这个可以作为后期的一个改进,但目前在叶子节点的问题不大

PIPE的WRR调度

PIPE 本次是放在8个grinder里面调度的,谁有报文谁先发送,也可以简单理解为WRR为1:1的调度,暂不考虑PIPE之间的如WRR[1:2:3………]的调度。

基于类的保证带宽(限制带宽)实现

经过上面的分析我们知道当前DPDK的QOS所有的PIPE是按照WRR调度,谁准备好谁就发送,PIPE下面的TC是SP调度,满足不了CBWFQ里面保证带宽的需求。

要实现CBWFQ的保证带宽和限制带宽,需要修改DPDK QOS的代码,后续实现后,在分析

DPDK收发包流程分析 一、 前言 DPDK是intel工程师开发的一款用来快速处理数据包的框架,最初的目的是为了证明传统网络数据包处理性能低不是intel处理器导致的,而是传统数据的处理流程导致,后来随着dpdk的开源及其生态的快速发展,dpdk成为了高性能网络数据处理的优秀框架。本篇文章主要介绍DPDK接收与发送报文的流程,包括CPU与网卡DMA协同工作的整个交互流程、数据包在内存、CPU、网卡之间游走的过程。 阅读详情

相关推荐

QMan与BMan硬件加速器调试指南:从sysfs/debugfs接口到实战问题排查

在嵌入式高性能网络处理器中,硬件加速是提升数据平面性能的关键技术。其核心原理是通过专用协处理器(如队列管理器QMan和缓冲区管理器BMan)接管数据包的队列管理与缓冲区分配,实现零拷贝和线速转发,从而将CPU从繁重的数据移动开销中解放出来。这项技术的核心价值在于为微秒级甚至纳秒级延迟要求的场景(如5G UPF、边缘计算、NFV)提供了确定性的高性能数据通路。理解其内部状态监控机制,对于驱动开发、性能调优和问题诊断至关重要。通过sysfs和debugfs文件系统,开发者可以实时查询硬件状态,例如监控缓冲区池的

anqiu4023的博客 364

DPDK QOS1 -- Linux HQOS的框架

QOS具体的原理这里不展开,QOS包含流量分类、流量标记、流量监管、流量整形、拥塞管理、拥塞避免等技术,上面各种QOS技术在设备上处理的顺序如下: HQOS与传统的一层QOS相比,最大的区别是可以将调度队列划分为如物理级别、逻辑级别、应用或业务级别等多个调度级别,每一级别可以使用不同的特征进行流量管理,为了理解HQOS我们先了解下递归控制的概念,所谓的递归控制就是分层次地控制,而对于每个层次...

~~ LINUX ~~ 1905

深入解析NXP QorIQ DPAA架构:QMan与BMan驱动的配置、编程与调试实战

在嵌入式网络处理器领域,硬件加速架构是提升数据处理性能、实现高吞吐与低延迟的关键技术。其核心原理在于通过专用硬件模块卸载CPU的通用计算负担,将数据包管理、缓冲区分配等任务交由协处理器执行,从而释放CPU核心用于更复杂的业务逻辑。这种硬件加速技术为通信基础设施、网络设备带来了显著的性能价值,广泛应用于网关、防火墙、基站等对数据面性能要求严苛的场景。本文聚焦于NXP QorIQ系列处理器中至关重要的数据路径加速架构(DPAA),其核心硬件模块——队列管理器(QMan)和缓冲区管理器(BMan)——通过精妙的软

人生的意義在於修煉!修煉之路~ 459

HQoS简单介绍

HQoS的基本原理目前计算机网络的高速发展,使得对带宽、延迟、抖动敏感的语音、图像、重要数据越来越多地在网上 传输。为了能够对数据传输性能提供不同的承诺和保证,广泛使用了QoS(Quality of Service,服务质量)技术来保证网络传输质量。 随着用户规模的扩大,业务种类的增多,要求以太网设备不仅能够进一步细化区分业务流量,而且还能够对多个用户、多种业务、多种流量等...

weixin_34221276的博客 956

NXP DPAA1驱动配置与性能优化实战:QMan/BMan原理与嵌入式网络加速

在嵌入式网络设备开发中,处理海量数据包时,CPU中断和内存拷贝常成为性能瓶颈。硬件加速架构通过引入专用的队列管理器(QMan)和缓冲区管理器(BMan),实现了数据面的高效卸载。其核心原理在于QMan负责数据帧的智能调度,BMan则统一管理内存缓冲区,两者协同工作,能显著降低CPU负载并提升处理确定性。这项技术的核心价值在于实现接近零拷贝的数据通路,为高速率、低延迟的网络转发提供了硬件基础,广泛应用于路由器、防火墙、基站等对性能要求苛刻的场景。本文聚焦于NXP Layerscape处理器中的DPAA1架构,

chiyingliao3565的博客 413

FD.io/VPP — QoS — DPDK Hqos

目录 文章目录目录基于 DPDK QoS 套件实现的 Hqos1、CONF 配置 Hqos2、CLI 配置 Hqos 基于 DPDK QoS 套件实现的 Hqos Hqos 的处理流程如上图所示: Worker 线程从 NIC 中读取报文进行处理; 调用 DPDK 设备的发送函数时,如果配置了 Hqos,那么设置 Hqos 的相关参数,将其送入 Swq 队列(swq 队列与 Worker 线程是 1:1 的关系); Worker 线程处理结束后,Hqos 线程(根据配置决定个数)轮询从 Swq 中读取报

烟云的计算 2639

DPAA2架构下restool工具详解:从对象管理到网络转发实战

在嵌入式网络开发中,硬件加速架构通过将网络数据包处理功能模块化与硬件化,显著提升了数据平面处理性能。其核心原理是将各类功能抽象为软件对象,如网络接口、队列管理器等,由集中式管理固件统一调度。这种设计的技术价值在于屏蔽底层硬件复杂性,为开发者提供统一的配置接口,从而简化数据平面应用的开发流程。在NXP Layerscape系列处理器的DPAA2架构中,这一理念通过Management Complex(MC)固件及restool命令行工具得以实现。restool作为连接用户与硬件抽象层的配置管理终端,支持对DP

chiyingliao3565的博客 418

【合规领域】【信息科学与工程学】计算机科学与自动化——第五百篇 国产化/XC解决方案 十二篇 中兴通讯 CPU / ASIC / NP 芯片硬件适配方案01

以下方案基于中兴通讯公开资料中可确认的自研芯片脉络——2011 年第一代自研交换网套片、2015 年首款自研 NP 芯片 SSP-1(RTC Run-To-Completion 架构、微码+动态表项可编程转发)、2020 年启动第五代自研交换网芯片研发,以及 2026 年公开的珠峰(特定场景处理器)、定海(DPU)、凌云(51.2T AI 交换芯片)三条主线;

weixin_49199313的博客 39

DPDK QOS2 -- DPDK的QOS框架

VPP HQOS处理报文整体框架如下图所示: 上图的QOS就是DPDK实现的HQOS,它的层次如下,官网摘录: The scheduling hierarchy As shown below. The first level of the hierarchy is the Ethernet TX port 1/10/40 GbE, with subsequent hierarchy lev...

~~ LINUX ~~ 1959

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 02 分布式多服务器管理算法

类别子类数量算法总数主要功能领域1. 负载均衡​12个子类150+算法请求分发、会话保持、健康检查2. 资源分配​15个子类180+算法CPU/内存/存储/网络分配3. 缓存管理​10个子类120+算法内容放置、替换、预取、一致性4. 队列管理​8个子类100+算法消息队列、任务队列、优先级队列5. 路由调度​12个子类150+算法路径选择、流量工程、拥塞控制6. 服务治理​10个子类120+算法服务发现、熔断、限流、降级7. 服务质量​8个子类90+算法SLA保障、QoE优化、准入控制8. 安全管控​12

weixin_49199313的博客 766

【信息科学与工程学】【数据中心】第八十八篇 智能云计算中心(含边缘节点)IaaS/PaaS/SaaS/MaaS与芯片/指令集/软件及硬件架构等关系01

编号智能云计算中心层级联动与功能性功能/性能/能力能力与芯片/指令集/RTOS/软件架构/控制科学等关系数学表达式及参数设计(多种形式,关联拓扑与Scale)关联标准1AI IaaS(算力底座)IaaS←→算网大脑←→PaaS调度器异构算力供给(CPU/GPU/NPU/DPU);Scale across(跨域异构)芯片架构决定算力密度;指令集(AVX/SVE2/RISC-V自定义)决定算子可移植性。

weixin_49199313的博客 570

深入浅出DPDK——第八章第一节(多队列)

流分类与多队列 多队列与流分类是当今网卡通用的技术。可以使网卡更好地与多核处理器、多任务系统配合,从而达到更高效率IO处理的目的。 多队列 网卡多队列的由来 传统网卡的DMA队列有多个,网卡有基于多个DMA队列的分配机制。 网卡多队列技术应该是与处理器的多核技术密不可分的。 早期的计算机都是单核,但随着半导体技术的发展,处理器上的核数不断增加,此时单个处理器不足以满足高速网卡快速处理的需求。 因此引入了多队列技术,可以将各个队列通过绑定到不同的核上来满足高速流量的需求。 此外多队列技术也可以

qq_41976997的博客 2692

【信息科学与工程学】【产品体系】计算机科学与自动化——第一百八十九篇 操作系统内核(微内核/宏内核)函数与算法02

宏内核(Linux)更多典型内核函数/算法,从编号271开始,覆盖中断管理、热插拔、PCI、ACPI、固件、崩溃转储、kexec、休眠、watchdog、RTC、hwmon、LED、backlight、input子系统、remoteproc等更多领域。编号类型领域内核类型内核中的函数/算法/模块/模组模块的调用关系模块/函数/算法逐步推理思考的数学表达式及参数列表及参数数值设计模块的C/C++/其他代码关联知识271中断管理中断描述符宏内核 / (中断子系统核心)驱动申请中断 → → → 分配irq_

weixin_49199313的博客 110

DPDK-服务质量(QOS)框架

0x01 缘由      继续学习dpdk相关文档。QoS听了、看了好多次,但是从来没接触,趁现在学习下。      QoS(Quality of Service,服务质量)指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力, 是网络的一种安全机制, 是用来解决网络延迟和阻塞等问题的一种技术。 0x02 介绍       DPDK Quality of Service

3-Number 3815

OVDK-QoS:在 DPDK OVS 上提供流量控制

OVDK-QoS 在 DPDK OVS 上提供流量控制 Intel(R) DPDK Accelerated Open vSwitch (Intel(R) DPDK vSwitch/OVDK) 是开源 Open vSwitch 多层虚拟交换机的一个分支,可在找到。 有关该项目的更多信息,请查看英特尔(R) DPDK vSwitch/OVDK 主页 01.org。 OVDK-QoS是具有QoS能力的OVDK,提供类似于linux TC模块的流量控制功能。 OVDK-QoS 提供了一个用户配置工具,即 ovdk-tc,可以配置 TC 结构对象:Qdisc 和 Class。 OVDK-QoS 提供了一个用户配置工具,即 ovs-ofctl,它可以配置流表并使用 enqueue 对网络流量进行分类。 作用:enqueue 可以为匹配流表的数据包指定目标输出端口和队列。

第 3 天:Actor 是什么?创建你的第一个游戏对象!

本文详细介绍 Actor 在 Unreal Engine 5 中的作用,并通过 C++ 创建你的第一个游戏对象。你将学习 Actor 的生命周期(BeginPlay、Tick)、如何添加组件(Static Mesh),并让 Actor 在游戏世界中运作。同时提供 常见问题解决方案,助你快速上手 UE5 C++ 开发!🎮 跟随本教程,构建属于你的第一个游戏对象!

m0_37643873的博客 2629

DPDK对于Queue的配置

作者简介颜智润Intel软件工程师主要从事DPDK开发与虚拟化方面的工作。DPDK 通过全局变量nb_rx_qnb_tx_q标记txq和rxq的数量。该值可通过—rxq...

weixin_37097605的博客 2035

Keysight ADS新手必看:3分钟搞定TDR模拟的保姆级教程(附差分信号设置技巧)

本文为Keysight ADS新手提供TDR模拟的保姆级教程,详细介绍了从基础环境准备到差分信号设置的全流程。通过内置模板调用、待测器件连接和仿真结果解读,帮助用户快速掌握TDR模拟技术,特别包含差分信号配置技巧,提升信号完整性分析效率。

weixin_30872157的博客 196

DPDK内存基本概念

对于NUMA来说,所有内存都是不同的:某一个CPU对一些内存的访问(如不在该CPU所属NUMA NODE上的内存)将比其他内存访问花费更长的时间,这是由于它们相对于执行所述内存访问的CPU所在的物理位置不同。基于安全性和通用性的考虑,软件的应用程序访问的内存位置使用的是操作系统分配的虚拟地址。然而,TLB的大小有限,而且实际上非常小,和DPDK通常处理的数据量(有时高达几十GB)比起来,在任一给定的时刻,4KB 标准页面大小的TLB所覆盖的内存量(几MB)微不足道。DPDK中的任何内存分配也是线程安全的。.

weixin_60043341的博客 364

全网最详细Seurat v5 流程复现(拿来即用)

本文是基于seurat v5版本的教程复现,主要依据来源于官网seurat v5建议大家有时间的话可以去官网进行详细阅读学习!本节内容在之前seurat v4的教程都很多都有提到,文章所用到的数据及代码已经给各位放在这里了,有需要自取!请点击这里哦提取码:bui1。

ZxVSaccount的博客 1万+

Java 大视界 -- Java+Spark MLlib 构建智能推荐系统:协同过滤算法实战与优化(441)

Java+Spark MLlib构建智能推荐系统实战 本文详细介绍了基于Java和Spark MLlib构建协同过滤推荐系统的全流程实践方案。主要内容包括: 架构设计:采用离线批处理为主、近实时更新为辅的架构,包含数据采集层、处理层、模型层、推荐生成层、存储层和应用层六大模块,可支撑千万级用户推荐需求。 技术实现: 使用Spark MLlib的ALS算法进行协同过滤模型训练 提供数据清洗、模型训练、推荐生成等核心代码实现 采用MySQL存储推荐结果,支持批量插入和事务保障 生产级优化: 版本化模型存储规避覆

【青云交】华为云云享专家 | 阿里云开发者社区专家博主 技术圈个人影响力前 9 | 博客之星 TOP12 优快云 首位四榜(原力榜 / 作者周榜 / 领军人物 / 综合热榜)榜首,破平台纪录! 苏州地区全榜霸榜,感恩全网十多万粉丝同行! 2539

DPDK报文分类与访问控制

原创翻译,转载请注明出处。 dpdk提供了一个访问控制库,提供了基于一系列分类规则对接收到的报文进行分类的能力。ACL库用来在一系列规则上执行N元组查找,可以实现多个分类和对每个分类查找最佳匹配(最高优先级),ACL库的api提供如下基本操作: 创建一个新的访问控制(AC)环境实例(context) 添加规则到这个环境实例 为这个实例里所有的规则,创建必需的运行时结构体来指针报文...

weixin_30561425的博客 592

从零搭建自动驾驶仿真环境:我的Nuplan-devkit实战笔记(含PyCharm配置技巧)

本文详细记录了从零搭建Nuplan-devkit自动驾驶仿真环境的完整流程,包括conda环境配置、pip版本控制、PyCharm专业版集成等关键步骤。特别针对Ubuntu系统下的依赖管理、数据目录优化和性能调优提供了实用技巧,帮助开发者高效构建稳定的自动驾驶仿真开发环境。

weixin_30505225的博客 480
上一篇: QOS 原理阶段学习总结
下一篇: What Every Programmer Should Know About Memory
废言Pro
博客等级 码龄16年 1093粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值