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

Pod的调度

在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。但是在实际使用中,这并不满足的需求,因为很多情况下,我们想控制某些Pod到达某些节点上,那么应该怎么做呢?这就要求了解kubernetes对Pod的调度规则,kubernetes提供了四大类调度方式:

  • 自动调度:运行在哪个节点上完全由Scheduler经过一系列的算法计算得出
  • 定向调度:NodeName、NodeSelector
  • 亲和性调度:NodeAffinity、PodAffinity、PodAntiAffinity
  • 污点(容忍)调度:Taints、Toleration

定向调度 

   定向调度,指的是利用在pod上声明nodeName或者nodeSelector,以此将Pod调度到期望的node节点上。注意,这里的调度是强制的,这就意味着即使要调度的目标Node不存在,也会向上面进行调度,只不过pod运行失败而已。

NodeName

        NodeName用于强制约束将Pod调度到指定的Name的Node节点上。这种方式,其实是直接跳过 Scheduler的调度逻辑,直接将Pod调度到指定名称的节点。

创建一个pod-nodename.yaml文件

apiVersion: v1
kind: Pod
metadata:name: pod-nodenamenamespace: dev
spec:containers:- name: nginximage: nginx:1.17.1nodeName: k8s-worker01 # 指定调度到k8s-worker01节点上
#创建Pod
[root@master ~]# kubectl create -f pod-nodename.yaml
pod/pod-nodename created#查看Pod调度到NODE属性,确实是调度到了node1节点上
[root@master ~]# kubectl get pod pod-nodename -n dev -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP            NODE             ......
pod-nodename   1/1     Running   0          56s   10.244.1.87   k8s-worker01     ...... # 接下来,删除pod,修改nodeName的值为k8s-worker03(并没有k8s-worker03节点)
[root@master ~]# kubectl delete -f pod-nodename.yaml
pod "pod-nodename" deleted
[root@master ~]# vim pod-nodename.yaml
[root@master ~]# kubectl create -f pod-nodename.yaml
pod/pod-nodename created
#再次查看,发现已经向Node3节点调度,但是由于不存在k8s-worker03节点,所以pod无法正常运行
[root@master ~]# kubectl get pods pod-nodename -n dev -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP       NODE    ......
pod-nodename   0/1     Pending   0          6s    <none>   k8s-worker03  ......  

NodeSelector

        NodeSelector用于将pod调度到添加了指定标签的node节点上。它是通过kubernetes的labelselector机制实现的,也就是说,在pod创建之前,会由scheduler使用MatchNodeSelector调度策略进 行label匹配,找出目标node,然后将pod调度到目标节点,该匹配规则是强制约束。

示例:

[root@master ~]# kubectl label nodes k8s-worker1 nodeenv=pro #首先分别为node节点添加标签
node/k8s-worker01 labeled[root@master ~]# kubectl label nodes k8s-worker2 nodeenv=test
node/k8s-worker02 labeled

创建一个pod-nodeselector.yaml

apiVersion: v1
kind: Pod
metadata:name: pod-nodeselectornamespace: dev
spec:containers:- name: nginximage: nginx:1.17.1nodeSelector: nodeenv: pro # 指定调度到具有nodeenv=pro标签的节点上

 

#创建Pod
[root@master ~]# kubectl create -f pod-nodeselector.yaml
pod/pod-nodeselector created#查看Pod调度到NODE属性,确实是调度到了node1节点上
[root@master ~]# kubectl get pods pod-nodeselector -n dev -o wide
NAME               READY   STATUS    RESTARTS   AGE     IP          NODE   ......
pod-nodeselector   1/1     Running   0          47s   100.119.84.73   k8s-worker01
......# 接下来,删除pod,修改nodeSelector的值为nodeenv: hhh(不存在打有此标签的节点)
[root@master ~]# kubectl delete -f pod-nodeselector.yaml
pod "pod-nodeselector" deleted
[root@master ~]# vim pod-nodeselector.yaml
[root@master ~]# kubectl create -f pod-nodeselector.yaml
pod/pod-nodeselector created#再次查看,发现pod无法正常运行,Node的值为none
[root@master ~]# kubectl get pods -n dev -o wide
NAME               READY   STATUS    RESTARTS   AGE     IP       NODE    
pod-nodeselector   0/1     Pending   0          2m20s   <none>   <none># 查看详情,发现node selector匹配失败的提示
[root@master ~]# kubectl describe pods pod-nodeselector -n dev
.......
Events:Type     Reason            Age        From               Message----     ------            ----       ----               -------Warning  FailedScheduling  <unknown>  default-scheduler  0/3 nodes are 
available: 3 node(s) didn't match node selector.Warning  FailedScheduling  <unknown>  default-scheduler  0/3 nodes are 
available: 3 node(s) didn't match node selector.

