pod的requests、limits解读、LimitRange资源配额、Qos服务质量等级、资源配额管理 Resource Quotas
前言
环境:k8s-v1.22.17 docker-20.10.9 centos-7.9
目录
- 前言
- 什么是可计算资源
- CPU、Memory计量单位
- pod资源请求、限额方式
- pod定义requests、limits
- 查看节点资源情况
- pod使用request、limits示例
- LimitRange限制命名空间下的pod的资源配额
- Qos服务质量等级
- 资源配额管理 Resource Quotas
- 总结
什么是可计算资源
CPU、GPU、Memory等都是计算资源,所谓计算资源,就是可计量的、能被申请的、能被分配使用的资源。
CPU在容器技术中属于可压缩资源,因此,pod对CPU的使用超过其cpu.limit限制一般不会导致容器被系统"杀死",而Memory属于不可压缩资源,当容器使用的memory超过其memory.limit限制时,系统将可能会"杀掉"容器,这就是常见的OOM(out of memory)异常,如果该容器的重启策略是always,则kubelet将会重启该容器,因此评估好pod的memory.limit是一个重要的事情。
CPU、Memory计量单位
CPU:CPU的request和limits是通过cpu核数(cpus)来度量的,单位是m(milliunit),数量可以为整数或小数,如0.1m、50m,CPU的资源是绝对值而不是相对值,比如0.1CPU在单核或多核上是一样的,都严格等于0.1 CPU core。m,milliunit代表“千分之一核心”,譬如50m的含义是指50/1000核心,即5%
Memory:内存的计量单位是字节Byte,Byte是由8个位组成的一个单元,也就是1 Byte = 8 bit。pod的内存requests或limits都是使用整数加上国际单位制来表示内存值,国际单位制可以是
十进制的E、P、T、G、M、K、m或二进制的Ei、Pi、Gi、Mi、Ki。
常见的KiB和MiB是以二进制表示的字节单位,KB和MB是以十进制表示的字节单位。
十进制:1 KB = 1000 Byte = 8000 bit
二进制:1 KiB = 2的10次方 Byte = 1024 Byte = 8192 bit
Mi:1Mi = 1024乘1024,而平时使用的单为M是1M = 1000乘1000
memory:内存大小,可以使用Gi、Mi、G、M等单位
cpu的单位m:
注意:Gi和G,Mi和M优点区别,官网解释:Mi表示(1Mi=1024×1024),M表示(1M=1000×1000)(其它单位类推, 如Ki/K Gi/G)
pod资源请求、限额方式
在k8s中,全面限制一个应用及其中的pod所能占用的资源配额,具体可以使用下面三种方式:
1、定义每个pod的资源配额相关参数,如CPU/memory的request、limits;
2、自动为每个没有定义资源配额的pod添加资源配额模板(LimitRange);
3、从总量上限制一个租户(namespace)应用所能使用的资源配额(ResourceQuota)
pod的request、limits是指pod中所有容器的request、limits的总和,对于没有设置request、limits的容器,该值为0或者按照集群配置的默认值计算;
LimiteRang正是用于解决了没有设置配额参数的pod的默认资源配额问题;
REsourceQuota则约束租户的资源总量配额问题。
pod定义requests、limits
pod可以定义资源配额的相关参数:
spec.container[].resources.requests.cpu:容器初始要求的CPU数量
spec.container[].resources.limits.cpu:容器所能使用的最大CPU数量
spec.container[].resources.requests.memory:容器初始要求的内存数量
spec.container[].resources.limits.memory:容器所能使用的最大内存数量
默认情况下,pod中只写requests(cpu和memory写其中一个或两个都写)不写limits,则默认没有最大资源限制;
pod中只写limits.cpu、limits.memory,不写requests.cpu、requests.memory,默认的requests的cpu、memory其值等于对应的limits的cpu、memory值;
pod中只写limits的cpu或memory其中的一个,则requests对应的也等价于limits的对应的一个值。如只写limits.cpu,则requests.cpu值=limits.cpu值,limits.memory没写则requests.memory也没有值。
requests和limits背后的机制
如果容器运行时是docker,那么pod的requests和limits归根结底还是要转换为docker run启动容器的参数,对应如下:
spec.container[].resources.requests.cpu docker run --cpu-shares
spec.container[].resources.limits.cpu docker run --cpu-period
spec.container[].resources.requests.memory 无,请求内存只会作为调度器的参考,不会作为如何参数传递给docker run
spec.container[].resources.limits.memory docker run --memory
查看节点资源情况
kubectl describe node master01 :可以查看节点的计算资源总量和已分配量
pod使用request、limits示例
kubectl create ns nginx #创建命名空间
vim nginx-test.yaml #创建pod,pod包含2个容器
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-testnamespace: nginx-test
spec:
........spec:containers:- image: nginximagePullPolicy: IfNotPresentname: nginx-test-1resources: #定义资源请求、资源限制requests: #资源请求memory: "20Mi" #内存请求cpu: "30m" #CPU请求limits: #资源限制memory: "50Mi" #内存限制cpu: "50m" #CPU限制ports:- containerPort: 80name: nginx- image: tomcatimagePullPolicy: IfNotPresentname: tomcat-test-2resources: #定义资源请求、资源限制requests: #资源请求memory: "10Mi" #内存请求cpu: "20m" #CPU请求limits: #资源限制memory: "40Mi" #内存限制cpu: "40m" #CPU限制ports:- containerPort: 8080name: tomcat#查看pod占用的资源情况
[root@master ~]# kubectl describe node node2 | grep -C10 nginx-test-7d448999cb-mxq6sNamespace Name CPU Requests CPU Limits Memory Requests Memory Limits Age--------- ---- ------------ ---------- --------------- ------------- ----nginx-test nginx-test-7d448999cb-mxq6s 50m (1%) 90m (2%) 30Mi (1%) 90Mi (4%) 6m31s
可以看到,我们创建的pod一共请求50m的CPU,30Mi的内存,最大CPU限制为90m,最大内存限制为90Mi
LimitRange限制命名空间下的pod的资源配额
前面我们讨论了pod中可以手动定义requests.cpu、requests.memory、limits.cpu、limits.memory参数实现pod的资源请求和资源限制,但是当集群很大,存在很多pod中,对每个pod定义资源请求和资源限制显得很繁琐,所以出现了LimitRange机制。
一个 LimitRange(限制范围) 对象提供的限制能够做到:
1、在一个命名空间中实施对每个 Pod 或 Container 最小和最大的资源使用量的限制。
2、在一个命名空间中实施对每个 PersistentVolumeClaim 能申请的最小和最大的存储空间大小的限制。
3、在一个命名空间中实施对一种资源的申请值和限制值的比值的控制。
4、设置一个命名空间中对计算资源的默认申请/限制值,并且自动的在运行时注入到多个 Container 中。
limitrange属于命名空间,当在一个命名空间中创建了一个limitrange对象,将会在该命名空间中实施 LimitRange 限制。
LimitRange机制的原理:在某个命名空间下,创建一个limitrang资源对象,表示对该命名空间下创建的pod和容器的requests和limits配置进行限制,比如pod和容器的最大、最小、默认requests和limits值。
下面进行演示:
#创建一个命名空间
kubectl create ns limitrang-nginx #创建命名空间
#为命名空间创建一个limitrange
vim my-limits.yaml
apiVersion: v1
kind: LimitRange
metadata:name: my-limitsnamespace: limitrang-nginx
spec:limits: #定义了容器的request和limit的最大最小值,以及默认request、limit值- type: Pod #类型是pod,表示下面这段整对整个pod而言max: #pod的最大值cpu: "4" #pod的最大cpumemory: 2Gi #pod的最大内存min: #pod的最小值cpu: "200m" #pod的最小cpumemory: 6Mi #pod的最小内存maxLimitRequestRatio: #这个好像是pod的limits和requests的最大比例cpu: 3memory: 2- type: Container #类型是容器,表示下面这段整对pod里面的每一个容器而言default: #容器的默认限制值,注意这是默认limits值,当容器没有给定limits时将启动该值(下面说的default limit就是这个参数)cpu: 300m #容器的默认limits.cpumemory: 200Mi #容器的默认limits.memorydefaultRequest: #容器的默认请求值,当容器没有设置request时使用cpu: 100m #容器的默认requests.cpumemory: 100Mi #容器的默认requests.memorymax: #容器的最大值cpu: 2 #容器的最大cpu,即limits.cpumemory: 1Gi #容器的最大memory,即limits.memorymin: #容器的最小值cpu: 100m #容器的最小cpu,即requests.cpumemory: 3Mi #容器的最小memory,即requests.memorymaxLimitRequestRatio: #这个好像是容器的limits和requests的最大比例cpu: 5memory: 4参数说明:
在limitrange中,pod和container都可以设置CPU或内存的min、max、maxLimitRequestRatio参数,container还可以定义default request和
default limit参数,而pod不能设置default request和default limit参数。
对container参数解读如下:
container的min表示pod中所有容器的requests最小值;
container的max表示pod中所有容器的requests最大值;
container的defaultRequest是pod中所有未指定requests值的容器的的默认request值;
container的default是pod中所有未指定limits值的容器的默认limits值。(注意看了,default对应的是容器默认limits,不要被它的单词迷糊了)
maxLimitRequestRatio这个参数好像是容器的最大超卖比例。
四个参数关系:min<=defaultRequest<=default<=max对pod的参数解读如下:
pod的min表示pod中全部容器的requests总和最小值;
pod的max表示pod中全部容器的limits总和最大值;
maxLimitRequestRatio这个参数好像是pod的最大超卖比例。当一个pod没有定义requests或limits时,且该pod所属命名空间中存在limitrange,则系统将根据limitrange给pod默认设置对应的requests和
limits值;
当即没有limitrange时,参考上面小节《 pod定义requests、limits》讲的那样;
当有limitrange时,但是只给定了limits,没有给定requests值时,经验证,pod还是默认requests值与limits值相等,而不是设置为limitrange设定的defaultRequest值。
Qos服务质量等级
(暂时先忽略limitrange吧,因为Qos服务质量等级涉及pod中容器requests和limits)
在系统资源不足时,k8s会选择"杀掉"部分容器来释放资源,选择哪些pod进行杀掉呢,那么如何衡量一个pod的重要程度时,使用Qos服务质量等级衡量,k8s将容器划分为3个QoS等级,如下:
Guaranteed:完全可靠的,是指pod的所有容器都定义了requests和limits,并且每一个容器的requests和limits值都对应相等且不为0,我们指定,如果定义了limits没有定义requests,那么requests值就等于limits,这种pod的QoS等级就是Guaranteed。
Burstable:弹性波动,较可靠的,当pod的QoS等级既不是Guaranteed又不是BestEffect,那就是Burstable;
这分为2种情况:pod中一部分容器定义了requests和limits且requests值小于limits值;pod中一部分容器都未定义requests和limits。注意:这里说的是没有定义requests和limits,但是不代表这里limitrange不会默认设置,这里可以先暂时忽略limitrange吧。
BestEffect:尽力而为,不太可靠的,是指pod中所有容器都没有定义requests和limits,那么这种pod的QoS等级就是BestEffect。注意:这里说的是没有定义requests和limits,但是不代表这里limitrange不会默认设置,这里可以先暂时忽略limitrange吧。
Guaranteed > Burstable > BestEffect
资源配额管理 Resource Quotas
一个k8s集群可能被多个租户使用,如何分配不同租户可以使用的资源呢? Resource Quotas就是来解决这个问题的。
一般的,一个租户占用一个命名空间,则可以在该命名空间下创建 Resource Quotas来进行资源使用限制;
Resource Quotas可以限制命名空间中某种资源类型对象的总数上限,也可以限制命名空间中pod可使用的可计算资源(可计算资源:cpu、memory)的总上限;资源配额还支持作用域,对符合特定范围的对象加以限制。
官网:https://kubernetes.io/zh-cn/docs/concepts/policy/resource-quotas/
一个命名空间可以设定多个resourcequotas,resourcequotas在k8s中可以简写为quota。
#资源配额,对指定命名空间某种资源对象总数进行限制
[root@master ~]# vim resource-count.yaml
apiVersion: v1
kind: ResourceQuota
metadata:name: resource-countnamespace: limitrang-nginx #quota在哪个命名空间就表示对该命名空间进行限制
spec:hard: #目前支持对下面这些资源对象进行总数量限制configmaps: "50" #在该命名空间中允许存在的 ConfigMap 总数上限persistentvolumeclaims: "50" #在该命名空间中允许存在的 PVC 的总数上限pods: "4" #在该命名空间中允许存在的非终止状态的 Pod 总数上限replicationcontrollers: "35" #在该命名空间中允许存在的 ReplicationController 总数上限resourcequotas: "34" #在该命名空间中允许存在的 ResourceQuota 总数上限services: "68" #在该命名空间中允许存在的 Service 总数上限services.loadbalancers: "465" #在该命名空间中允许存在的 LoadBalancer 类型的 Service 总数上限services.nodeports: "65" #在该命名空间中允许存在的 NodePort 类型的 Service 总数上限secrets: "6" #在该命名空间中允许存在的 Secret 总数上限#测试,在limitrang-nginx命名空间中扩容副本数,单由于quota限制了pod副本数最大只能是4个,所以deployment扩容并不会成功
#扩容到10个副本
[root@master ~]# kubectl scale deployment -n limitrang-nginx nginx --replicas=10
[root@master ~]# kubectl describe deployments.apps nginx --namespace=limitrang-nginx | grep Replicas
Replicas: 10 desired | 4 updated | 4 total | 4 available | 6 unavailable#通过查看deployment对应的rs,我们看到rs的报错信息,正是由于quota限制命名空间pod副本数最大只能是4个才导致报错扩容不成功
[root@master ~]# kubectl -n limitrang-nginx describe rs nginx-6799fc88d8 | tail -n 1Warning FailedCreate 14m replicaset-controller Error creating: pods "nginx-6799fc88d8-tmjpt" is forbidden: exceeded quota: resource-count, requested: pods=1, used: pods=4, limited: pods=4
[root@master ~]#
#资源配额,对指定命名空间可计算资源资源总数进行限制
[root@master ~]# vim compute-resources.yaml
apiVersion: v1
kind: ResourceQuota
metadata:name: compute-resources
spec:hard:requests.cpu: "100" #所有非终止状态的 Pod,其 CPU 需求总量不能超过该值requests.memory: 100Gi #所有非终止状态的 Pod,其内存需求总量不能超过该值limits.cpu: "200" #所有非终止状态的 Pod,其 CPU 限额总量不能超过该值limits.memory: 200Gi #所有非终止状态的 Pod,其内存限额总量不能超过该值requests.nvidia.com/gpu: 4 #所有非终止状态的 Pod,GPU需求总量不能超过该值
# hugepages-<size>: xx #对于所有非终止状态的 Pod,针对指定尺寸的巨页请求总数不能超过此值
EOF#例子不举了
还可以对存储资源配额:
requests.storage: 所有PVC存储资源的需求总量不能超过该值
persistentvolumeclaims: 该命名空间中允许的PVC总数量
<storage-class-name>.storageclass.storage.k8s.io/requests.storage: 在所有与 <storage-class-name> 相关的持久卷申领中,存储请求的总和不能超过该值
<storage-class-name>.storageclass.storage.k8s.io/persistentvolumeclaims: 在与 storage-class-name 相关的所有持久卷申领中,命名空间中可以存在的持久卷申领总数
配额作用域
资源配额可以指定作用域,对符合特定范围的对象加以限制;
更详细可以看官网:https://kubernetes.io/zh-cn/docs/concepts/policy/resource-quotas/#quota-scopes
apiVersion: v1kind: ResourceQuotametadata:name: pods-lowspec:hard:cpu: "5"memory: 10Gipods: "10"scopeSelector: #指定了作用域选择器matchExpressions:- operator: InscopeName: PriorityClassvalues: ["low"]
总结
1、可计算资源
cpu、memory是k8s中最常见的可计算资源,cpu是可压缩资源,cpu可被超量使用,memory是不可压缩资源,超出内存最大值将发生OOM异常;
2、cpu的单位
cpu的是通过cpu核数(cpus)来度量的,单位是m(milliunit),数量可以为整数或小数,如0.1m、50m;单位m,因为含义是milliunit,代表"千分
之一核心",譬如50m的含义是指50/1000核心,即5%。
3、memory的单位
Memory:内存的计量单位是字节Byte,Byte是由8个位组成的一个单元,也就是1 Byte = 8 bit。pod的内存requests或limits都是使用整数加上国际
单位制来表示内存值,国际单位制可以是
十进制的E、P、T、G、M、K、m或二进制的Ei、Pi、Gi、Mi、Ki。
常见的KiB和MiB是以二进制表示的字节单位,KB和MB是以十进制表示的字节单位。
十进制:1 KB = 1000 Byte = 8000 bit
二进制:1 KiB = 2的10次方 Byte = 1024 Byte = 8192 bitMi:1Mi = 1024乘1024,而平时使用的单为M是1M = 1000乘1000memory:内存大小,可以使用Gi、Mi、G、M等单位
cpu的单位m:
注意:Gi和G,Mi和M优点区别,官网解释:Mi表示(1Mi=1024×1024),M表示(1M=1000×1000)(其它单位类推, 如Ki/K Gi/G)
4、pod定义requests、limits来进行容器的cpu、memory资源请求和限制
pod的request等于pod中所有容器的request相加之和。
pod的limit等于pod中所有容器的limits相加之和。pod可以定义资源配额的相关参数:
spec.container[].resources.requests.cpu:容器初始要求的CPU数量
spec.container[].resources.limits.cpu:容器所能使用的最大CPU数量
spec.container[].resources.requests.memory:容器初始要求的内存数量
spec.container[].resources.limits.memory:容器所能使用的最大内存数量默认情况下,pod中只写requests(cpu和memory写其中一个或两个都写)不写limits,则默认没有最大资源限制;
pod中只写limits.cpu、limits.memory,不写requests.cpu、requests.memory,默认的requests的cpu、memory其值等于对应的limits的cpu、
memory值;
pod中只写limits的cpu或memory其中的一个,则requests对应的也等价于limits的对应的一个值。如只写limits.cpu,则requests.cpu值
=limits.cpu值,limits.memory没写则requests.memory也没有值。
5、LimitRange限制命名空间下的pod的资源配额
limitrange属于命名空间,当在一个命名空间中创建了一个limitrange对象,将会在该命名空间中实施 LimitRange 限制。
LimitRange机制的原理:在某个命名空间下,创建一个limitrang资源对象,表示对该命名空间下创建的pod和容器的requests和limits配置进行限
制,比如pod和容器的最大、最小、默认requests和limits值。
spec:limits: #定义了容器的request和limit的最大最小值,以及默认request、limit值- type: Pod #类型是pod,表示下面这段整对整个pod而言max: #pod的最大值cpu: "4" #pod的最大cpumemory: 2Gi #pod的最大内存min: #pod的最小值cpu: "200m" #pod的最小cpumemory: 6Mi #pod的最小内存maxLimitRequestRatio: #这个好像是pod的limits和requests的最大比例cpu: 3memory: 2- type: Container #类型是容器,表示下面这段整对pod里面的每一个容器而言default: #容器的默认限制值,注意这是默认limits值,当容器没有给定limits时将启动该值(下面说的default limit就是这个参数)cpu: 300m #容器的默认limits.cpumemory: 200Mi #容器的默认limits.memorydefaultRequest: #容器的默认请求值,当容器没有设置request时使用cpu: 100m #容器的默认requests.cpumemory: 100Mi #容器的默认requests.memorymax: #容器的最大值cpu: 2 #容器的最大cpu,即limits.cpumemory: 1Gi #容器的最大memory,即limits.memorymin: #容器的最小值cpu: 100m #容器的最小cpu,即requests.cpumemory: 3Mi #容器的最小memory,即requests.memorymaxLimitRequestRatio: #这个好像是容器的limits和requests的最大比例cpu: 5memory: 4
6、pod的Qos服务质量等级
在k8s系统中,使用Qos服务质量等级来衡量一个pod的重要程度,当k8s集群资源不足时,如内存不足,那么Qos服务质量等级低的pod将会被优先"杀
掉"以是否系统资源压力, k8s将pod划分为3个QoS等级,如下:Guaranteed:完全可靠的,是指pod的所有容器都定义了requests和limits,并且每一个容器的requests和limits值都对应相等且不为0,我们指定,
如果定义了limits没有定义requests,那么requests值就等于limits,这种pod的QoS等级就是Guaranteed。Burstable:弹性波动,较可靠的,当pod的QoS等级既不是Guaranteed又不是BestEffect,那就是Burstable;
这分为2种情况:pod中一部分容器定义了requests和limits且requests值小于limits值;pod中一部分容器都未定义requests和limits。注意:这里
说的是没有定义requests和limits,但是不代表这里limitrange不会默认设置,这里可以先暂时忽略limitrange吧。BestEffect:尽力而为,不太可靠的,是指pod中所有容器都没有定义requests和limits,那么这种pod的QoS等级就是BestEffect。注意:这里说的
是没有定义requests和limits,但是不代表这里limitrange不会默认设置,这里可以先暂时忽略limitrange吧。Guaranteed > Burstable > BestEffect
7、资源配额管理 Resource Quotas
k8s集群是一个多租户的系统,可能有多个命名空间,一般的每个租户占用一个命名空间进行自己的应用部署,那么如何分配不同租户可以使用的资源呢? Resource Quotas就是来解决这个问题的。
一般的,一个租户占用一个命名空间,则可以在该命名空间下创建 Resource Quotas来进行资源使用限制;
Resource Quotas可以限制命名空间中某种资源类型对象的总数上限,也可以限制命名空间中pod可使用的可计算资源(可计算资源:cpu、memory)的总上限;资源配额还支持作用域,对符合特定范围的对象加以限制。
8、limitrange和resourcequotas的区别
limitrange主要是对一个命名空间下创建的pod和容器的requests和limits配置进行限制,比如pod和容器的最大、最小、默认requests和limits值等,换句话说,limitrange针对的是单个pod的可计算资源;
resourcequotas是对命名空间中某种资源对象总数进行限制,如A命名空间能创建多少个pod,能创建多少个configmap等;
resourcequotas还可以对指定命名空间的可计算资源总数进行限制,如限制A命名空间中全部非终止状态的pod的CPU和memory不能超过多少;
resourcequotas还可以对指定命名空间的存储资源总数进行限制,如限制A命名空间中的pvc数量不能超过100个等。
相关文章:
pod的requests、limits解读、LimitRange资源配额、Qos服务质量等级、资源配额管理 Resource Quotas
前言 环境:k8s-v1.22.17 docker-20.10.9 centos-7.9 目录前言什么是可计算资源CPU、Memory计量单位pod资源请求、限额方式pod定义requests、limits查看节点资源情况pod使用request、limits示例LimitRange限制命名空间下的pod的资源配额Qos服务质量等级资源配额管理…...
R语言基础(六):函数
R语言基础(一):注释、变量 R语言基础(二):常用函数 R语言基础(三):运算 R语言基础(四):数据类型 R语言基础(五):流程控制语句 7. 函数 函数是一组完成特定功能的语句。 7.1 内置函数 R语言系统中提供许多内置函数&…...
[C++] 简单序列化
前言 序列化(Serialization) 是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。 使用 序列化 std::array&…...
Autosar Configuration(十三)SomeIP之配置TCP/IP
本系列教程是根据实际项目开发中总结的经验所得,如发现有不对的地方,还请指正。 目录Autosar Configuration(一)Davinci Developer-工具介绍 Autosar Configuration(二)Davinci Developer-SWC配置 Autosar Configuration(三) Security之Crypto配置 Autosar Configurat…...

