当前位置: 首页 > news >正文

CNI 网络流量 5.1 Cilium 介绍和原理

文章目录

  • 简介
  • 安装
  • 组件和原理
    • Cilium-agent
      • 初始化
      • IPAM
      • CNI
    • Cilium cli 的使用
    • bpfMap 的操作
      • Cilium-agent
      • Ebpf

简介

Cilium 是一个用于容器网络领域的开源项目,主要是面向容器而使用,用于提供并透明地保护应用程序工作负载(如应用程序容器或进程)之间的网络连接和负载均衡。
Cilium 在第 3/4 层运行,以提供传统的网络和安全服务,还在第 7 层运行,以保护现代应用协议(如 HTTP, gRPC 和 Kafka)的使用。 Cilium 被集成到常见的容器编排框架中,如 Kubernetes 和 Mesos。
Cilium 的底层基础是 BPF,Cilium 的工作模式是生成内核级别的 BPF 程序与容器直接交互。区别于为容器创建 overlay 网络,Cilium 允许每个容器分配一个 IPv6 地址(或者 IPv4 地址),使用容器标签而不是网络路由规则去完成容器间的网络隔离。它还包含创建并实施 Cilium 规则的编排系统的整合。
在这里插入图片描述

安装

$ curl -L --remote-name-all https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz{,.sha256sum}$ tar -zxvf cilium-linux-amd64.tar.gz$ cilium install
ℹ️  Using Cilium version 1.13.0
🔮 Auto-detected cluster name: kubernetes
🔮 Auto-detected datapath mode: tunnel
🔮 Auto-detected kube-proxy has not been installed
ℹ️  Cilium will fully replace all functionalities of kube-proxy
ℹ️  helm template --namespace kube-system cilium cilium/cilium --version 1.13.0 --set bpf.masquerade=true,cluster.id=0,cluster.name=kubernetes,encryption.nodeEncryption=false,k8sServiceHost=1.2.3.226,k8sServicePort=6443,kubeProxyReplacement=strict,operator.replicas=1,serviceAccounts.cilium.name=cilium,serviceAccounts.operator.name=cilium-operator,tunnel=vxlan
ℹ️  Storing helm values file in kube-system/cilium-cli-helm-values Secret
🔑 Created CA in secret cilium-ca
🔑 Generating certificates for Hubble...
🚀 Creating Service accounts...
🚀 Creating Cluster roles...
🚀 Creating ConfigMap for Cilium version 1.13.0...
🚀 Creating Agent DaemonSet...
🚀 Creating Operator Deployment...
⌛ Waiting for Cilium to be installed and ready...^[[A♻️  Restarting unmanaged pods...
♻️  Restarted unmanaged pod kube-system/coredns-6d8c4cb4d-4nf2s
✅ Cilium was successfully installed! Run 'cilium status' to view installation health// 安装 hubble
$ cilium hubble enable --ui
🔑 Found CA in secret cilium-ca
ℹ️  helm template --namespace kube-system cilium cilium/cilium --version 1.13.0 --set bpf.masquerade=true,cluster.id=0,cluster.name=kubernetes,encryption.nodeEncryption=false,hubble.enabled=true,hubble.relay.enabled=true,hubble.tls.ca.cert=LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNGVENDQWJxZ0F3SUJBZ0lVUTc1YkNSZU4yc01yVndtbFREWWJic0ZaZ1NBd0NnWUlLb1pJemowRUF3SXcKYURFTE1Ba0dBMVVFQmhNQ1ZWTXhGakFVQmdOVkJBZ1REVk5oYmlCR2NtRnVZMmx6WTI4eEN6QUpCZ05WQkFjVApBa05CTVE4d0RRWURWUVFLRXdaRGFXeHBkVzB4RHpBTkJnTlZCQXNUQmtOcGJHbDFiVEVTTUJBR0ExVUVBeE1KClEybHNhWFZ0SUVOQk1CNFhEVEl6TURJeU5qQTJORGt3TUZvWERUSTRNREl5TlRBMk5Ea3dNRm93YURFTE1Ba0cKQTFVRUJoTUNWVk14RmpBVUJnTlZCQWdURFZOaGJpQkdjbUZ1WTJselkyOHhDekFKQmdOVkJBY1RBa05CTVE4dwpEUVlEVlFRS0V3WkRhV3hwZFcweER6QU5CZ05WQkFzVEJrTnBiR2wxYlRFU01CQUdBMVVFQXhNSlEybHNhWFZ0CklFTkJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVlcm1PbFJOZjZtSzBkNXcxbWNuRjV6RlEKb1ZGaVZUSGxKTmczQkM4Nzd4QnA5VnN0b0h3OU54Y0c1R1o0WXFoNFd0NXdhMG90dVBhRXJSbFk3RFBlbjZOQwpNRUF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTGViCkdSSUgxTVZGTlNpYW5XaTYyYXZRQzhLYU1Bb0dDQ3FHU000OUJBTUNBMGtBTUVZQ0lRQ3FOSHFpa3VCWUpkdHMKYVBadndUMWhIZEd4aCtyWVBWc1RQTnprd2pxQzV3SWhBTnVuOFQ0TThhTC9CUmhSb1pXTlE4TXYxc083bGZJRApvT3BtYS9NcmFEVTkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=,hubble.tls.ca.key=[--- REDACTED WHEN PRINTING TO TERMINAL (USE --redact-helm-certificate-keys=false TO PRINT) ---],hubble.ui.enabled=true,k8sServiceHost=1.2.3.226,k8sServicePort=6443,kubeProxyReplacement=strict,operator.replicas=1,serviceAccounts.cilium.name=cilium,serviceAccounts.operator.name=cilium-operator,tunnel=vxlan
✨ Patching ConfigMap cilium-config to enable Hubble...
🚀 Creating ConfigMap for Cilium version 1.13.0...
♻️  Restarted Cilium pods
⌛ Waiting for Cilium to become ready before deploying other Hubble component(s)...
🚀 Creating Peer Service...
✨ Generating certificates...
🔑 Generating certificates for Relay...
✨ Deploying Relay...
✨ Deploying Hubble UI and Hubble UI Backend...
⌛ Waiting for Hubble to be installed...
ℹ️  Storing helm values file in kube-system/cilium-cli-helm-values Secret
✅ Hubble was successfully enabled!修改 svc 为 nodeport 提供访问

组件和原理

Cilium-agent

daemonset 在集群中的每个节点上运行,通过 Kubernetes 或 API 接受配置,这些配置描述了网络、服务负载平衡、网络策略以及可见性和监控要求。监听来自 Kubernetes 等编排系统的事件,以了解何时启动和停止容器或工作负载。它管理 eBPF 程序,Linux 内核使用这些程序来控制进出这些容器的所有网络访问。

初始化

Init 生成 节点的 cilium 信息
路径:/var/run/cilium/state/globals/node_config.h

cilium-agent --config-dir=/tmp/cilium/config-map

创建 bpfMap,map 存储地址 /sys/fs/bpf/tc/globals/

   ctmap.InitMapInfo(option.Config.CTMapEntriesGlobalTCP, option.Config.CTMapEntriesGlobalAny,option.Config.EnableIPv4, option.Config.EnableIPv6, option.Config.EnableNodePort)policymap.InitMapInfo(option.Config.PolicyMapEntries)lbmapInitParams := lbmap.InitParams{IPv4: option.Config.EnableIPv4,IPv6: option.Config.EnableIPv6,MaxSockRevNatMapEntries:  option.Config.SockRevNatEntries,ServiceMapMaxEntries:     option.Config.LBMapEntries,BackEndMapMaxEntries:     option.Config.LBMapEntries,RevNatMapMaxEntries:      option.Config.LBMapEntries,AffinityMapMaxEntries:    option.Config.LBMapEntries,SourceRangeMapMaxEntries: option.Config.LBMapEntries,MaglevMapMaxEntries:      option.Config.LBMapEntries,}

将本 node 注册到 nodeMgr

nodeMngr.Subscribe(dp.Node())m.nodeHandlers[nh] = struct{}{}

Domain 创建,包含所有的 manager

    // datapath is the underlying datapath implementation to use to// implement all aspects of an agentdatapath datapath.Datapath// nodeDiscovery defines the node discovery logic of the agentnodeDiscovery *nodediscovery.NodeDiscovery// ipam is the IP address manager of the agentipam *ipam.IPAMnetConf *cnitypes.NetConfendpointManager endpointmanager.EndpointManageridentityAllocator CachingIdentityAllocatoripcache *ipcache.IPCachek8sWatcher *watchers.K8sWatcherredirectPolicyManager *redirectpolicy.ManageregressGatewayManager *egressgateway.ManagercgroupManager *manager.CgroupManager

设置系统配置

rp_filter
fib_multipath_use_neigh
unprivileged_bpf_disabled
forwarding

IPAM

IPAM 先获取 InternalIP
为每个节点分配 cidr v4Prefix=10.0.0.0/24

AllocteIPs
Cluster-Name: kubernetes
Local node-name: cilium1"
External-Node IPv4: 1.2.3.226
Internal-Node IPv4: 10.0.0.2
IPv4 allocation prefix: 10.0.0.0/24
Loopback IPv4: 169.254.42.1
Local IPv4 addresses:- 1.2.3.226- 10.0.0.2

CNI

向 cilium agent 请求本节点配置

    conf, err = getConfigFromCiliumAgent(c)if err != nil {return}

配置中 ipammode:cluster-role

通过 cilium-agent 请求地址

   podName := string(cniArgs.K8S_POD_NAMESPACE) + "/" + string(cniArgs.K8S_POD_NAME)ipam, err := client.IPAMAllocate("", podName, true)

allocate_ip

func (h *postIPAM) Handle(params ipamapi.PostIpamParams) middleware.Responder {

通过现有的 allocated 的 ip 和数量,计算下一个 ip 的偏移量,然后得到申请的 IP

网卡创建
创建 veth-pair,DisableRpFilter,SetMTU,SetUp,SetGROMaxSize,SetGSOMaxSize,设置 ns 内部 IP 和路由

创建 endpoint
调 cilium-agent 创建 endpoint

Endpoint 创建

func (d *Daemon) createEndpoint(ctx context.Context, owner regeneration.Owner, epTemplate *models.EndpointChangeRequest) (*endpoint.Endpoint, int, error) 

Endpoint 内容

为 endpoint 申请 ID

err = mgr.expose(ep)func (mgr *endpointManager) expose(ep *endpoint.Endpoint) error {newID, err := mgr.AllocateID(ep.ID)if err != nil {return err}mgr.mutex.Lock()// Get a copy of the identifiers before exposing the endpointidentifiers := ep.IdentifiersLocked()ep.Start(newID)func (e *Endpoint) Regenerate(regenMetadata *regeneration.ExternalRegenerationMetadata) <-chan bool {// BPF 程序会被下发到宿主机 /var/run/cilium/state 目录中,regenerateBPF() 函数会重写 bpf headers,以及更新 BPF Map。更新 BPF Map 很重要,下发到网卡中的 BPF 程序执行逻辑时会去查 BPF Map 数据:
func (e *Endpoint) regenerateBPF(regenContext *regenerationContext) (revnum uint64, stateDirComplete bool, reterr error) {// Compile and install BPF programs for this endpointcompilationExecuted, err = e.realizeBPFState(regenContext)

编译 BPF 程序

err = e.owner.Datapath().Loader().CompileOrLoad(datapathRegenCtxt.completionCtx, datapathRegenCtxt.epInfoCache, &stats.datapathRealization)/var/run/cilium/state/<ENDPOINT ID>/
err := compileDatapath(ctx, dirs, ep.IsHost(), ep.Logger(Subsystem))

挂载 BPF 程序

err = l.reloadDatapath(ctx, ep, dirs)// bpf_lxc.ofilter := &netlink.BpfFilter{FilterAttrs: netlink.FilterAttrs{LinkIndex: link.Attrs().Index,Parent:    qdiscParent,Handle:    1,Protocol:  unix.ETH_P_ALL,Priority:  option.Config.TCFilterPriority,},Fd:           prog.FD(),Name:         fmt.Sprintf("cilium-%s", link.Attrs().Name),DirectAction: true,}

挂载结果

// 普通 pod, from_container
# tc filter show dev lxc1466f225c091 ingress
filter protocol all pref 1 bpf chain 0 
filter protocol all pref 1 bpf chain 0 handle 0x1 cilium-lxc1466f225c091 direct-action not_in_hw id 1717 name cil_from_contai tag a6c2cf4a8cf17a1c jited// cilium_net,cilium_host, to_host, from_host
# tc filter show dev  cilium_host  ingress
filter protocol all pref 1 bpf chain 0 
filter protocol all pref 1 bpf chain 0 handle 0x1 cilium-cilium_host direct-action not_in_hw id 1597 name cil_to_host tag 6b89d4d09c799b6f jited# tc filter show dev  cilium_host  egress
filter protocol all pref 1 bpf chain 0 
filter protocol all pref 1 bpf chain 0 handle 0x1 cilium-cilium_host direct-action not_in_hw id 1612 name cil_from_host tag ec83ff303e14698d jited// cilium_vxlan to_overlay,from_overlay
# tc filter show dev  cilium_vxlan   ingress
filter protocol all pref 1 bpf chain 0 
filter protocol all pref 1 bpf chain 0 handle 0x1 bpf_overlay.o:[from-overlay] direct-action not_in_hw id 1509 name cil_from_overla tag 10c7559775622132 jited 
# tc filter show dev  cilium_vxlan   egress
filter protocol all pref 1 bpf chain 0 
filter protocol all pref 1 bpf chain 0 handle 0x1 bpf_overlay.o:[to-overlay] direct-action not_in_hw id 1520 name cil_to_overlay tag 4d78a91325ebff94 jited// ens3 from_netdev,to_netdev
# tc filter show dev  ens3  ingress
filter protocol all pref 1 bpf chain 0 
filter protocol all pref 1 bpf chain 0 handle 0x1 cilium-ens3 direct-action not_in_hw id 1635 name cil_from_netdev tag 764697679c641345 jited
# tc filter show dev  ens3  egress
filter protocol all pref 1 bpf chain 0 
filter protocol all pref 1 bpf chain 0 handle 0x1 cilium-ens3 direct-action not_in_hw id 1636 name cil_to_netdev tag 8a513eccee57644b jited

Cilium cli 的使用

工具很强大,支持查看几乎所有的信息

# kubectl exec  cilium-wkfqx    -n kube-system  -- cilium --help
Available Commands:bpf          Direct access to local BPF mapsbuild-config Resolve all of the configuration sources that apply to this nodecleanup      Remove system state installed by Cilium at runtimecompletion   Output shell completion codeconfig       Cilium configuration optionsdebuginfo    Request available debugging information from agentencrypt      Manage transparent encryptionendpoint     Manage endpointsfqdn         Manage fqdn proxyhelp         Help about any commandidentity     Manage security identitiesip           Manage IP addresses and associated informationkvstore      Direct access to the kvstorelrp          Manage local redirect policiesmap          Access userspace cached content of BPF mapsmetrics      Access metric statusmonitor      Display BPF program eventsnode         Manage cluster nodesnodeid       List node IDs and associated informationpolicy       Manage security policiesprefilter    Manage XDP CIDR filterspreflight    Cilium upgrade helperrecorder     Introspect or mangle pcap recorderservice      Manage services & loadbalancersstatus       Display status of daemonversion      Print version information

可以查看 k8s endpoint 内容

kubectl exec  cilium-wkfqx    -n kube-system  -- cilium endpoint  list

甚至可以查看 cilium_lxc map 有多少内容

kubectl exec  cilium-wkfqx    -n kube-system  -- cilium map  get cilium_lxc
Key            Value                                                                               State   Error
10.0.0.77:0    id=1033  flags=0x0000 ifindex=9   mac=8A:65:66:99:93:67 nodemac=66:52:92:66:66:01   sync    
10.0.0.231:0   id=692   flags=0x0000 ifindex=13  mac=F6:DF:83:C1:42:AE nodemac=4A:D2:EC:B7:41:7C   sync    
10.0.0.157:0   id=2351  flags=0x0000 ifindex=19  mac=36:B0:81:DD:CB:53 nodemac=5A:E7:3B:D0:B8:C5   sync    
10.0.0.243:0   id=505   flags=0x0000 ifindex=21  mac=9A:A7:AD:85:CC:E3 nodemac=E6:5B:CE:77:AA:3D   sync

监控

kubectl exec  cilium-wkfqx    -n kube-system  -- cilium monitor

bpfMap 的操作

Cilium-agent

当 pod 增加时,将对应 endpoint 存入 map

err = lxcmap.WriteEndpoint(datapathRegenCtxt.epInfoCache)for _, v := range GetBPFKeys(f) {if err := LXCMap().Update(v, info); err != nil {return err}}if err = m.open(); err != nil {return err}err = UpdateElement(m.fd, m.name, key.GetKeyPtr(), value.GetValuePtr(), 0)if option.Config.MetricsConfig.BPFMapOps {metrics.BPFMapOps.WithLabelValues(m.commonName(), metricOpUpdate, metrics.Error2Outcome(err)).Inc()}

如 endpointInfo

   info := &EndpointInfo{IfIndex: uint32(e.GetIfIndex()),                // 网卡索引// Store security identity in network byte order so it can be// written into the packet without an additional byte order// conversion.LxcID:   uint16(e.GetID()),                     // endpoint IDMAC:     mac,                                   // 网卡 macNodeMAC: nodeMAC,                               // 宿主机侧 mac}

Key

type EndpointKey struct {// represents both IPv6 and IPv4 (in the lowest four bytes)IP        types.IPv6 `align:"$union0"`              ip bytesFamily    uint8      `align:"family"`               1       // ipv4Key       uint8      `align:"key"`                  0ClusterID uint8      `align:"cluster_id"`           0Pad       uint8      `align:"pad"`                  0
}

存入的 hashmap 以上面 key,value=endpointInfo 存储

Ebpf

当 ebpf 程序中需要查询 该 endpoint 时,通过 map_lookup_elem 在 map 查询

static __always_inline __maybe_unused struct endpoint_info *
__lookup_ip4_endpoint(__u32 ip)
{struct endpoint_key key = {};key.ip4 = ip;key.family = ENDPOINT_KEY_IPV4;return map_lookup_elem(&ENDPOINTS_MAP, &key);
}

相关文章:

CNI 网络流量 5.1 Cilium 介绍和原理

文章目录简介安装组件和原理Cilium-agent初始化IPAMCNICilium cli 的使用bpfMap 的操作Cilium-agentEbpf简介 Cilium 是一个用于容器网络领域的开源项目&#xff0c;主要是面向容器而使用&#xff0c;用于提供并透明地保护应用程序工作负载&#xff08;如应用程序容器或进程&a…...

机加行业MES解决方案,助力企业打造数字化透明车间

机械加工行业的主要原材料占整个生产物料成本的95%~99%&#xff0c;以挖掘机为例&#xff0c;原材料有各种规格的钢板、焊丝、焊条、油漆以及各种气体等&#xff0c;其中主要原材料是钢板&#xff0c;占原材料比率的98%以上。 因此机械加工mes的原材料管理是机械加工行业信息化…...

C/C++每日一练(20230227)

目录 1. 按要求排序数组 ★ 2. Z 字形变换 ★★ 3. 下一个排列 ★★ 1. 按要求排序数组 给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中&#xff0c;数字 1 的数目升序排序。 如果存在多个数字二进制中 1 的数目相同&#xff0c;则必须将它们按照数值大小…...

总结SpringBoot1.x迁移到2.x需要注意的问题

SpringBoot1.x和SpringBoot2.x版本差异化还是比较大的&#xff0c;有些三方依赖组件有些是基于2.0版本为标准升级的&#xff0c;当我们将项目由1.0升级到2.0时会出现依赖的方法不存在或方法错误&#xff0c;需要逐个去调整&#xff0c;下面总结了我们升级实践过程中遇到的一些问…...

Api接口小知识

应用程序接口API&#xff08;Application Programming Interface&#xff09;,是提供特定业务输出能力、连接不同系统的一种约定。这里包括外部系统与提供服务的系统&#xff08;中控系统&#xff09;或者后台不同的系统之间的交互点。包括外部接口、内部接口、内部接口有包括&…...

「JVM 高效并发」Java 协程

Java 语言抽象和隐藏了各种操作系统线程差异性的接口&#xff0c;这曾经是它区别于其他编程语言的一大优势&#xff0c;但在某些场景下&#xff0c;却已经出现了疲态&#xff1b; 文章目录1. 内核线程的局限2. 协程的复苏3. Java 的解决方案1. 内核线程的局限 在微服务架构中&…...

Web Spider案例 网洛者 第一题 JS混淆加密 - 反hook操作 练习(五)

文章目录一、资源推荐二、第一题 JS混淆加密 - 反hook操作2.1 过控制台反调试(debugger)2.2 开始逆向分析三、python具体实现代码四、记录一下&#xff0c;execjs调用混淆JS报错的问题总结提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、资源推荐 …...

前端基础之CSS扫盲

文章目录一. CSS基本规范1. 基本语法格式2. 在HTML引入CSS3. 选择器分类二. CSS常用属性1. 文本属性2. 文本格式3. 背景属性4. 圆角矩形和圆5. 元素的显示模式6. CSS盒子模型7. 弹性布局光使用HTML来写一个前端页面的话其实只是写了一个大体的框架, 整体的页面并不工整美观, 而…...

mysql组复制、mysql路由器、mysql的MHA高可用

文章目录前言一、mysql组复制1.实验机配置2.测试二、mysql路由器三、mysql之MHA高可用1.MHA概念1.创建一主两从集群2.MHA部署3.故障切换前言 一、mysql组复制 1.实验机配置 server1配置 首先停止数据库 [rootserver1 mysql]# /etc/init.d/mysqld stop Shutting down MySQL..…...

一篇搞懂springboot多数据源

好文推荐 https://zhuanlan.zhihu.com/p/563949762 mybatis 配置多数据源 参考文章 https://blog.csdn.net/qq_38353700/article/details/118583828 使用mybatis配置多数据源我接触过的有两种方式&#xff0c;一种是通过java config的方式手动配置两个数据源&#xff0c;…...

Verilog 数据类型和数组简介

在这篇文章将讨论 verilog 中最常用的数据类型&#xff0c;包括对数据表示&#xff0c;线网类型、变量类型&#xff0c;向量类型和数组的讨论。尽管 verilog 被认为是一种弱类型语言&#xff08;loosely typed&#xff09;&#xff0c;但设计者仍必须在 Verilog 设计中为每个端…...

【数据结构】时间复杂度和空间复杂度以及相关OJ题的详解分析

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1.算法效率1.1 如何衡…...

31--Vue-前端开发-Vue语法

一、前端-Vue介绍 1.前端介绍 1、HTML(5)、CSS(3)、JavaScript(ES5、ES6):编写一个个的页面 ----> 给后端(PHP、Python、Go、Java) ----> 后端嵌入模板语法 ----> 后端渲染完数据 ----> 返回数据给前端 ----> 在浏览器中查看 2、Ajax的出现 -> 后台发送异…...

这份IC设计必读书单,值得所有IC设计工程师一看!

《综合与时序分析的设计约束》 作者&#xff1a;Sridhar Gangadharan 本书为集成电路时序约束设计的指南&#xff0c;指导读者通过指定的时序要求&#xff0c;充分发挥IC设计的性能。本书内容包括受时序约束的关键环节的设计流程、综合时序分析、静态时序分析和布局布线等。本书…...

Acwing 蓝桥杯 第一章 递归与递推

我上周在干什么&#xff0c;感觉我上周啥也没训&#xff0c;本来两天一次的vp也没v很寄啊&#xff0c;再这样下去真不行了先总结一下如何爆搜&#xff1a;先去确定好枚举的对象枚举的对象很重要&#xff01;&#xff01;这直接影响了复杂度然后就是去想递归树就好了一、确定状态…...

模型部署笔记

目录模型部署工作ONNX存在的意义ONNX&#xff08;Open Neural Network Exchange&#xff09;ONNX示例模型推理示例Batch调整量化量化方式常见问题模型部署工作 训练好的模型在特定软硬件平台下推理针对硬件优化和加速的推理代码 训练设备平台&#xff1a; CPU、GPU、DSP ONN…...

多线程之wait和notify

目录 1.wait()方法 2. notify方法 因为线程之间是抢占式执行的&#xff0c;所以线程之间执行的先后顺序难以预知。但是实际开发中&#xff0c;我们希望线程之间的执行顺序是能被掌控的&#xff0c;比如线程2开始之前&#xff0c;需要线程1的某个任务先被执行。也就是说,很多时…...

MVCC 当前读 快照读 RC read view RR下事务更新不会丢失

MVCC(multi-version-concurrent-control) MVCC是行锁的一个变种&#xff0c;但MVCC在很多情况下它避免了加锁。不是buffer块&#xff0c;而是buffer中的记录行。 MVCC (Multi-Version Concurrency Control) (注&#xff1a;与MVCC相对的&#xff0c;是基于锁的并发控制&#x…...

NCRE计算机等级考试Python真题(二)

第二套试题1、关于算法的描述&#xff0c;以下选项中错误的是A.算法具有可行性、确定性、有穷性的基本特征B.算法的复杂度主要包括时间复杂度和数据复杂度C.算法的基本要素包括数据对象的运算和操作及算法的控制结构D.算法是指解题方案的准确而完整的描述正确答案&#xff1a; …...

借助IBM Spectrum LSF为芯片行业大幅提升算力,预测未来

IBM Spectrum LSF 客户案例——上海开赟软件服务有限公司借助IBM Spectrum LSF为芯片行业大幅提升算力&#xff0c;预测未来 业务影响 中国芯片市场作为全球消费芯片市场重要组成部分&#xff0c;近年来发展迅猛。据国家统计局统计&#xff0c;2019年中国集成电路产量突破200…...

力扣-换座位

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;626. 换座位二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总结前言 …...

DFT基本入门介绍

1.什么是DFT&#xff1f;2.为什么要做DFT&#xff1f;3.“测试”与“验证”的区别4.DFT的核心技术1)扫描路径设计&#xff08;Scan Design&#xff09;2)内建自测试&#xff08;Bist&#xff09;3)JTAG4)ATPG5.DFT工程师的岗位职责随着芯片的制程越来小(5nm), 芯片的规模越来越…...

做「增长」必须懂的6大关键指标

无论你所从事的是哪个行业&#xff0c;增长都不是一件易事&#xff0c;SaaS公司想要维持长期的增长更是难上加难。这是因为SaaS公司对未来回报的依赖程度更大&#xff0c;反观那些传统商业模式的公司&#xff0c;主要的收入来源都集中在产品购买交付的时点上&#xff0c;而客户…...

Linux:soft lockup 检测机制

1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. 分析背景 本文分析基于 linux-4.14.132 内核代码分析&#xff0c;运行环境 Ubuntu 16.04.4 LTS QEMU ARM vexpress-a9 &#xff0c;rootfs 基…...

天线理论知识4——非频变天线

目录 简介自补结构巴比涅原理天线的描述常见的非频变天线简介 所谓的非频变天线指的是天线的参数几乎不随着频率的改变而发生变化。 自补结构 天线的自补结构指的是:由无限大且无厚度的理想导电区域的自由空间中的非导电区域放置一起的结构称为自补结构。包含金属部分和非金…...

基础架构组件选型及服务化

常见的分布式基础架构组件 分布式服务化框架&#xff0c;业界开源产品比如 Dubbo、Spring Cloud 这样的框架&#xff1b;分布式缓存及框架&#xff0c;业界如 Redis、Memcached&#xff0c;框架如 Codis 和 Redis Cluster&#xff1b;数据库及分布式数据库框架&#xff0c;这两…...

leetcode-每日一题-1247(中等,数学逻辑)

这道题当理解清了意思之后&#xff0c;只要是s1和s2的某位置的字母一样时我们就可以忽视比如s1"xxxxxxyyyy"; 就可以看成s1"xxxyyyy";s2"xxxyyyxxxx"; s2"yyyxxxx";其次就是只有当x和y位置差异产生的数量同奇偶的时候才可以构成相等字…...

前端面试题 —— 计算机网络(一)

目录 一、常见的HTTP请求头和响应头 二、HTTP状态码304是多好还是少好&#xff1f; 三、OPTIONS请求方法及使用场景 四、对keep-alive的理解 五、HTTP协议的优点和缺点 六、URL有哪些组成部分&#xff1f; 七、HTTPS通信&#xff08;握手&#xff09;过程 八、HTTPS的特…...

分布式-分布式缓存笔记

分布式系统缓存 缓存分类 前端缓存 前端缓存包括页面和浏览器缓存&#xff0c;如果是 App&#xff0c;那么在 App 端也会有缓存。当你打开商品详情页&#xff0c;除了首次打开以外&#xff0c;后面重复刷新时&#xff0c;页面上加载的信息来自多种缓存。 页面缓存属于客户端…...

【反序列化漏洞-01】为什么要序列化

为什么要序列化百度百科上关于序列化的定义是&#xff0c;将对象的状态信息转换为可以存储或传输的形式(字符串)的过程。在序列化期间&#xff0c;对象将其当前状态写入到临时或持久性存储区(非关系型键值对形式的数据库Redis&#xff0c;与数组类似)。以后&#xff0c;可以通过…...

丹东 建设集团 招聘信息网站/邢台网站网页设计

前言 CSS确实很重要&#xff0c;且有点奇技淫巧&#xff0c;看起来规则十分简单&#xff0c;但是创意更重要&#xff0c;如何用css构造出自己想要的效果&#xff0c;写的代码好看优雅十分重要。 在看了不借助Echarts等图形框架原生JS快速实现折线图效果并自己重新实现了以后&am…...

php源码建站 一品资源/手游推广平台代理

本文通过列举出一些常见的实例来分析Python3.0与2.X版本的区别&#xff0c;是作者经验的总结&#xff0c;对于Python程序设计人员来说有不错的参考价值。具体如下&#xff1a;做为一个前端开发的码农&#xff0c;最近通过阅读最新版的《A byte of Python》并与老版本的《A byte…...

旅游网站开发毕业论文前言/搜索引擎收录提交入口

用户在使用经典虚拟机时&#xff0c;经常会有如下疑问&#xff1a;门户主板页面中的 SSH/RDP 证书指纹这项信息是怎么来的&#xff1f;用途是什么&#xff1f;为什么有的时候为空&#xff1f;有没有对虚拟机使用有什么影响&#xff1f;以下我们进行一些基本的介绍&#xff1a; …...

大连建站系统模板/外贸推广具体是做什么

Redis大数据处理:如何高效地利用Redis存储海量数据 Redis作为一款高性能的NoSQL内存数据库,被广泛应用于各种领域。当需要处理海量数据时,Redis也有许多优秀的解决方案。本文将介绍几种常见的Redis大数据处理方法,并给出相应的代码示例。 分布式存储Redis Cluster是Redis提…...

浙江省台州市做网站多少钱/优化大师手机版

最近一直在做移动端微信公众号项目的开发&#xff0c;也是我首次用vue来开发移动端项目&#xff0c;前期积累的移动端开发经验较少。经过这个项目的锻炼&#xff0c;加深了对vue相关知识点的理解和运用&#xff0c;同时&#xff0c;在项目中所涉及到的微信api(微信分享&#xf…...

做拍福利爱福利视频网站/百度关键词排名优化工具

已经有两篇文章写了怎么导出json到excel&#xff0c;不过那个插件只能做这一项工作&#xff0c;为了结合excel上传导入json数据&#xff0c;所以用js-xlsx这个插件再弄一次 js支持 1、js-xlsx 2、filesave (如果想像我这样引入&#xff0c;需要在源代码中删除最前面的export…...