亲和性调度 

亲和性调度在NodeSelector的基础之上进行了扩展,可以通过配置的形式,实现优先选择满足条件的Node进行调度,如果没有,也可以调度到不满足条件的节点上,使调度更加灵活。
Affinity主要分为三类:

  • nodeAffinity(node亲和性): 以node为目标,解决pod可以调度到哪些node的问题
  • podAffinity(pod亲和性) : 以pod为目标,解决pod可以和哪些已存在的pod部署在同一个拓扑域中的问题
  • podAntiAffinity(pod反亲和性) : 以pod为目标,解决pod不能和哪些已存在pod部署在同一个拓扑域中的问题

NodeAffinity

pod.spec.affinity.nodeAffinityrequiredDuringSchedulingIgnoredDuringExecution Node节点必须满足指定的所有规则才可
以,相当于硬限制nodeSelectorTerms 节点选择列表matchFields   按节点字段列出的节点选择器要求列表matchExpressions   按节点标签列出的节点选择器要求列表(推荐)key   键values 值operator 关系符 支持Exists, DoesNotExist, In, NotIn, Gt, LtpreferredDuringSchedulingIgnoredDuringExecution 优先调度到满足指定的规则的Node,相当
于软限制 (倾向)preference   一个节点选择器项,与相应的权重相关联matchFields   按节点字段列出的节点选择器要求列表matchExpressions   按节点标签列出的节点选择器要求列表(推荐)key   键values 值operator 关系符 支持In, NotIn, Exists, DoesNotExist, Gt, Ltweight 倾向权重,在范围1-100。关系符的使用说明:
- matchExpressions:- key: nodeenv             # 匹配存在标签的key为nodeenv的节点operator: Exists- key: nodeenv             # 匹配标签的key为nodeenv,且value是"xxx"或"yyy"的节点operator: Invalues: ["xxx","yyy"]- key: nodeenv             # 匹配标签的key为nodeenv,且value大于"xxx"的节点operator: Gtvalues: "xxx"

示例:

创建pod-nodeaffinity-required.yaml

apiVersion: v1
kind: Pod
metadata:name: pod-nodeaffinity-requirednamespace: dev
spec:containers:- name: nginximage: nginx:1.17.1affinity:  #亲和性设置nodeAffinity: #设置node亲和性requiredDuringSchedulingIgnoredDuringExecution: # 硬限制nodeSelectorTerms:- matchExpressions: # 匹配env的值在["xxx","yyy"]中的标签- key: nodeenvoperator: Invalues: ["xxx","yyy"]
# 创建pod
[root@master ~]# kubectl create -f pod-nodeaffinity-required.yaml
pod/pod-nodeaffinity-required created
# 查看pod状态 (运行失败)
[root@master ~]# kubectl get pods pod-nodeaffinity-required -n dev -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP       NODE   ...... 
pod-nodeaffinity-required   0/1     Pending   0          16s   <none>   <none> ......
# 查看Pod的详情
# 发现调度失败,提示node选择失败
[root@master ~]# kubectl describe pod pod-nodeaffinity-required -n dev
......Warning  FailedScheduling  <unknown>  default-scheduler  0/3 nodes are 
available: 3 node(s) didn't match node selector.Warning  FailedScheduling  <unknown>  default-scheduler  0/3 nodes are 
available: 3 node(s) didn't match node selector.
#接下来,停止pod
[root@master ~]# kubectl delete -f pod-nodeaffinity-required.yaml
pod "pod-nodeaffinity-required" deleted
# 修改文件,将values: ["xxx","yyy"]------> ["pro","yyy"]
[root@master ~]# vim pod-nodeaffinity-required.yaml
# 再次启动
[root@master ~]# kubectl create -f pod-nodeaffinity-required.yaml
pod/pod-nodeaffinity-required created
# 此时查看,发现调度成功,已经将pod调度到了node1上
[root@master ~]# kubectl get pods pod-nodeaffinity-required -n dev -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP           NODE  ...... 
pod-nodeaffinity-required   1/1     Running   0          11s   10.244.1.89   
node1 ......