滤波算法 | 无迹卡尔曼滤波(UKF)算法及其Python实现
文章目录简介UKF滤波1. 概述和流程2. Python代码第一个版本a. KF滤波b. UKF滤波第二个版本简介 上一篇文章,我们介绍了UKF滤波公式及其MATLAB代码。在做视觉测量的过程中,基于OpenCV的开发包比较多,因此我们将UKF的MATLAB代码转到python中&a…...

IMU 积分的误差状态空间方程推导
文章目录0. 前言1. 离散时间的IMU运动学方程2. 状态变量定义3. 补充公式4. IMU误差状态空间方程推导4.1. 旋转误差 δr^i1\delta\hat{\mathbf{r}}_{i1}δr^i14.2. 速度误差 δv^i1\delta\hat{\mathbf{v}}_{i1}δv^i14.3. 平移误差 δpi1\delta \mathbf{p}_{i1}δpi14.4. …...

VirtualBox的克隆与复制
快照太多,想整合成1个文件怎么办? 最近,我就遇到一个问题。快照太多了。比较占用空间怎么办? 错误做法 一开始,我是这么操作的,选中某个快照,然后选择删除…然后我登录虚拟机后,发…...

每天5分钟玩转机器学习算法:逆向概率的问题是什么?贝叶斯公式是如何解决的?
本文重点 前面我们已经知道了贝叶斯公式,以及贝叶斯公式在机器学习中的应用,那么贝叶斯公式究竟解决了一个什么样的问题呢?贝叶斯是为了解决逆向概率的问题。 正向的概率和逆向的概率 正向概率:假设袋子里面有N个白球,有M个黑球,你伸手一摸,那么问题就是你摸出黑球的概…...
游戏闲聊之游戏是怎么赚钱的
其实一般情况下不太爱写这种文章,简单说就一点,这个行业的人我惹不起。 1、外挂 所谓外挂,是指通过技术手段,提供辅助游戏的工具,方便玩家获得一些额外的能力; 这事我特意咨询过律师,外挂分两…...

