DAOS学习笔记及思考

DAOS带来的思考

根据daos docs的描述,DAOS是Intel基于NVMe全新设计开发并开源的异步对象存储,充分利用下一代NVMe技术的优势,对外提供KV存储接口,提供非阻塞事物I/O,端到端完整性,细粒度的数据控制,数据保护以及弹性存储等特征。

intel daos给我们提供了基于NVMe实现高性能存储引擎的参考实现核心是并行性,如何发挥多核CPU及NVMe设备提供的并行能力

以大家熟悉的Ceph,BeeGFS为例,对并行不足及超额订购问题进行说明:

  1. Ceph的每个OSD管理一块SSD,为提升并发能力每个OSD内部会划分多个Shard,Shard内I/O串行执行,Shard间I/O可并发,PG通过模Shard数映射到Shard,接收到的I/O请求根据pg_id取模放入指定的Shard,由Shard内的工作线程调度执行。I/O提交到引擎后,通过单线程libaio(批)提交到设备(独立的KV线程提交元数据I/O,元数据提交后再归还工作线程)。

Ceph OSD通过Shard来控制并发,以粗粒度的PG为并发单位,限制了PG及PG内对象I/O的并发能力,导致系统的并行性不足;理论上可以尽可能的增加PG及OSD Shard的数量(及工作线程数量),以此来提升系统的并发能力,但这会带来严重的线程上下文切换开销,大量的CPU时间被浪费在内核中,导致CPU超额订购问题。

  1. BeeGFS的每个OSD管理一块SSD,采用Multi-reactor的网络模式,从线程池给每个客户端连接分配一个工作线程用于处理I/O。I/O提交到引擎后,通过POSIX接口(pread/pwrite, read/write)提交到设备,I/O完成后再归还工作线程。

BeeGFS通过从线程池分配一个工作线程来处理每个客户端连接的I/O,工作线程采用同步操作来处理I/O,因此线程会被阻塞直到I/O完成,这严重影响了系统的并行性;SSD的性能很高,需要很多的并发操作才能充分发挥其性能,因此也可以往线程池中添加足够多的工作线程,以此来提升系统的并发能力,但这会带来严重的线程上下文切换开销,大量的CPU时间被浪费在内核中,导致CPU超额订购问题。

daos是如何解决上述问题的呢?,概括起来就两点:轻量线程和非阻塞I/O。下图是我结合dao docs以及daos 代码,绘制的一张daos 并行设计图:
Daos Engine并行设计图
轻量线程:在双路x86系统上,一个DAOS节点(DAOS Server)通常包含两个存储引擎(DAOS Engine),每个引擎绑定一个Socket,管理多个NVMe SSD。为了避免超额订购,daos引擎使用了用户态轻量线程框架-argobots,不仅减少了上下文切换的开销,也实现了在没有内核干预下的完全调度控制。如上图,daos_engine引擎启动时,启动若干执行单元(XS)并绑定到独立的cpu core。每个XS内运行一个自定义的调度器(Scheduler),负责根据策略执行三个线程池(pools)中的轻量线程(协程),进而执行用户任务。从功能角色上,XS分成3类:系统XS,负责处理系统管理任务,如:swim心跳,dRPC请求,dmg请求等;主XS,负责处理客户端I/O;辅助XS,协助主XS进行计算密集型任务,如:加密,压缩,重建等。daos引擎在运行时根据类型将用户任务添加到各XS的各线程池,每类XS有若干,其中每个主XS负责一个Target的I/O处理,Target是逻辑设备,一个Target和NVMe SSD设备的一个IO Channel(QP)绑定,通过多个主XS,多个Targets和多个IO Channel(QP)的绑定,实现NMVe SSD设备的多队列并发能力。