NodeAffinity规则设置的注意事项:

  •     1 如果同时定义了nodeSelector和nodeAffinity,那么必须两个条件都得到满足,Pod才能运行在指定的Node上
  •     2 如果nodeAffinity指定了多个nodeSelectorTerms,那么只需要其中一个能够匹配成功即可
  •     3 如果一个nodeSelectorTerms中有多个matchExpressions ,则一个节点必须满足所有的才能匹配成功
  •     4 如果一个pod所在的Node在Pod运行期间其标签发生了改变,不再符合该Pod的节点亲和性需求,则系统将忽略此变化

PodAffinity

首先来看一下 PodAffinity 的可配置项:

pod.spec.affinity.podAffinityrequiredDuringSchedulingIgnoredDuringExecution 硬限制namespaces       指定参照pod的namespacetopologyKey     指定调度作用域labelSelector   标签选择器matchExpressions 按节点标签列出的节点选择器要求列表(推荐)key   键values 值operator 关系符 支持In, NotIn, Exists, DoesNotExist.matchLabels   指多个matchExpressions映射的内容preferredDuringSchedulingIgnoredDuringExecution 软限制podAffinityTerm 选项namespaces      topologyKeylabelSelectormatchExpressions  key   键values 值operatormatchLabels weight 倾向权重,在范围1-100
topologyKey用于指定调度时作用域,例如:如果指定为kubernetes.io/hostname,那就是以Node节点为区分范围如果指定为beta.kubernetes.io/os,则以Node节点的操作系统类型来区分

创建一个参照Pod,pod-podaffinity-target.yaml

apiVersion: v1
kind: Pod
metadata:name: pod-podaffinity-targetnamespace: devlabels:podenv: pro #设置标签
spec:containers:- name: nginximage: nginx:1.17.1nodeName: node1 # 将目标pod名确指定到node1上
# 启动目标pod
[root@master ~]# kubectl create -f pod-podaffinity-target.yaml
pod/pod-podaffinity-target created
# 查看pod状况
[root@master ~]# kubectl get pods pod-podaffinity-target -n dev
NAME                     READY   STATUS    RESTARTS   AGE
pod-podaffinity-target   1/1     Running   0          4s

创建pod-podaffinity-required.yaml

apiVersion: v1
kind: Pod
metadata:name: pod-podaffinity-requirednamespace: dev
spec:containers:- name: nginximage: nginx:1.17.1affinity:  #亲和性设置podAffinity: #设置pod亲和性requiredDuringSchedulingIgnoredDuringExecution: # 硬限制- labelSelector:matchExpressions: # 匹配env的值在["xxx","yyy"]中的标签- key: podenvoperator: Invalues: ["xxx","yyy"]topologyKey: kubernetes.io/hostname

新Pod必须要与拥有标签nodeenv=xxx或者nodeenv=yyy的pod在同一Node 上,显然现在没有这样pod

# 启动pod
[root@master ~]# kubectl create -f pod-podaffinity-required.yaml
pod/pod-podaffinity-required created
# 查看pod状态,发现未运行
[root@master ~]# kubectl get pods pod-podaffinity-required -n dev
NAME                       READY   STATUS    RESTARTS   AGE
pod-podaffinity-required   0/1     Pending   0          9s
# 查看详细信息
[root@master ~]# kubectl describe pods pod-podaffinity-required -n dev
......
Events:Type     Reason            Age        From               Message----     ------            ----       ----               -------Warning  FailedScheduling  <unknown>  default-scheduler  0/3 nodes are 
available: 2 node(s) didn't match pod affinity rules, 1 node(s) had taints that 
the pod didn't tolerate.
# 接下来修改 values: ["xxx","yyy"]----->values:["pro","yyy"]
# 意思是:新Pod必须要与拥有标签nodeenv=xxx或者nodeenv=yyy的pod在同一Node上
[root@master ~]# vim pod-podaffinity-required.yaml
# 然后重新创建pod,查看效果
[root@master ~]# kubectl delete -f pod-podaffinity-required.yaml
pod "pod-podaffinity-required" deleted
[root@master ~]# kubectl create -f pod-podaffinity-required.yaml
pod/pod-podaffinity-required created
# 发现此时Pod运行正常
[root@master ~]# kubectl get pods pod-podaffinity-required -n dev
NAME                       READY   STATUS    RESTARTS   AGE   LABELS
pod-podaffinity-required   1/1     Running   0          6s    <none>

