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为终点在…...
尾递归优化
文章目录1. 前言2. 什么尾调用(Tail Call)?3. 尾调用优化4. Linux内核下的尾递归优化使用5. 参考资料1. 前言 限于作者能力水平,本文可能存在谬误,对此给读者带来的损失,作者不错任何承诺。 2. 什么尾调用…...
P1120 小木棍(搜索+剪枝)
题目链接:P1120 小木棍 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 样例输入: 9 5 2 1 5 2 1 5 2 1 样例输出: 6 分析:这道题一看数据范围就知道是搜索,但关键是需要剪枝。 首先我们求出所有木棍的长度和&am…...
【专项训练】动态规划-3
动态规划:状态转移方程、找重复性和最优子结构 分治 + 记忆化搜索,可以过度到动态规划(动态递推) function DP():# DP状态定义# 需要经验,需把现实问题定义为一个数组,一维、二维、三维……dp =[][] # 二维情况for i = 0...M:...
【Linux】信号+再谈进程地址空间
目录 一、Linux中的信号 1、Linux中的信号 2、进程对信号的处理 3、信号的释义 二、信号的捕捉 1、信号的捕捉signal() 2、信号的捕捉sigaction() 三、信号如何产生? 1、kill()用户调用kill向操作系统发送信号 通过命令行参数模仿写一个kill命令 2、rais…...
C++回顾(二十一)—— list容器
21.1 list概述 list是一个双向链表容器,可高效地进行插入删除元素。list不可以随机存取元素,所以不支持at.(pos)函数与[]操作符。It(ok) it5(err)需要添加头文件:#include <list> 21.2 list构造 (1)默认构造…...
爱国者一体机电脑蓝屏怎么U盘重装系统教学?
爱国者一体机电脑蓝屏怎么U盘重装系统教学?有用户使用的爱国者一体机电脑开机了之后突然变成了蓝屏的了。而且无法继续使用了,那么遇到这样的蓝屏问题怎么去进行系统的重装呢?一起来看看以下的U盘重装系统教学吧。 准备工作: 1、U…...
Vue学习笔记(9)
9.1 axios 9.1.1 概述 Axios是一个流行的基于Promise的HTTP客户端,用于在浏览器和Node中发送HTTP请求。它可以用于处理各种请求类型,例如GET,POST等。Axios可以很容易地与现代前端框架和库集成,例如React,Vue等。 A…...
中值滤波+Matlab仿真+频域响应分析
中值滤波 文章目录中值滤波理解中值滤波的过程Matlab 实现实际应用频域分析中值滤波是一种滤波算法,其目的是去除信号中的噪声,而不会对信号本身造成太大的影响。它的原理非常简单:对于一个给定的窗口大小,将窗口内的数值排序&…...
自然语言处理中数据增强(Data Augmentation)技术最全盘点
与“计算机视觉”中使用图像数据增强的标准做法不同,在NLP中,文本数据的增强非常少见。这是因为对图像的琐碎操作(例如将图像旋转几度或将其转换为灰度)不会改变其语义。语义上不变的转换的存在是使增强成为Computer Vision研究中…...
PINN解偏微分方程实例1
PINN解偏微分方程实例11. PINN简介2. 偏微分方程实例3. 基于pytorch实现代码4. 数值解参考资料1. PINN简介 PINN是一种利用神经网络求解偏微分方程的方法,其计算流程图如下图所示,这里以偏微分方程(1)为例。 ∂u∂tu∂u∂xv∂2u∂x2\begin{align} \frac{…...
温州手机网站开发/狠抓措施落实
在开发中,经常会碰到为a标签绑定单击事件,由于a标签默认有跳转的行为,所以会影响到我们的onclick事件的处理代码。 我们需要屏蔽掉他的默认行为,下面是一些常用的方式。 <!DOCTYPE html> <html lang"en"> &…...
苏州seo网络推广/网站优化提升排名
上节课我们一起学习了Hadoop集群测试,这节课我们一起学习一下Sqoop,Sqoop是专门用来迁移数据的,它可以把数据库中的数据迁移到HDFS文件系统,当然也可以从HDFS文件系统导回到数据库。 我来说一下Sqoop的使用场景,假如你…...
企业门户网站费用/武汉seo公司排名
Mojo C 绑定 API 官方文档:https://chromium.googlesource.com/chromium/src.git//refs/heads/main/mojo/README.md 本文档是Mojo 文档的子集。 概述 Mojo C 绑定 API 利用C 系统 API提供一组更自然的原语,用于通过 Mojo 消息管道进行通信。结合从Mojom IDL 和绑…...
wordpress网站模板下载失败/学会计哪个培训机构比较正规
Package.json小结 生成package.json定位到想放置package.json的目录,运行npm init,根据提示就可以生成package.json文件,其中test command可以为空。 安装module时,用npm i <modulename> --save就可以在安装module的同时,在…...
湖南做网站公司/安卓优化大师破解版
一、String对象的存储请看这样两个语句:String x "abc";String y new String("abcd");现在来分析一下内存的分配情况。如图:可以看出,x与y存在栈中,它们保存了相应对象的引用。第一条语句没有在堆中分配内存…...
滨江区做网站公司/网站seo搜索
刚刚接触swift以及ios,不是很理解有的逻辑,导致某些问题。这里分享一下swift自定义uicollectionviewcell 首先我的viewcontroller不是直接继承uicollectionviewcontroller,而是添加的uicollectionview到我的storyboard, 然后再新建…...