非阻塞I/O:Linux系统提供了多种存储I/O接口,包括:posix接口,libaio,io_uring以及spdk。posix接口是linux上使用最普遍的I/O接口,通过posix接口发起文件系统I/O后,调用线程会被阻塞知道I/O完成。libaio是异步I/O接口,允许一次提交多个I/O请求,减少用户态和内核态切换的开销。io_uring是Linux中新引入的异步I/O接口,用于替代libaio,它通过mmap共享内存在用户态和内核态直接交换数据,允许一次提交多个I/O请求,支持Polling模式,减少中断带来的延迟及CPU开销。spdk是intel实现的存储性能开发套件,它实现了用户态的NVMe驱动,与其他的I/O接口不同,spdk直接在用户态分配QP,提交请求到内存的ring buffer,接着更新标志通知SSD有新的请求到来。关于几种I/O的对比,在2022 SYSTOR上发的一篇论文UnderStanding Modern Storage APIs有详细的分析,daos中使用的是spdk。

DAOS服务端启动流程

下面这张图摘自daos internals,很好的说明了daos server内部的服务分层及其(和模块)的交互关系
DAOS Server内部分层图
如上图,daos服务端包括控制平面和数据平面两个平面,daos的控制面是非中心化的全分布式设计和数据面部署在相同的节点,两者通过dRPC通信(Unix Socket),这点与其他开源的分布式存储系统不同,如:glusterfs,ceph,beegfs等。daos控制服务(daos_server)负责daos数据服务(daos_engine)的管理和资源的供给,如:网络、存储的供给,数据服务的安装、启动等。各daos_server服务承担的角色并不完全对等,(根据配置)其中有部分服务会启动raft一致性协议,负责集群拓扑、节点状态的持久化。下图是我绘制的daos_server和daos_engine启动过程中的交互时序:4节点集群,配置了3个Raft节点,各节点上的daos_server负责拉起本地的daos_engine(在常见的两路x86服务器上,每个socket上会启动一个daos_engine,图中只画了一个)
daos_server和daos_engine启动交互

  1. 执行systemctl start daos_server启动daos_server过程中,启动daos_engine
  2. daos_engine启动后,向daos_server发送ready的dRPC通知,然后等待daos_server的SetUp消息更新init_state
  3. 各daos_server向MS Leader发起JoinSys的gRPC消息,MS Leader将daos_engine加入集群(db),置位needUpdateGroup标志
  4. 各daos_server向daos_engine发起SetRank的dRPC消息,daos_engine更新Cart group中的membs和swim membs以及缓存uri
  5. 各daos_server向daos_engine发起SetUp的dRPC消息,daos_engine设置init_state状态为DSS_INIT_STATE_SET_UP【daos_engine得以继续执行,接着会完整各模块的SetUp,最后激活utl barrier信号量,启动所有的xs,这样就可以提供服务了】
  6. MS Leader在检查到needUpdateGroup标志后,向daos_engine发起GroupUpdate的dRPC消息(任意一个daos_engine发送成功即可),daos_engine更新Cart group中的membs和swim membs以及缓存uri。【MS Leader所在节点上的daos_engine学习到其他daos_engine的存在】
  7. MS Leader节点上的daos_engine启动ULT线程(如果未启动),向其他daos_engine发送MAP_UPDATE的gRPC消息,广播membs及状态信息给其他daos_engine。【各daos_engine学习到其他daos_engine的存在】
  8. 各daos_engine通过SWIM Gossip获取,更新相互间的状态(swim xs调用注册的回调,直接或间接ping swim membs中其他daos_engine),监测到dead engine就通过注册的网络事件回调向daos_server发送RAS_TYPE_STATE_CHANGE的RAS dRPC消息
  9. 收到RAS dRPC消息的daos_server向MS Leader转发RAS消息,发起ClusterEvent类型的gRPC消息,MS Leader更新engine的状态到db,置位needUpdateGroup标志【会激活过程6,正是通过上述的过程6-9,daos系统实现了engine状态的管理】