PodAntiAffinity

创建pod-podantiaffinity-required.yaml

apiVersion: v1
kind: Pod
metadata:name: pod-podantiaffinity-requirednamespace: dev
spec:containers:- name: nginximage: nginx:1.17.1affinity:  #亲和性设置podAntiAffinity: #设置pod亲和性requiredDuringSchedulingIgnoredDuringExecution: # 硬限制- labelSelector:matchExpressions: # 匹配podenv的值在["pro"]中的标签- key: podenvoperator: Invalues: ["pro"]topologyKey: kubernetes.io/hostname

新Pod必须要与拥有标签nodeenv=pro的pod不在同一Node上

# 创建pod
[root@master ~]# kubectl create -f pod-podantiaffinity-required.yaml
pod/pod-podantiaffinity-required created
# 查看pod
# 发现调度到了node2上
[root@master ~]# kubectl get pods pod-podantiaffinity-required -n dev -o wide
NAME                           READY   STATUS    RESTARTS   AGE   IP           NODE   .. 
pod-podantiaffinity-required   1/1     Running   0          30s   10.244.1.96   
node2  ..

污点和容忍

污点(Taints)


 前面的调度方式都是站在Pod的角度上,通过在Pod上添加属性,来确定Pod是否要调度到指定的
Node上,其实我们也可以站在Node的角度上,通过在Node上添加污点属性,来决定是否允许Pod调度过来。
 Node被设置上污点之后就和Pod之间存在了一种相斥的关系,进而拒绝Pod调度进来,甚至可以将已经存在的Pod驱逐出去。
污点的格式为: key=value:effect , key和value是污点的标签,effect描述污点的作用,支持如下三个选项:

  • PreferNoSchedule:kubernetes将尽量避免把Pod调度到具有该污点的Node上,除非没有其他节点可调度
  • NoSchedule:kubernetes将不会把Pod调度到具有该污点的Node上,但不会影响当前Node上已存在的Pod
  • NoExecute:kubernetes将不会把Pod调度到具有该污点的Node上,同时也会将Node上已存在的Pod驱离

# 设置污点
kubectl taint nodes node1 key=value:effect
# 去除污点
kubectl taint nodes node1 key:effect-
# 去除所有污点
kubectl taint nodes node1 key-

示例:

#首先要暂停节点2
[root@k8s-worker02 ~]# systemctl stop kubelet.service# 为node1设置污点(PreferNoSchedule)
[root@master ~]# kubectl taint nodes k8s-worker01 tag=openlab:PreferNoSchedule
# 创建pod1
[root@master ~]# kubectl run taint1 --image=nginx:1.17.1 -n dev
[root@master ~]# kubectl get pod -n dev -o wide
NAME            READY   STATUS    RESTARTS   AGE     IP           NODE taint1          1/1     Running      0     22s   100.119.84.74   k8s-worker01   # 为node1设置污点(取消PreferNoSchedule,设置NoSchedule)
[root@master ~]# kubectl taint nodes k8s-worker01 tag:PreferNoSchedule-
[root@master ~]# kubectl taint nodes k8s-worker01 tag=openlab:NoSchedule
# 创建pod2
[root@master ~]# kubectl run taint2 --image=nginx:1.17.1 -n dev
[root@master ~]# kubectl get pod taint2 -n dev -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP       NODE    
taint2   0/1     Pending   0          15s   <none>   <none> # 为node1设置污点(取消NoSchedule,设置NoExecute)
[root@master ~]# kubectl taint nodes k8s-worker01 tag:NoSchedule-
[root@master ~]# kubectl taint nodes k8s-worker01 tag=openlab:NoExecute# 创建pod3
[root@master ~]# kubectl run taint3 --image=nginx:1.17.1 -n dev
[root@master ~]# kubectl get pod taint3 -n dev -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP       NODE    
taint3   0/1     Pending   0          8s    <none>   <none>   

容忍(Toleration)

        上面介绍了污点的作用,我们可以在node上添加污点用于拒绝pod调度上来,但是如果就是想将一个 pod调度到一个有污点的node上去,这时候应该怎么做呢?这就要使用到容忍。

污点就是拒绝,容忍就是忽略,Node通过污点拒绝pod调度上去,Pod通过容忍忽略拒绝