Redis高频面试题汇总(下)
目录 1.Redis中什么是Big Key(大key) 2.Big Key会导致什么问题 3.如何发现 bigkey? 4.为什么redis生产环境慎用keys *命令 5.如何处理大量 key 集中过期问题 6.使用批量操作减少网络传输 7.缓存穿透 8.缓存击穿 9.缓存雪崩 10.缓存污染(或满了…...

Windows修改Docker安装目录修改Docker镜像目录,镜像默认存储位置存放到其它盘
Windows安装Docker,默认是安装在C盘,下载镜像后会占用大量空间,这时需要调整镜像目录;场景:不想连服务器或者没有服务器,想在本地调试服务,该需求就非常重要。基于WSL2安装docker后,…...

376. 摆动序列——【Leetcode每日刷题】
376. 摆动序列 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如, [1, 7, 4, 9, 2, 5] 是一个…...

mgre实验
实验思路 1、首先根据拓扑结构合理分配IP地址,并对各个路由器的IP地址和R5环回接口的IP地址进行配置。 2、让私网中的边界路由器对ISP路由器做缺省路由。 3、根据实验要求,对需要配置不同类型认证的路由器进行认证配置,和需要不同封装的协议…...
一文彻底了解Zookeeper(介绍篇)
zookeeper 是什么? zookeeper是一个分布式协作框架,提供高可用,高性能,强一致等特性 zookeeper 有哪些应用场景? 分布式锁:分布式锁是指在分布式环境中,多个进程或线程需要互斥地访问某个共享…...

1. ELK Stack 理论篇之什么是ELK Stack?
ELK Stack 理论篇之什么是ELK Stack?1.1 什么是 ELK Stack?1.2 ELK Stack的发展史1.2.1 Elasticsearch1.2.2 引入 Logstash 和 Kibana,产品更强大1.2.3 社区越来越壮大,用例越来越丰富1.2.4 然后我们向 ELK 中加入了 Beats1.2.5 那么&#x…...

两道有关链表的练习
目录 一、分割链表 二、奇偶链表 一、分割链表 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1: 输…...

Python uiautomator2安卓自动化测试
一、前言 uiautomator2是Python对Android设备进行UI自动化的库,支持USB和WIFI链接,可以实现获取屏幕上任意一个APP的任意一个控件属性,并对其进行任意操作。 重点是它可以实现安卓自动化采集,甚至是群控采集,且安装和…...

Leetcode. 160相交链表
文章目录指针解法指针解法 核心思路 : 先 分别求两个链表的长度 然后长的链表先走 差距步(长-短) 最后长链表和短链表同时走 ,第一地址相同的就是交点 ,注意一定是地址相同 不可能出现上图这种情况 ,因为C1…...

MDPs —— 马尔可夫决策定义与算法
文章目录MDPs 定义——由实例开始时序决策问题给游戏增点乐子*为什么要有折扣游戏的解——原则所以,什么是 MDPs?MDPs 的基本原理、表示光环原理效用的求解是反向传播的原则不变条件MDPs 的表示MDPs 求解效用迭代法缺点原则迭代法MDPs 定义——由实例开始…...

【C++】图
本文包含了图的基本概念 1.相关概念 1.1 无/有向 无向图:每一个顶点之间的连线没有方向 有向图:连线有方向(类似离散数学的二元关系 <A,B>代表从A到B的边,有方向) <A,B>中A为始点,B为终点在…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...

前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...

解析“道作为序位生成器”的核心原理
解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制,重点解析"道作为序位生成器"的核心原理与实现框架: 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...
嵌入式面试常问问题
以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...