注:上述的过程1-9,隐藏了三个daos_server的raft选主。daos系统的集群信息由选出的raft leader负责更新,并通过raft 日志复制在三个节点间实现集群配置的一致性和可靠性。

执行完上面的启动过程,一套新的daos系统就准备就绪了,下文是服务启动过程中核心的代码调用过程说明,代码基于v2.4版本,比较繁琐无趣,对代码感兴趣的读者可以了解下,希望对你走读代码有帮助。

Intel DAOS异步对象存储的实现涉及硬件、操作系统及KV等方面的知识,其内部集成了很多的第三方库,在研究其代码前,建议各位读者:

  1. 认真阅读daos docs,掌握各种概念,设计原理,代码结构,安装配置方法等
  2. 了解各第三方库的工作原理,结合examples掌握其使用方法,如:raft,argobots,cart(mercury),spdk,pmdk等
  3. 认真阅读代码中各模块的README文件,如:rsvc,rdb,vos,pool,container,object,mgmt,dtx
  4. 准备一套测试环境,结合运行Log,加深对代码细节的理解

DAOS Server的核心启动过程

DAOS Server是控制面服务,通过systemctl start daos_server启动服务后,会执行/usr/bin/daos_server start命令,最终调用src/control/server/server.go中的Start方法,核心过程如下:

server.Start //环境检查及初始化,初始化server实例,初始化raft,control服务,ms服务,初始化网络,实例化Engine,实例化grpc,启动raft,注册raft回调newServer //初始化server实例createServices //初始化raft,control服务,ms服务initNetwork //初始化网络,创建grpc监听addEngines //发起BdevPrepareRequest请求准备nvme设备,实例化Engine,注册onAwaitFormat,onStorageReady,onReady等回调//实例化grpc,注册control,ms服务,启动raft//MS Leader会在raft回调中启动Loop,负责groupupdate的消息处理-将当前的Engines(Ranks)通过drpc发送给其中的一个Engine//Egnine收到消息后,更新CART group中的membs列表,启动rsvc mgmt服务,启动广播ULT线程-发送MAP_UPDATE的grpc消息,广播membs给其他Engine,收到消息的Engine会更新membs,执行通知回调crt_plugin_gdata.cpg_event_cbs,这样就和SWIM关联起来了setupGrpc server::registerEvents //注册RAS事件,注册raft回调server::start  //启动server:启动gRPC,启动dRPC,启动MS的异步Loop-处理PoolCreate、Join、PoolEvict消息,启动EngineEngineHarness::Start  //逐个启动EngineInstance,安装newOnDrpcFailureFn回调【如果是MS Leader,该回调在dRPC处理失败会触发并发起MS重新选主】EngineInstance::RunEngineInstance::startRunnerEngineInstance::format EngineInstance::awaitStorageReady //格式化(检查)SCM,回调onAwaitFormat【记录一个NoticeInfo的Log】EngineInstance::createSuperblock //挂载SCM,初始化Superblock并持久化到Superblock文件EngineInstance::onStorageReady //执行回调onStorageReady【发起BdevPrepareRequest请求清理大页,更新cfg mem_size,检查tmpfs的内存】EngineInstance::start  Runner::Start //根据配置文件和环境变量,初始化启动命令行Runner::Runner //启动Engine,在协成中安装退出channel,信号处理器等EngineInstance::waitReady //等待来自Engine的dRPC ready通知EngineInstance::finishStartup //更新Superblock,发起RPC加入系统,发起SetRank和SetUp dRPC请求,执行OnReady回调EngineInstance::handleReadyEngineInstance::updateFaultDomainInSuperblock //更新Superblock中的FaultDomain故障域信息并持久化到Superblock文件EngineInstance::determineRank //向MS Replica发起RPC Join请求-Instance加入系统,持久化到membership db,分配Rank,置位MS Leader的groupupdate标志,返回后更新Superblock并持久化到Superblock文件//对于非MS Leader节点(Leader会在上面的join请求中直接发起SetupRank的dRPC请求),向Engine发起SetRank和SetUp dRPC请求,接着设置ready标志(MS Leader根据该标志进行一次groupupdate消息处理)//收到SetRank dRPC消息,Engine会更新Cart group中的mems列表和 swim membs列表,缓存uri//收到SetUp dRPC消息,Engine会更新init state,至此,Engine服务就完全run起来了EngineInstance::SetupRank  EngineInstance::onReady  //执行回调onReady【置位allStarted标志,执行Server的onEnginesStarted回调-启动Prometheus exporter】