由于已经在节点1上打上了 NoExecute 的污点,此时pod是调度不上去的,可以通过给pod添加容忍,然后将其调度上去

容忍的详细配置:

[root@master ~]# kubectl explain pod.spec.tolerations
......
FIELDS:key       # 对应着要容忍的污点的键,空意味着匹配所有的键value     # 对应着要容忍的污点的值operator  # key-value的运算符,支持Equal和Exists(默认)effect    # 对应污点的effect,空意味着匹配所有影响tolerationSeconds   # 容忍时间, 当effect为NoExecute时生效,表示pod在Node上的停留时间

示例:

创建pod-toleration.yaml

apiVersion: v1
kind: Pod
metadata:name: pod-tolerationnamespace: dev
spec:containers:- name: nginximage: nginx:1.17.1tolerations:      # 添加容忍- key: "tag"        # 要容忍的污点的keyoperator: "Equal" # 操作符value: "openlab"    # 容忍的污点的valueeffect: "NoExecute"   # 添加容忍的规则,这里必须和标记的污点规则相同
[root@master ~]# kubectl create -f pod-toleration.yaml
pod/pod-toleration created# 添加容忍之后的pod
[root@master ~]# kubectl get pod pod-toleration   -n dev -o wide
NAME             READY   STATUS    RESTARTS   AGE    IP              NODE           NOMINATED NODE   READINESS GATES
pod-toleration   1/1     Running   0          111s   100.119.84.77   k8s-worker01  

相关文章:

Pod的调度

在默认情况下&#xff0c;一个Pod在哪个Node节点上运行&#xff0c;是由Scheduler组件采用相应的算法计算出来的&#xff0c;这个过程是不受人工控制的。但是在实际使用中&#xff0c;这并不满足的需求&#xff0c;因为很多情况下&#xff0c;我们想控制某些Pod到达某些节点上&…...

LabVIEW面向对象编程设计方法

一、概述 面向对象编程&#xff08;OOP&#xff09;在软件开发中占据重要地位&#xff0c;尤其是在大规模软件项目中。它与小型程序开发思路不同&#xff0c;更注重未来功能的升级与扩展。在设计阶段&#xff0c;需思考如何构建既灵活又稳定的系统&#xff0c;这涉及众多设计方…...

Spring常见问题复习

############Spring############# Bean的生命周期是什么&#xff1f; BeanFactory和FactoryBean的区别&#xff1f; ApplicationContext和BeanFactory的区别&#xff1f; BeanFactoryAware注解&#xff0c;还有什么其它的Aware注解 BeanFactoryAware方法和Bean注解的方法执行顺…...

JJJ:generic netlink例程分析

接嵌入式毕设、课设辅导、技术咨询&#xff0c;欢迎私信 完整代码&#xff1a;github代码仓链接 若想要和指定的generic netlink family通信&#xff0c;如: 994 static struct genl_family genl_ctrl __ro_after_init { // generic netlink子协议995 .module THIS_MODU…...

Dify票据识别遇到的分支判断不准确问题

已测试这篇文章中 https://zhuanlan.zhihu.com/p/5465385787 使用多分支条件判断使用不同的大模型识别图片内容 发现了细节问题。在使用时若不注意&#xff0c;分支会出现走向不准的问题。 需要关注部分 下方红框处。1&#xff0c;2后不能跟点。否则会出问。除此之外&#xff0…...

《全栈+双客户端Turnkey方案》架构设计图

今天分享一些全栈双客户端Turnkey方案的架构与结构图。 1&#xff1a;三种分布式部署方案:网关方案&#xff0c;超级服务器单服方案&#xff0c;直连逻辑服方案 2: 单服多线程核心架构: 系统服务逻辑服服务 3: 系统服务的多线程池调度设计 4:LogicServer Update与ECS架构&…...

某碰瓷国赛美赛,号称第三赛事的数模竞赛

首先我非常不能理解的就是怎么好意思自称第三赛事的呢&#xff1f;下面我们进行一个简单讨论&#xff0c;当然这里不对国赛和美赛进行讨论。首先我们来明确一点&#xff0c;比赛的含金量由什么来定&#xff1f;这个可能大家的评价指标可能不唯一&#xff0c;我通过DeepSeek选取…...

【代码模板】如何用FILE操作符打开文件?fopen、fclose

