RDMA Shared Receive Queue(四)
参考知乎文章《RDMA之Shared Receive Queue》:https://zhuanlan.zhihu.com/p/279904125
SRQ
SRQ全称为Shared Receive Queue,即共享接受队列。在QP中,SQ用于下发SEND/WRITE/READ等操作,而RQ只用于下发RECV操作,对于本端来说,只有QP接收到对端发过来的Send报文和带立即数的报文(少量)才会消耗RWQE(RQ中的Post Receive WR),在实际使用中,SEND/RECV操作通常都是用于传递控制信息,WRITE和READ才是进行大量远端内存读写操作时的主角,所以自然SQ的使用率是远远高于RQ的。
所以,协议为了给接收端节省资源而设计了SRQ,不同的QP使用一个特殊的RQ,这个特殊的RQ就是SRQ。当与其关联的QP想要下发接收WQE时,都填写到这个SRQ中,然后每当硬件接收到数据后,就根据SRQ中的下一个RWQE的内容把数据存放到指定位置。
例如下图所示,左侧未非共享RQ形态,右侧为共享SRQ形态。
- 对于非共享RQ形态,当QP2接收到send报文,将从QO2的RQ中拿下一个RWQE处理,当QP3接收到send报文,将从QO3的RQ中拿下一个RWQE处理。
- 对于共享SRQ形态,当QP2接收到send报文,将从SRQ中拿下一个RWQE处理,当QP3接收到send报文,也将从SRQ中拿下一个RWQE处理。
为什用SRQ?(本小节参考知乎文章)
使用SRQ最大好处就是节省资源,先引用一下协议中关于使用SRQ的说明(协议1.4版本 10.2.9.1章节):
Without SRQ, an RC, UC or UD Consumer must post the number of receive WRs necessary to handle incoming receives on a given QP. If the Consumer cannot predict the incoming rate on a given QP, because, for example, the connection has a bursty nature, the Consumer must either: post a sufficient number of RQ WRs to handle the highest incoming rate for each connection, or, for RC, let message flow control cause the remote sender to back off until local Consumer posts more WRs.
Either approach is inefficient:
• Posting sufficient WRs on each QP to hold the possible incoming rate, wastes WQEs, and the associated Data Segments, when the Receive Queue is inactive. Furthermore, the HCA doesn’t provide a way of reclaiming these WQEs for use on other connections.
• Letting the RC message flow control cause the remote sender to back off can add unnecessary latencies, specially if the local Consumer is unaware that the RQ is starving.
A Shared Receive Queue solves this problem by allowing multiple Queue Pairs to share Receive Work Requests and, more importantly, the Data Segments associated with Receive Work Requests. When an incoming Receive Message arrives on any QP that is associated with an SRQ, the HCA uses the next available SRQ WQE to receive the incoming data. The HCA returns Work Completions through the Completion Queue that is associated with the QP that received the incoming Send operation.
简单来说,就是没有SRQ的情况下,因为RC/UC/UD的接收方不知道对端什么时候会发送过来多少数据,所以必须做好最坏的打算,做好突发性收到大量数据的准备,也就是向RQ中下发足量的接收RWQE;另外RC服务类型可以利用流控机制来反压发送方,也就是告诉对端”我这边RQ WQE不够了“,这样发送端就会暂时放缓或停止发送数据。
但是正如前文所说,第一种方法由于是为最坏情况准备的,大部分时候有大量的RQ WQE处于空闲状态未被使用,这对内存是一种极大地浪费;第二种方法虽然不用下发那么多RQ WQE了,但是流控是有代价的,即会增加通信时延。
而SRQ通过允许很多QP共享接收WQE(以及用于存放数据的内存空间)来解决了上面的问题。当任何一个QP收到Send报文后(或带立即数的操作),硬件会从SRQ中取出一个WQE,根据其内容存放接收到的数据,然后硬件通过Completion Queue来返回接收任务的完成信息给对应的上层用户,这样上层用户可以知道哪个QP接收到了数据。
来看一下使用SRQ比使用普通的RQ可以节省多少内存:
假设接受数据的节点上有N对QP,并且每个QP都可能在随机的时间收到连续的M个消息(每个消息都需要消耗一个RQ中的RWQE)。
- 如果不使用SRQ的话,用户一共需要下发N * M个RQ WQE。
- 如果使用SRQ的话,用户只需要下发K * M个RQ WQE,而K远小于N。
这个K是可以由用户根据业务来配置的,如果存在大量的并发接收的情况,那么就把K设置大一点,否则K设置成个位数就足够应付一般的情况了。
这样一共节省了(N - K) * M个RQ WQE,RQ WQE本身其实不是很大,大约在几个KB的样子,看起来好像占不了多少内存,但是,真正节省的是用于存放数据的内存空间,用下图来说明:
上图中的SRQ中有两个RQ WQE,可以看一下RQ WQE的内容,它们是由数个sge(Scatter/Gather Element)组成的,每个sge由一个内存地址,长度和秘钥组成。有了起始地址和长度,sge就可以指向一块连续的内存区域,那么多个sge就可以表示多个彼此离散的连续内存块,我们称多个sge为sgl(Scatter/Gather List)。sge在IB软件协议栈中随处可见(其实在整个Linux都很常见),可以用非常少的空间表示非常大的内存区域,IB的用户都使用sge来指定发送和接收区域的。
可以简单估算下每个sge可以指向多大的内存区域,length是一个32bit的无符号整型,可以表示4GB的空间。假设一个RQ WQE最大可以存放256个sge,那么一个RQ WQE一共就是1TB。当然实际上不可能这么大,这里只是想直观的告诉读者RQ WQE背后可能占用着多大的内存空间。
SRQC
即SRQ Context。同QPC(或RQC)一样,SRQC是用来告知硬件跟SRQ有关的属性的,包括SRQ深度、WQE大小、SRQ buf addr等信息,此外,还必须拥有另外一个字段——limit水线字段。
SRQN
即SRQ Number。同QP一样,每个节点中可能存在多个SRQ,为了标识和区分这些SRQ,每个SRQ都有一个序号,称为SRQN。需要注意,SRQN与QPN是分别管理的,实际使用时,一般通过QPN找到SRQN,再找到SRQC。
SRQ事件相关
以下是与SRQ相关的可能发生的事件的描述。对于这些事件,字段event->element.srq包含收到此异步事件的SRQ的句柄。这些事件仅会在此SRQ所属的代码上下文中生成。
IBV_EVENT_SRQ_LIMIT_REACHED
当一个SRQ被启用并且其中的RWQE数量下降到该SRQ的限制值(limit水线)以下时,将生成此事件。在生成此事件时,硬件会将该SRQ的限制值将被设置为零,以防止重复上报事件。用户收到该事件后,需要向SRQ中下发新的的RWQE,如果需要的话,再通过Modify_srq接口重新设置限制值(limit水线)。
因为SRQ是多个QP共享的,所以如果深度比较小的情况下,很有可能突然里面的WQE就用完了。所以协议设计了这种机制,来保证用户能够及时干预WQE不够的情况。当然用户可以不使用这个机制,只需要将SRQ Limit的值设为0即可。
IBV_EVENT_SRQ_ERR
当共享接收队列(SRQ)上发生错误时,会生成此事件,该错误会阻止 RDMA 设备从 SRQ 中出列 RWQE 并报告接收完成。 当 SRQ 遇到此错误时,与此 SRQ 关联的所有 QP 都将转换为 IBV_QPS_ERR 状态,并且将为它们生成IBV_EVENT_QP_FATAL 异步事件。任何已转换到错误状态的 QP 必须将其状态修改为 Reset 以进行恢复。
IBV_EVENT_QP_LAST_WQE_REACHED
当与 SRQ 相关联的 QP 由 RDMA 设备自动或由用户明确转换为 IBV_QPS_ERR 状态时,生成该事件。这可能是因为最后一个 WQE 生成了错误的完成,或者 QP 转换为 IBV_QPS_ERR 状态,并且 QP 的接收队列(SRQ)上没有更多的 WQE。 此事件实际上意味着此 QP 将不再从 SRQ 消耗 WQE。 如果 QP 发生错误且未生成此事件,则用户必须销毁与此 SRQ 关联的所有 QP 以及 SRQ 本身,以便回收与违规 QP 关联的所有 WQE。至少,处于错误状态的 QP 必须将其状态更改为 Reset 以进行恢复。
RQ与SRQ差异
PD
RQ是属于QP的,所以RQ的PD就是QP的PD,这就要求:RQ下发RWQE所使用的MR必须与QP同属一个PD,如下图。
但是SRQ只需要保证其RWQE使用的MR与SRQ同属一个PD即可,也就是说,SRQ与QP可以是不同PD,如下图所示。
CQ
虽然SRQ关联的很多QP,但每个QP消耗RWQE所产生的CQE,还是放在RQ所关联的CQ中,如下图所示。
差异汇总
汇总一下差异
RQ | SRQ | |
---|---|---|
state | RQ state 0x0: Reset 0x1: Initiate 0x2: Ready 0x3: Error | SRQ State 0000: good 0001: Error |
RWQE不足 | 无通知 | SRQ Limit event 通过设定一个水线告诉用户RWQE不足,一旦通知过,则硬件需要将水线设置为0,防止一直上报事件,当下发足够RWQE后需要使用Modify SRQVerb接口重新设置水线,此外,通过Modify SRQVerb接口也可以调整水线,但不能低于当前已下发的RWQE个数 硬件通过async event上报这个事件,软件通过 ibv_get_async_event 接口捕获事件, 事件类型为 IBV_EVENT_SRQ_LIMIT_REACHED 注意,这要求硬件给SRQ CTX中增加一个limit水线字段,用户可以通过接口查询或修改limit水线,此外,应保证修改水线后必须下发足够的RWQE才能使水线生效 |
CQ | 每个RQ关联一个CQ,产生CQE有序 | SRQ不关联CQ(XRC会关联),当QP收到send就从SRQ中取RWQE,并将CQE送到RQ关联的CQ中。不同QP之间无序,同一QP有序 |
进入错误状态 | 冲刷RWEQ,可通过RESET重置QP,进入错误状态的RQ将无法下发RWQE | 任何要使用SRQ的QP被强制进入错误状态,只能删除所有关联QP后摧毁SRQ,需要注意,SRQ进入错误状态还可以下发RWQE,但无法使用,此外,任何试图查询或修SRQ的操作都应该失败 |
QP进入错误状态 | 冲刷RWEQ,可通过RESET重置QP | 只冲刷已经从SRQ出队的RWQE,也就是QP正在使用的RWEQ,其他还在RWEQ的保持不动 |
摧毁限制 | RQ中RWQE冲刷完即可摧毁 | 所有关联的QP必须先进入错误状态,之后等QP排空即可摧毁QP,等所有QP摧毁后,才可以摧毁SRQ 与SRQ关联的QP如果需要通过modify接口重置QP,必须先让QP进入错误状态之后,才可以重置QP摧毁限制 |
PD校验 | RQ访问的MR必须与QP处于同一个PD | SRQ访问的MR必须与SRQ处于同一PD,而SRQ与QP可以处于不同PD |
number | RQ与QP共用一个qpn | 单独拥有srqn |
doorbell | UAR中存在 | 和RQ一起使用(通过某个bit区分) |
流控 | 有流控(credit) | 无流控 |
接口
ibv_create_srq
struct ibv_srq *ibv_create_srq(struct ibv_pd *pd, struct ibv_srq_init_attr *srq_init_attr)输入参数:
pd 与共享接收(SRQ)关联的保护域
srq_init_attr 创建 SRQ 所需的初始属性列表输出参数:
ibv_srq__attr 设置结构的实际值返回值:
指向创建的 SRQ 的指针或失败时的 NULL
ibv_create_srq创建一个共享接收队列(SRQ)。 读取srq_attr-> max_wr和srq_attr-> max_sge以确定所需的SRQ大小,并将其设置为返回时分配的实际值。 如果ibv_create_srq成功,那么max_wr和max_sge将至少与请求的值一样大。
struct ibv_srq定义如下:
struct ibv_srq {struct ibv_context *context; struct ibv_context from ibv_open_devicevoid *srq_context;struct ibv_pd *pd; Protection domainuint32_t handle;pthread_mutex_t mutex;pthread_cond_t cond;uint32_t events_completed;
}struct ibv_srq_init_attr
{void *srq_context;struct ibv_srq_attr attr;
};struct ibv_srq_attr
{uint32_t max_wr;uint32_t max_sge; //重点!!!!!!!!!sge个数可能大于1,特别是在spdk中uint32_t srq_limit; //常常设为0,由上层软件自己管理,比如spdk
};
ibv_modify_srq
int ibv_modify_srq (struct ibv_srq *srq, struct ibv_srq_attr *srq_attr, int srq_attr_mask)输入参数:
srq 要修改的 SRQ
srq_attr 指定要修改的 SRQ(输入) /返回所选 SRQ 属性的当前值(输出)
srq_attr_mask 用于指定要修改哪些 SRQ 属性的位掩码输出参数:
srq_attr 返回带有更新值的 struct ibv_srq_attr返回值:
成功时为 0
错误时为-1,如果调用失败,则将 errno 设置为指示失败的原因。struct ibv_srq_attr {uint32_t max_wr;uint32_t max_sge;uint32_t srq_limit;
};
ibv_modify_srq使用srq_attr中的属性值根据掩码srq_attr_mask修改SRQ srq的属性。 srq_attr是ibv_create_srq下面定义的ibv_srq_attr结构。 参数srq_attr_mask指定要修改的SRQ属性。 它是一个或多个标志的0或按位OR:
IBV_SRQ_MAX_WR //调整 SRQ 的大小
IBV_SRQ_LIMIT //设置 SRQ 限制
如果要修改的任何属性无效,则不会修改任何属性。 此外,并非所有设备都支持调整SRQ的大小。 要检查设备是否支持调整大小,请检查设备能力标志中是否设置了IBV_DEVICE_SRQ_RESIZE位。
一旦SRQ中的WR数降到SRQ限制以下,修改SRQ限制就会使SRQ产生一个 IBV_EVENT_SRQ_LIMIT_REACHED 异步事件。
ibv_destroy_srq
int ibv_destroy_srq(struct ibv_srq * srq)输入参数:
srq 要摧毁的SRQ输出参数:
没有返回值:
成功时为 0
错误时为 -1,如果调用失败,则将 errno 设置为指示失败的原因。
摧毁SRQ时,必需保证所有关联QP已经解绑。此外,摧毁QP前,需要将QP状态更改的ERROR状态,之后才能摧毁。
ibv_query_srq
int ibv_query_srq(struct ibv_srq * srq, struct ibv_srq_attr *srq_attr)输入参数:
srq 指定的 SRQ
srq_attr 指定 SRQ 的属性输出参数:
srq_attr 要查询的 SRQ 的属性, 返回 struct ibv_srq_attr返回值:
成功时为 0
错误时为-1,如果调用失败,则将 errno 设置为指示失败的原因。struct ibv_srq_attr {uint32_t max_wr;uint32_t max_sge;uint32_t srq_limit;
};
ibv_query_srq 返回指定 SRQ 的属性列表和当前值。它通过指针 srq_attr 返回属性,该指针是 ibv_create_srq 中描述的 ibv_srq_attr 结构。如果
srq_attr 中 srq_limit 的值为 0,表示当前无水线,不会生 IBV_EVENT_SRQ_LIMIT_REACHED 事件。
ibv_post_srq_recv
int ibv_post_srq_recv(struct ibv_srq * srq, struct ibv_recv_wr *recv_wr, struct ibv_recv_wr ** bad_recv_wr)输入参数:
srq SRQ的句柄,包含来自 ibv_create_qp 的结构体 ibv_qp
wr 包含接受缓冲区的第一个工作请求(wr)输出参数:
bad_recv_wr 执行出错时,指向的错误 wr返回值:
成功时为 0
错误时为 -1,如果调用失败,则将 errno 设置为指示失败的原因。
ibv_post_srq_recv 将工作请求列表发布到指定的 SRQ。它会在第一次失败时停止处理此列表中的 WR(可以在发布请求时立即检测到),并通过 bad_recv_wr
参数返回此失败的 WR。 只有在 WR 完全执行请求并从相应的完成队列(CQ)检 索到工作完成后,才能安全地重用 WR 使用的缓冲区。 如果将 WR 发布到 UD
QP,则传入消息的全局路由头(GRH)将放置在分散列表中的缓冲区的前 40 个字节中。如果传入消息中不存在 GRH,则前 40 个字节将是未定义的。这意味着
在 UD QP 的所有情况下,传入消息的实际数据将以 40 字节的偏移量开始进入分散列表中的缓冲区。
相关文章:
RDMA Shared Receive Queue(四)
参考知乎文章《RDMA之Shared Receive Queue》:https://zhuanlan.zhihu.com/p/279904125 SRQ SRQ全称为Shared Receive Queue,即共享接受队列。在QP中,SQ用于下发SEND/WRITE/READ等操作,而RQ只用于下发RECV操作,对于本…...
this关键字
作用:出现在成员方法,构造器中代表当前对象的地址,用于访问当前对象的成员变量、成员方法。this出现在 有参数构造器 中的用法 (this.成员变量 局部变量)this出现在 成员方法 中的用法 (this…...
缓存雪崩、缓存击穿、缓存穿透
缓存雪崩 当缓存中大量的键值对同时过期或者Redis宕机了,大量的请求就会直接打到数据库,这种现象就是缓存雪崩 应对策略 有四种,分别是“均匀设置过期时间”、“互斥锁”、“双key策略”、“设置逻辑过期时间,异步更新缓存” …...
Bigemap如何查看历史影像
工具 Bigemap gis office地图软件 BIGEMAP GIS Office-全能版 Bigemap APP_卫星地图APP_高清卫星地图APP 很多人都在寻找历史影像图,这块的需求是非常大,历史影像一般可以用于历史地貌的变迁分析,还原以前的生态场景,对范围面积…...
如何离线安装和使用pymysql操作mysql数据库
一、应用背景 在企业内部网络要使用python操作mysql数据库。然而,python未自带访问MySQL数据库的函数库pymysql,需要另外安装。网上有很多安装pymysql都需要互联网支持。本文主要阐述如何离线安装pymysql,并简要介绍pymysql如何进行mysql操作。 pymysq…...
Prometheus-监控Mysql进阶用法(1)(安装配置)
阿丹: 在开发和生产环境中有可能会出现慢mysql等问题,那么这里就需要我们优秀的程序员来进行监控和解决,那么如何借助云原生的监控系统来完成这个操作呢? 环境描述: 使用一台空白的阿里云服务器2核4G。 服务器基本安装…...
网络安全(黑客技术)自学内容
前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防…...
linux centos7 安装mongodb7.0.1 及 mongosh2.0.1
下载数据库并解压 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-7.0.1.tgz tar -zxf mongodb-linux-x86_64-rhel70-7.0.1.tgz #移动到/usr/local/mongo目录 mv mongodb-linux-x86_64-rhel70-7.0.1 /usr/local/mongodbmongosh 命令行下载 #下载命令行…...
c++ | makefile | 编译 | 链接库
简单记一下 看着人家总结的挺好的 点这...
n个骰子掷出m点的概率,C++实现
一.在骰子游戏中,我们会有猜点数的问题。我们该如何用算法来描述呢? 加入我们当前只有一个骰子,我们该如何算概率呢? 我们现在开始推导一下吧: 首先是一个骰子的情况,我们可以简单的知道n个骰子一共可以掷出…...
【JUC系列-08】深入理解CyclicBarrier底层原理和基本使用
JUC系列整体栏目 内容链接地址【一】深入理解JMM内存模型的底层实现原理https://zhenghuisheng.blog.csdn.net/article/details/132400429【二】深入理解CAS底层原理和基本使用https://blog.csdn.net/zhenghuishengq/article/details/132478786【三】熟练掌握Atomic原子系列基本…...
企业专线成本高?贝锐蒲公英轻松实现财务系统远程访问
在办公及信息系统领域,许多企业纷纷采用金蝶等财务管理软件来提升运营效率。以某食品制造企业为例,该企业总部位于广州,并拥有湖北仙桃工厂、广州从化工厂和湖南平江工厂三大生产基地。为提高管理效率,该企业在广州总部局域网内部…...
自学——网络安全——黑客技术
想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客!!! 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队…...
k8s部署gin-vue-admin框架、gitlab-ci、jenkins pipeline 、CICD
测试环境使用的jenkins 正式环境使用的gitlab-ci 测试环境 创建yaml文件 apiVersion: v1 kind: ConfigMap metadata:name: dtk-go-tiktok-admin-configlabels:app.kubernetes.io/name: dtk-go-tiktok-adminapp.kubernetes.io/business: infrastructureapp.kubernetes.io/run…...
【SpringBoot项目】SpringBoot+MyBatis+MySQL电脑商城
在b站听了袁老师的开发课,做了一点笔记。 01-项目环境搭建_哔哩哔哩_bilibili 基于springboot框架的电脑商城项目(一)_springboot商城项目_失重外太空.的博客-CSDN博客 项目环境搭建 1.项目分析 1.项目功能:登录、注册、热销…...
互联网医院|互联网医院系统引领医疗科技新风潮
互联网的迅速发展已经改变了人们的生活方式,而医疗领域也不例外。近年来,互联网医院应运而生,为患者和医生提供了更便捷、高效的医疗服务。本文将深入探讨互联网医院的系统特点、功能以及未来的发展方向,为您展现医疗行业的新时代…...
Mock安装及应用
1、安装 npm install mockjs 2、Mock.Random属性 该属性是一个工具类,用于生成各种随机数据。它提供的方法如下: Basic: boolean,natural,integer,float,character,string,range,date,time,datetime,now; Image: image,dataImage; Color: color; Text: p…...
一起来看看UI设计流程详解吧!通俗易懂
UI设计2023 通俗易懂的UI设计流程详解 首先,大家要明确一下范围:一般分为新产品的从0-1和已有产品上新的模块或功能的从0-1,这两个方向的环节和产出物会有比较大的区别。其实在UI设计师介入之前,我们是需要去了解一些大的方向和…...
TikTok营销成功秘籍:ROI指标的黄金法则
在当今数字营销领域,TikTok已经崭露头角,成为了品牌和营销者们争相追逐的热门平台。 然而,要在TikTok上取得成功,不仅需要创意和内容,还需要精确的ROI(投资回报率)指标来衡量和优化你的营销策略…...
17.适配器模式(Adapter)
意图:将一个类的接口转换为Client希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类在一起工作。 UML图 Target:定义Client使用的与特定领域相关的接口。 Client:与符合Target接口的对象协同工作。 Adaptee…...
leetcode做题笔记154. 寻找旋转排序数组中的最小值 II
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [4,5,6,7,0,1,4]若旋转 7 次࿰…...
什么是推挽电路?
推挽电路原理: 可以简单理解为推和拉; 此电路总共用到两个元器件,对应图中的Q1----NPN三极管,Q2----PNP三极管,两个电阻R1和R2起到限流的作用;两个三极管的中间对应信号的输出。 下面就举例说明是如何工作的…...
208.Flink(三):窗口的使用,处理函数的使用
目录 一、窗口 1.窗口的概念 2.窗口的分类 (1)按照驱动类型分 (2)按照窗口分配数据的规则分类 3.窗口api概览 (1)按键分区(Keyed)和非按键分区(Non-Keyed) *1)按键分区窗口(Keyed Windows) *2)非按键分区(Non-Keyed Windows) (2)代码中窗口API的调…...
时序预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测
时序预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN-BiLSTM鹈鹕算…...
【知识点】增量学习、在线学习、离线学习的区别
参考链接:https://www.6aiq.com/article/1613258706447?p1&m0 离线学习 常见的学习方式,一次性将所有数据参与进训练。 离线学习完成了目标函数的优化将不会在改变了离线学习需要一次提供整个训练集时间和空间成本效率低发生数据变更或模型漂移需…...
c++ 学习 之 运算符重载 之 前置++和后置++
前言 int a1;cout << (a) << endl;cout << a << endl;int b1;cout << (b) << endl; // 这个是错误的cout << b << endl;上面样例中, 前置 返回的是引用,所以a 的值变成了3 后置 返回的不是可以改变的…...
K8s Kubelet 垃圾回收机制
前言 Kubelet 垃圾回收(Garbage Collection)是一个非常有用的功能,它负责自动清理节点上的无用镜像和容器。Kubelet 每隔 1 分钟进行一次容器清理,每隔 5 分钟进行一次镜像清理(截止到 v1.15 版本,垃圾回收间隔时间还都是在源码中固化的,不可自定义配置)。如果节点上已…...
docker安装高斯数据库openGauss数据库
1.创建容器 #创建数据没有挂在的容器 docker run --name opengauss --privilegedtrue -d -e GS_PASSWORDEnmo123 -p 8090:5432 enmotech/opengauss:latest 2. 进入容器,并切换omm用户,使用gsql连接高斯数据库 [rootansible ~]# docker ps -a CONTAIN…...
新手学习:ArcGIS 提取SHP 路网数据、节点
新手学习:ArcGIS 提取SHP 路网数据、节点 参考连接 OSM路网提取道路节点 ArcGIS:如何创建地理数据库、创建要素类数据集、导入要素类、表? 1. 导入开源路网SHP文件 2. 在交点处打断路网数据 未打断路网数据 有一些路径很长,…...
性能测试 —— Tomcat监控与调优:Jconsole监控
JConsole的图形用户界面是一个符合Java管理扩展(JMX)规范的监测工具,JConsole使用Java虚拟机(Java VM),提供在Java平台上运行的应用程序的性能和资源消耗的信息。在Java平台,标准版(Java SE平台)6,JConsole的已经更新到目前的外观…...
贵阳设计网站建设/北京seo排名外包
方法一、 微服务项目的开发过程中,工程会非常多,经常要启动很多个服务,才能完成一项测试。启动的多了,容易开发者带来错乱的感觉,很不方便管理。在idea作为开发工具时,推荐一个很好用的功能--Run Dashboar…...
建站网站免费/站长之家ip地址查询
现在有一SpringBoot项目,该项目制作成的jar包名为: springboot-learning-0.0.1-SNAPSHOT.jar.jar . 将该jar包部署到Linux平台的 /app/dev/springboo-learning 目录下。 其启动 start.sh 脚本命令如下: #!/bin/sh rm -f tpid nohup java -Xms…...
南京当的网站/中国制造网网站类型
计划2015年每天写一篇文章 由于文章编辑器的效率实在太低,所以选择演示文稿导出成图片 部分内容直接使用我在曾经北京航空航天大学开设的《移动终端用户交互工程》的演示文稿,同样效率原因因而直接贴图片 提问请移步 http:/…...
网络建设设计方案/免费seo课程
我在我的PHP脚本(PHP 5.6,Apache 2.2)中间歇性地遇到了这个问题:Warning: Cannot modify header information – headers already sent in /path/to/index.PHP on line 55这个警告没有我在其他问题中看过的“发送者”部分,所以我在违规的header()和setcookie()调用之…...
网站提交至google/谷歌自然排名优化
这里介绍的就是 MSF 的一些简单的基本使用,创始人 HD 摩尔曾说谁为 MS 写教程其实就是自作自受,纯属找虐,因为真的变化太快了,所以这里所写使一些基本功能,其余的需要自己去摸索… !!! 但虽然这样,还是有人…...
网站统计代码添加/专业seo培训学校
[oracle] to_date() 与 to_char() 日期和字符串转换 to_date("要转换的字符串","转换的格式") 两个参数的格式必须匹配,否则会报错。 即按照第二个参数的格式解释第一个参数。 to_char(日期,"转换格式" ) 即把给定的日期按照“转换…...