DAOS Engine的核心启动过程

daos server负责daos engine的管理,包括:启停,成员状态管理等,它们直接通过dRPC(Unix socket)通信。在daos server启动过程中,会根据配置文件及环境变量构建参数启动daos engine,执行的命令是:/usr/bin/daos_engine --args...,调用的是:src/engine/init.c中的main方法

main  //初始化选项,启动engine,等待退出parse //根据命令行参数初始化选项server_init //启动hlc_recovery_begin //开始HLC时钟恢复dss_topo_init //初始化CPU topology信息,这里会设置socket的core map以及engine上的目标target数,最佳的core数:2+helpers+targetsregister_dbtree_classes //注册各种btree class到全局数组btr_class_registeredabt_init //初始化argobots任务框架,daos使用argobots来进行任务调度crt_init_opt //初始化cart网络框架:初始化全局的cart结构,根据配置初始化primary和secondary provider,初始化primary和secondary的group信息,NA配置,及其他一些结构daos_hhash_init //初始化全局handle hash表pl_init //初始化全局placement hash表ds_iv_init //初始化incast variable树modules_load //加载各module,各模块保存在全局列表中,hlc_recovery_end  //停止HLC时钟恢复dss_set_start_epoch() //初始化初始化epoch:dss_start_epochbio_nvme_init //根据配置初始化nvme全局结构,初始化spdk环境//初始化各模块:调用模块的init接口初始化模块,(如果有key)添加模块到全局数组dss_module_keys,添加gRPC handler到cart的opc_map, 添加dRPC handler到全局register_table//vos:注册container,dtx,object的btree结构到全局数组btr_class_registered;添加模块到全局数组dss_module_keys//rdb:初始化rdb_hash表//rsvc:初始化rsvc_hash表,用来暂存已open的rsvc服务,如:rsvc_pool//pool:初始化pool lru cache,初始化pool handle hash表,注册pool的各incast variable类到ds_iv_class_list列表,初始化pool的默认ACL属性,注册rsvc_pool类到rsvc_classes数组,初始化nvme的reaction ops;添加模块到全局数组dss_module_keys//container:初始化container lru cache,初始化container handle hash表;添加模块到全局数组dss_module_keys//object:注册btree class到全局数组btr_class_registered,注册各副本类和EC类到全局数组oc_ident_array,注册EC类到全局数组ecc_array;添加模块到全局数组dss_module_keys//mgmt:设置id,注册rsvc_mgmt类到rsvc_classes数组//dtx:根据环境变量初始化选项,注册btree class到全局数组btr_class_registered;添加模块到全局数组dss_module_keys//securty:初始化socket路径//rebuild:初始化全局结构rebuild_gst,注册rebuild的各incast variable类到ds_iv_class_list列表;添加模块到全局数组dss_module_keysdss_module_init_all dss_srv_init //初始化全局xs结构:xstream_data,初始化全局tls,初始化系统db,启动各xs,启动dRPC监听vos_standalone_tls_init //初始化全局tls:self_mode.self_tlsdss_sys_db_init  //初始化全局系统db,打开系统pool及containerbio_register_bulk_ops //注册公共的bulk分配及释放方法//逐个启动xs:system xs + main xs + helper xs,xs是argobots中的概念,类比硬件执行单元,可以将xs看成是其软件实现,通常和硬件执行单元一对一映射,如果将xs绑定到特定的core上//system xs,包括:sys_xs负责系统任务,独占一个core,swim_xs负责保活心跳, drpc_xs负责drpc请求,swim_xs和drpc_xs共享一个core//main xs:每个target一个 main xs,target是daos里面的逻辑设备抽象,与spdk中的io_channel(nvme qp)对应,用于提高并行性;每个main xs独占一个core//helper xs:用于协助target处理加密,压缩等高CPU任务dss_xstreams_init dss_start_xs_id  //分配 cpu coredss_start_one_xstreamdss_xstream_alloc //创建xs实例dss_sched_init //创建自定义argobots sheduler,设置任务池pool来区分任务优先级(网络,nvme,通用三个池),添加到argobots框架的执行单元(ULT和tasklet)根据该scheduler定义的策略调度ABT_xstream_create_with_rank //创建xs,并设置上述的schedulerdaos_abt_thread_create //创建xs的主ULT:dss_srv_handler,添加到网络池(调度执行)ABT_cond_wait //等待信号量,直到上面的主ULT被调度执行bio_nvme_ctl //设置全局nvme bdev启动状态为:BIO_CTL_NOTIFY_STARTED,使得后文xs中spdk subsystem初始化及创建的nvme的ULT可以继续执行drpc_listener_init //在 dRPC xs中创建ULT线程启动dRPC监听drpc_notify_ready //向daos_server发起ready就绪通知,daos_server会向MS Leader发送JoinSys的gRPC消息,向daos_engine回发SetRank和SetUp的dRPC消息server_init_state_wait //等待来自daos_server的init_state更新:收到daos_server的SetUp消息后会设置init_state状态为DSS_INIT_STATE_SET_UP//pool:在system xs创建ULT逐个启动各pool,启动的pool服务添加到rsvc_hash表//mgmt:创建ULT清理僵尸pool(如果有),清理未完成pool(如果有),初始化pooltgts结构用于跟踪创建过程中的pool//dtx:给各main xs创建事务批提交ULT:dtx_batched_commit,聚合ULT:dtx_aggregation_maindss_module_setup_all //安装各模块:调用各模块的setup接口安装模块crt_register_event_cb //注册网络事件回调dss_crt_event_cb,如:groupupdate或者swim状态更新crt_register_hlc_error_cb //注册HLC错误回调dss_crt_hlc_error_cbdss_xstreams_open_barrier //激活utl barrier信号量,启动所有的xs// xs的主线程ULTdss_srv_handlerdss_xstream_set_affinity //绑核dss_tls_init //初始化tls,与该xs相关的信息会存储在tls中	crt_context_create //(如果需要)初始化Cart网络上下文,sys_xs,swim_xs,main_xs以及每个main_xs的第一个helper_xs会起用网络crt_context_initcrt_hg_ctx_init //根据配置的网络provider初始化HG(mercury),注册HG rpc handled_tm_add_metric //添加metric指标crt_swim_init //如果是swim_xs,初始化swim上下文,注册swim回调crt_swim_progress_cb,注册rpc handler到opc_mapcrt_context_register_rpc_task //注册rpc句柄dss_rpc_hdlr和dss_iv_resp_hdlr:io请求首先由上述注册的HG rpc handle响应,然后转发给这里注册的rpc handle做进一步的调度处理,最终调用op code的处理函数tse_sched_init //初始化任务调度器bio_xsctxt_alloc //(如果需要)通常只有main xs才会使用nvme,但是如果开启了metadata-on-ssd,sys_xs也会;第一个xs(main_xs或者sys_xs)会根据配置文件初始化所有的spdk subsystem,创建blobstore,将初始化的bio_bdev设备挂接到nvme_glb全局列表中。给target选择合适的nvme设备(targets循环绑定到已有target数最少的nvme上,dev和targets信息持久化到db中),并创建io_channel daos_abt_thread_create //创建ULT添加到nvme池,等待argobots调度执行:负责nvme设备的状态监测,设备的热插拔监测等ABT_cond_signal //激活信号量,以便调用线程能继续运行ABT_cond_wait //如果是swim_xs则立即开始后面的循环,如果是非swim xs,等收到daos_server的dRPC消息setUp后再执行for (;;)  //主ULT循环,如果该xs开启了Cart网络,会调用HG(mercury)接口推进rpc的调用及回调处理(swim xs会执行上述注册的crt_swim_progress_cb进行engine状态探测)wait_all_exited //等待所有ULT退出,engine退出