#include "stdio.h" #include "unistd.h"int main(int argc, char *argv[]) {FILE *fp fopen("1.log", "wb");if (!fp) {perror("Failed open 1.log");return -1;}fclose(fp); }关于权限部分参考兄弟篇【代码模板】C语言中…...

【大模型深度学习】如何估算大模型需要的显存

一、模型参数量 参数量的单位 参数量指的是模型中所有权重和偏置的数量总和。在大模型中&#xff0c;参数量的单位通常以“百万”&#xff08;M&#xff09;或“亿”&#xff08;B&#xff0c;也常说十亿&#xff09;来表示。 百万&#xff08;M&#xff09;&#xff1a;表示…...

Mysql 数据库编程技术01

一、数据库基础 1.1 认识数据库 为什么学习数据库 瞬时数据&#xff1a;比如内存中的数据&#xff0c;是不能永久保存的。持久化数据&#xff1a;比如持久化至数据库中或者文档中&#xff0c;能够长久保存。 数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长…...

Class<?> 和Class<T >有什么区别

Class<?> 和 Class<T> 在 Java 中都表示 Class 类型的对象&#xff0c;但它们的使用方式和作用略有不同。让我们详细分析它们的区别&#xff1a; 1. Class<?>&#xff08;通配符 Class 类型&#xff09; ? 代表一个未知类型&#xff08;Wildcard&#xf…...

[自制调试工具]利用模板函数打造通用调试工具

引言 上一篇文章 我们介绍了调式类工具,这篇文章我们补充一下 点击这里查看 在软件开发的过程中&#xff0c;调试是必不可少的环节。为了能更高效地定位和解决问题&#xff0c;我们常常需要在代码中插入一些调试信息&#xff0c;来输出变量的值、函数的执行状态等。传统的调试…...

Python地理数据处理 28:基于Arcpy批量操作实现——按属性提取和分区统计

Arcpy批量操作 1. 批量按属性提取2. 批量分区统计&#xff08;最大值、最小值和像元个数等&#xff09; 1. 批量按属性提取 # -*- coding: cp936 -*- """ PROJECT_NAME: ArcPy FILE_NAME: batch_attribute_extract AUTHOR: JacksonZhao DATE: 2025/04/05 &qu…...

Mysql慢查询设置 和 建立索引

1 .mysql慢查询的设置 slow_query_log ON //或 slow_query_log_file /usr/local/mysql/data/slow.log long_query_time 2 修改后重启动mysql 1.1 查看设置后的参数 mysql> show variables like slow_query%; --------------------------------------------------…...

【Android】界面布局-相对布局RelativeLayout-例子

题目 完成下面相对布局&#xff0c;要求&#xff1a; 中间的button在整个屏幕的中央&#xff0c;其他的以它为基准排列。Hints&#xff1a;利用layout_toEndof,_toRightof,_toLeftof,_toStartof完成。 结果演示 代码实现 <?xml version"1.0" encoding"u…...

Spring Boot 中使用 Redis:从入门到实战

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…...

【ROS】 CMakeLists 文件详解

【ROS】 CMakeLists文件详解 前言标准的CMAKELIST.TXT文件的组成部分CMake 版本要求和项目名称指定编译器和设置构建规则查找 ROS 依赖消息和服务文件catkin_package设置头文件目录路径添加可执行文件的构建规则设置编译依赖关系&#xff08;构建顺序&#xff09;设置目标文件的…...

【每日算法】Day 17-1:位图(Bitmap)——十亿级数据去重与快速检索的终极方案(C++实现)

解锁海量数据处理的极致空间效率&#xff01;今日深入解析位图的核心原理与实战应用&#xff0c;从基础操作到分块优化&#xff0c;彻底掌握仅用1bit存储一个数据的压缩艺术。 一、位图核心思想 位图&#xff08;Bitmap&#xff09; 是一种通过比特位表示数据存在性的数据结构…...

7-1 素数求和(线性筛实现)

7-1 素数求和。 分数 10 中等 全屏浏览 切换布局 作者 魏英 单位 浙江科技大学 输入两个正整数m和n&#xff08;1<m<n<500&#xff09;统计并输出m和n之间的素数个数以及这些素数的和。 输入格式: 输入两个正整数m和n&#xff08;1<m<n<500&#xff0…...

NLP简介及其发展历史