参考资料

Argobots论文
高性能I/O引擎论文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/117158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

某马机房预约系统 C++项目(二) 完结

8.4、查看机房 8.4.1、添加机房信息 根据案例&#xff0c;我们还是先在computerRoom.txt中直接添加点数据 //几机房 机器数量 1 20 2 50 3 1008.4.2、机房类创建 ​ 同样我们在头文件下新建一个computerRoom.h文件 添加如下代码&#xff1a; #pragma once #include<i…

【python】文件和异常

文件和异常 实际开发中常常会遇到对数据进行持久化操作的场景&#xff0c;而实现数据持久化最直接简单的方式就是将数据保存到文件中。说到“文件”这个词&#xff0c;可能需要先科普一下关于文件系统的知识&#xff0c;但是这里我们并不浪费笔墨介绍这个概念&#xff0c;请大…

凉鞋的 Godot 笔记 204. 语句

204. 语句 在上一篇&#xff0c;我们接触了三种常见的类型&#xff0c;如下所示&#xff1a; 这样我们算是对变量进行了一个入门了。 其实我们除了变量&#xff0c;我们还接触了一个叫做语句的概念。 我们可以看下代码: extends Node# Called when the node enters the sce…

IDEA配置HTML和Thymeleaf热部署开发

IDEA配置HTML和Thymeleaf热部署开发 1.项目配置2. IDEA配置3. 使用 需求&#xff1a;现在我们在开发不分离项目的时候&#xff08;SpringBootThmeleaf&#xff09;经常会改动了类或者静态html文件就需要重启一下服务器&#xff0c; 这样不仅时间开销很大&#xff0c;而且经常重…