自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&#xff09;是人工智能和计算机科学领域中的一个重要分支&#xff0c;致力于实现人与计算机之间自然、高效的语言交流。本文将介绍NLP的基本概念以及其发展历史。 一、什么是自然语言处理&#xff1f…...

ZKmall开源商城多云高可用架构方案:AWS/Azure/阿里云全栈实践

随着企业数字化转型的加速&#xff0c;云计算服务已成为IT战略中的核心部分。ZKmall开源商城作为一款高性能的开源商城系统&#xff0c;其在多云环境下的高可用架构方案备受关注。下面将结合AWS、Azure和阿里云三大主流云平台&#xff0c;探讨ZKmall的多云高可用架构全栈实践。…...

优化 Web 性能:处理非合成动画(Non-Composited Animations)

在 Web 开发中&#xff0c;动画能够增强用户体验&#xff0c;但低效的动画实现可能导致性能问题。Google 的 Lighthouse 工具在性能审计中特别关注“非合成动画”&#xff08;Non-Composited Animations&#xff09;&#xff0c;指出这些动画可能增加主线程负担&#xff0c;影响…...

Eliet Chat开发日志:信令服务器注册与通信过程

目录 1. 架构设计&#xff1a;信令服务器与客户端 2. 选择技术栈 3. 实现信令服务器 4. 客户端实现 5. 测试 6. 下一步计划 日期&#xff1a;2025年4月5日 今天的工作重点是实现两个设备通过信令服务器注册并请求对方公网地址信息&#xff0c;以便能够进行点对点通信。我…...

leetcode二叉树刷题调试不方便的解决办法

1. 二叉树不易构建 在leetcode中刷题时&#xff0c;如果没有会员就需要将代码拷贝到本地的编译器进行调试。但是leetcode中有一类题可谓是毒瘤&#xff0c;那就是二叉树的题。 要调试二叉树有关的题需要根据测试用例给出的前序遍历&#xff0c;自己构建一个二叉树&#xff0c;…...

颜色性格测试:探索你的内在性格色彩

颜色性格测试&#xff1a;探索你的内在性格色彩 在我们的日常生活中&#xff0c;颜色无处不在&#xff0c;而我们对颜色的偏好往往能反映出我们内在的性格特质。今天我要分享一个有趣的在线工具 —— 颜色性格测试&#xff0c;它能通过你最喜欢的颜色来分析你的性格倾向。 &…...

hashtable遍历的方法有哪些

在 Java 中&#xff0c;遍历 Hashtable&#xff08;或其现代替代品 HashMap&#xff09;有多种方式&#xff0c;以下是 6 种常用方法的详细说明和代码示例&#xff1a; 1. 使用 keySet() 增强 for 循环 Hashtable<String, Integer> table new Hashtable<>(); // …...

CMake学习--Window下VSCode 中 CMake C++ 代码调试操作方法

目录 一、背景知识二、使用方法&#xff08;一&#xff09;安装扩展&#xff08;二&#xff09;创建 CMake 项目&#xff08;三&#xff09;编写代码&#xff08;四&#xff09;配置 CMakeLists.txt&#xff08;五&#xff09;生成构建文件&#xff08;六&#xff09;开始调试 …...

浅谈ai - Activation Checkpointing - 时间换空间

前言 曾在游戏世界挥洒创意&#xff0c;也曾在前端和后端的浪潮间穿梭&#xff0c;如今&#xff0c;而立的我仰望AI的璀璨星空&#xff0c;心潮澎湃&#xff0c;步履不停&#xff01;愿你我皆乘风破浪&#xff0c;逐梦星辰&#xff01; Activation Checkpointing&#xff08;激…...

提高MCU的效率方法

要提高MCU(微控制器单元)的编程效率,需要从硬件特性、代码优化、算法选择、资源管理等多方面入手。以下是一些关键策略: 1. 硬件相关优化 时钟与频率: 根据需求选择合适的时钟源(内部/外部振荡器),避免过高的时钟频率导致功耗浪费。关闭未使用的外设时钟(如定时器、UA…...

5G从专家到小白

文章目录 第五代移动通信技术&#xff08;5G&#xff09;简介应用场景 数据传输率带宽频段频段 VS 带宽中低频&#xff08;6 GHz以下&#xff09;&#xff1a;覆盖范围广、穿透力强高频&#xff08;24 GHz以上&#xff09;&#xff1a;满足在热点区域提升容量的需求毫米波热点区…...