SpringMVC系列-5 消息转换器

背景 SpringMVC系列的第五篇介绍消息转换器&#xff0c;本文讨论的消息转换指代调用Controller接口后&#xff0c;对结果进行转换处理的过程。 内容包括介绍自定义消息转换器、SpringMVC常见的消息转换器、Spring消息转换器工作原理等三部分。 本文以 SpringMVC系列-2 HTTP请求…

PHP 预定义超全局变量 笔记/练习

预定义超全局数组变量 $_FILES 练习在最后 其他练习跟在每条笔记后 概述 预定义&#xff1a;预定义变量是 PHP 已定义&#xff0c;可以直接使用超全局&#xff1a;作用域是全局&#xff0c;可以在脚本的任何地方&#xff08;包括函数内部、外部&#xff09;都可以进行访问 常…

使用GoogleNet网络实现花朵分类

一.数据集准备 新建一个项目文件夹GoogleNet&#xff0c;并在里面建立data_set文件夹用来保存数据集&#xff0c;在data_set文件夹下创建新文件夹"flower_data"&#xff0c;点击链接下载花分类数据集https://storage.googleapis.com/download.tensorflow.org/exampl…

冲刺学习-MySQL-常见问题

MySQL索引的最左原则 联合索引的说明 建立三个字段的联合索引联合索引&#xff08;a&#xff0c;b&#xff0c;c&#xff09;相当于建立了索引&#xff1a;&#xff08;a&#xff09;&#xff0c;&#xff08;a&#xff0c;b&#xff09;&#xff0c;&#xff08;a&#xff0…

计算机考研自命题(5)

1、C语言–求和 1、展开式求和。输入一个实数x&#xff0c;计算并输出下式的和&#xff0c;直到最后一项的绝对值小于0.00001.计算结果保留2位小数&#xff0c;试编程。 S x x/2&#xff01; x/3&#xff01; … /* 算法思想&#xff1a;定义一个求阶乘的函数fact(), 头文件调…

蜣螂优化(DBO)求解置换流水车间调度问题(PFSP)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

基于SpringBoot的时间管理系统

基于SpringBoot的时间管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 管理员界面 用户界面 摘要 基于Spring Boot的时间管理系统是一款功能丰富…

Unity之ShaderGraph如何实现靠近显示溶解效果

前言 今天我们来实现一个我再B站看到的一个使用LeapMotion实现的用手部触摸就可以显示的溶解效果。 效果如下图所示: 主要节点 Position:提供对网格顶点或片段的Position 的访问,具体取决于节点所属图形部分的有效着色器阶段。使用Space下拉参数选择输出值的坐标空间。 …

ArcGIS笔记10_如何创建渔网?

本文目录 前言Step 1 确定渔网的精度单位Step 2 有底图时创建渔网的操作 前言 ArcGIS中的渔网是一个很好用的工具&#xff0c;它可以创建出规规整整的小格子&#xff0c;每个小格子都对应一个标注点&#xff0c;可以将原本散乱的数据规整化&#xff0c;如下图&#xff1a; Ste…

前沿重器[36] | ACL23-基于检索的大语言模型-报告阅读

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…

Nginx 防盗链

nginx防盗链问题 盗链&#xff1a; 就是a网站有一张照片&#xff0c;b网站引用了a网站的照片 。 防盗链&#xff1a; a网站通过设置禁止b网站引用a网站的照片。 nginx防止网站资源被盗用模块 ngx_http_referer_module 如何区分哪些是不正常的用户&#xff1f; HTTP Referer…

【Java 进阶篇】Java Tomcat 入门指南

Java Tomcat&#xff08;通常简称 Tomcat&#xff09;是一个流行的开源Servlet容器&#xff0c;用于托管Java Web应用程序。它是Apache软件基金会的一部分&#xff0c;提供了一个稳定、可靠的环境来运行Java Servlets和JavaServer Pages&#xff08;JSP&#xff09;。本篇博客将…

FPGA时序分析与约束(6)——综合的基础知识

在使用时序约束的设计过程中&#xff0c;综合&#xff08;synthesis&#xff09;是第一步。 一、综合的解释 在电子设计中&#xff0c;综合是指完成特定功能的门级网表的实现。除了特定功能&#xff0c;综合的过程可能还要满足某种其他要求&#xff0c;如功率、操作频率等。 有…

【WinForm详细教程一】WinForm中的窗体、Label、TextBox及Button控件、RadioButton和CheckBox、ListBox

文章目录 1.WinForm文件结构2. 窗体的常用属性、方法与事件2.1 常用属性&#xff08;可直接在属性中设置&#xff09;2.2 常用方法2.3 常用事件 3.Label、TextBox及Button控件4.RadioButton和CheckBox5.ListBox&#xff08;列表框&#xff09; 1.WinForm文件结构 .sln文件 &am…

zabbix6.0 部署配置

架构 先简单介绍zabbix监控的最主要的两个组件&#xff1a; zabbix server zabbix agent server 用来部署 web console以及相关的数据存储&#xff0c;所以需要配合一些数据库来保存数据&#xff0c;比如mysql,pgsql, 又有前端的页面所以还需要配置 nginx 和getway 所以 serve…

Unity 文字显示动画(2)

针对第一版的优化&#xff0c;自动适配文字大小&#xff0c;TextMeshPro可以拓展各种语言。第一版字母类语言效果更好。 using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI;public partial class TextBeat…