k8s进阶3——资源配额、资源限制

news2024/12/22 19:58:26

文章目录

  • 一、基本了解
    • 1.1 资源计算
    • 1.2 调度机制
    • 1.3 服务质量等级
  • 二、资源配额 ResourceQuota
    • 2.1 支持的限制资源
    • 2.2 配额作用域
    • 2.3 资源配额选型
      • 2.3.1 计算资源配额
      • 2.3.2 存储资源配额
      • 2.3.3 对象数量配额
  • 三、资源限制 LimitRange
    • 3.1 限制资源大小值
    • 3.2 设置限制默认值
    • 3.3 限制存储大小值

一、基本了解

为什么会有资源配额管理?

  • 可以提高集群稳定性,确保指定的资源对象在任何时候都不会超量占用系统物理资源,避免业务进程在设计或实现上的缺陷导致整个系统运行紊乱甚至意外宕机。

资源配额管理维度:

  1. 容器级别,定义每个Pod上资源配额相关的参数,比如CPU/Memory、Request/Limit;
  2. Pod级别,自动为每个没有定义资源配额的Pod添加资源配额模板,比如LimitRanger。
  3. Namespace级别,从总量上限制一个租户(应用)所能使用的资源配额,比如ResourceQuota,包括资源有:Pod数量、Replication Controller数量、Service数量、ResourceQuota数量、Secret数量和可持有的PV数量。

资源配额参数:

  • 程序所使用的CPU与Memory是一个动态的量,跟负载密切相关,当负载增加时,CPU和Memory的使用量也会增加。
  • spec.container[].resources.requests.cpu:容器初始要求的CPU数量。
  • spec.container[].resources.limits.cpu:容器所能使用的最大CPU数量。
  • spec.container[].resources.requests.memory:容器初始要求的内存数量
  • spec.container[].resources.limits.memory:容器所能使用的最大内存数量。

1.1 资源计算

  • Pod的Requests或Limits指该Pod中所有容器的Requests或Limits的总和,若Pod中没有设置Requests或Limits的容器,则该项的值被当作0或者按照集群配置的默认值来计算。

计算CPU:

  • CPU的Requests和Limits是通过CPU数(cpus)来度量的。
  • CPU的资源值是绝对值,而不是相对值,比如0.1CPU在单核或多核机器上是一样的,都严格等于0.1 CPU core。

计算Memory:

  • 内存的Requests和Limits计量单位是字节数。使用整数或者定点整数加上国际单位制来表示内存值。
  • 国际单位制包括十进制的E、P、T、G、M、K、m,或二进制的Ei、Pi、Ti、Gi、Mi、Ki。
  • KiB与MiB是以二进制表示的字节单位,常见的KB与MB则是以十进制表示的字节单位,比如:
    • 1 KB=1000 Bytes=8000 Bits;
    • 1 KiB=2^10 Bytes=1024 Bytes=8192 Bits。

注意事项:

  • 计算资源单位大小写敏感,m表示千分之一单位,M表示十进制的1000,二者的含义不同。

1.2 调度机制

基于Requests和Limits的Pod调度机制:

  • 调度器在调度时,首先要确保调度后该节点上所有Pod的CPU和内存的Requests总和,不超过该节点能提供给Pod使用的CPU和Memory的最大容量值。
  • 例如,某个节点上的CPU资源充足,而内存为4GB,其中3GB可以运行Pod,而某Pod的Memory Requests为1GB、Limits为2GB,那么在这个节点上最多可以运行3个这样的Pod。

Requests和Limits的背后机制:

  • kubelet在启动Pod的某个容器时,会将容器的Requests和Limits值转化为相应的容器启动参数传递给容器执行器(Docker或者rkt)。
  • 若容器的执行环境是Docker,那么容器的4个参数传递给Docker的过程如下:
    1. spec.container[].resources.requests.cpu:参数值会被转化为core数(比如配置的100m会转化为0.1),然后乘以1024,再将这个结果作为–cpu-shares参数的值传递给docker run命令。
    2. spec.container[].resources.limits.cpu:参数值会被转化为millicore数(比如配置的1被转化为1000,配置的100m被转化为100),将此值乘以100000,再除以1000,然后将结果值作为–cpu-quota参数的值传递给docker run命令。
    3. spec.container[].resources.requests.memory:参数值只提供给Kubernetes调度器作为调度和管理的依据,不会作为任何参数传递给Docker。
    4. spec.container[].resources.limits.memory:参数值会被转化为单位为Bytes的整数,值作为–memory参数传递给docker run命令。

常见问题分析:

  1. 若Pod状态为Pending,错误信息为FailedScheduling。若调度器在集群中找不到合适的节点来运行Pod,那么这个Pod会一直处于未调度状态,直到调度器找到合适的节点为止。每次调度器尝试调度失败时,Kubernetes都会产生一个事件。
  2. 容器被强行终止(Terminated)。如果容器使用的资源超过了它配置的Limits,那么该容器可能被强制终止。我们可以通过kubectl describe pod命令来确认容器是否因为这个原因被终止

1.3 服务质量等级

Pod的三种QoS级别:

  1. Guaranteed(完全可靠的):如果Pod中的所有容器对所有资源类型都定义了Limits和Requests,并且所有容器的Limits值都和Requests值相等(且都不为0),那么该Pod的QoS级别就是Guaranteed。
    • 未定义Requests值,所以其默认等于Limits值。
    • 其中定义的Requests与Limits的值完全相同。
  2. BestEffort(尽力而为、不太可靠的):如果Pod中所有容器都未定义资源配置(Requests和Limits都未定义),那么该Pod的QoS级别就是BestEffort。
  3. Burstable(弹性波动、较可靠的):当一个Pod既不为Guaranteed级别,也不为BestEffort级别时,该Pod的QoS级别就是Burstable。
    • Pod中的一部分容器在一种或多种资源类型的资源配置中定义了Requests值和Limits值(都不为0),且Requests值小于Limits值。
    • Pod中的一部分容器未定义资源配置(Requests和Limits都未定义)。

工作特点:

  1. BestEffort Pod的优先级最低,在这类Pod中运行的进程会在系统内存紧缺时被第一优先“杀掉”。当然,从另一个角度来看,BestEffortPod由于没有设置资源Limits,所以在资源充足时,它们可以充分使用所有闲置资源。
  2. Burstable Pod的优先级居中,这类Pod在初始时会被分配较少的可靠资源,但可以按需申请更多的资源。当然,如果整个系统内存紧缺,又没有BestEffort容器可以被杀掉以释放资源,那么这类Pod中的进程可能被“杀掉”。
  3. Guaranteed Pod的优先级最高,而且一般情况下这类Pod只要不超过其资源Limits的限制就不会被“杀掉”。当然,如果整个系统内存紧缺,又没有其他更低优先级的容器可以被“杀掉”以释放资源,那么这类Pod中的进程也可能会被“杀掉”。

二、资源配额 ResourceQuota

为何会有资源配额?

  • 当多个团队、多个用户共享使用K8s集群时,会出现不均匀资源使用,默认情况下先到先得,这时可以通过ResourceQuota来对命名空间资源使用总量做限制,从而解决这个问题。

使用流程:

  • k8s管理员为每个命名空间创建一个或多个ResourceQuota对象,定义资源使用总量,K8s会跟踪命名空间资源使用情况,当超过定义的资源配额会返回拒绝。

注意事项:

  • 如果在集群中新添加了节点,资源配额不会自动更新,该资源配额所对应的命名空间中的对象也不能自动增加资源上限。

2.1 支持的限制资源

资源限制对象:

  1. 容器资源请求值(requests):命名空间下的所有pod申请资源时设置的requests总和不能超过这个值。
    • resources.requests.cpu
    • resources.requests.memory
  2. 容器资源限制值(limits):命名空间下的所有pod申请资源时设置的limits总和不能超过这个值。
    • resources.limits.cpu
    • resources.limits.memory

注意事项:

  1. CPU单位:可以写m也可以写浮点数,例如0.5=500m,1=1000m
  2. requests必须小于limits,建议一个理论值:requests值小于limits的20%-30%,一般是limits的70%。
  3. limits尽量不要超过所分配宿主机物理配置的80%,否则没有限制意义
  4. requests只是一个预留性质,并非实际的占用,用于k8s合理的分配资源(每个节点都有可分配的资源,k8s抽象的将这些节点资源统一分配)。比如requests分配1核1G,在满足的节点上创建完容器后实际资源可能只有0.5C1G。
  5. requests会影响pod调度,k8s只能将pod分配到能满足该requests值的节点上。
  6. ResourceQuota功能是一个准入控制插件,默认已经启用。
支持的资源描述
limits.cpu/memory所有Pod上限资源配置总量不超过该值(所有非终止状态的Pod)
requests.cpu/memory所有Pod请求资源配置总量不超过该值(所有非终止状态的Pod)
cpu/memory等同于requests.cpu/requests.memory
requests.storage所有PVC请求容量总和不超过该值
persistentvolumeclaims所有PVC数量总和不超过该值
< storage-class-name >.
storageclass.storage.k8s.io/requests.storage
所有与< storage-class-name >相关的PVC请求容量总和不超过该值
< storage-class-name >.
storageclass.storage.k8s.io/persistentvolumeclaims
所有与< storage-class-name >相关的PVC数量总和不超过该值
pods、count/deployments.apps、count/statfulsets.apps、count/services
(services.loadbalancers、services.nodeports)、count/secrets、count/configmaps、count/job.batch、count/cronjobs.batch
创建资源数量不超过该值

2.2 配额作用域

  • 每个配额都有一组相关的 scope(作用域),配额只会对作用域内的资源生效。 配额机制仅统计所列举的作用域的交集中的资源用量。
  • 当一个作用域被添加到配额中后,它会对作用域相关的资源数量作限制。 如配额中指定了允许(作用域)集合之外的资源,会导致验证错误。
  • scopeSelector 支持在 operator 字段中使用以下值:
    • In
    • NotIn
    • Exists
    • DoesNotExist
作用域描述限制追踪资源
Terminating匹配所有 spec.activeDeadlineSeconds 不小于 0 的 Pod。pods、cpu、memory、requests.cpu、requests.memory、limits.cpu、limits.memory
NotTerminating匹配所有 spec.activeDeadlineSeconds 是 nil 的 Pod。pods、cpu、memory、requests.cpu、requests.memory、limits.cpu、limits.memory
BestEffort匹配所有 Qos 是 BestEffort 的 Pod。pods
NotBestEffort匹配所有 Qos 不是 BestEffort 的 Pod。pods、cpu、memory、requests.cpu、requests.memory、limits.cpu、limits.memory
PriorityClass匹配所有引用了所指定的优先级类的 Pods。pods、cpu、memory、requests.cpu、requests.memory、limits.cpu、limits.memory
CrossNamespacePodAffinity匹配那些设置了跨名字空间 (反)亲和性条件的 Pod。

注意事项:

  • 不能在同一个配额对象中同时设置 Terminating 和 NotTerminating 作用域。
  • 不能在同一个配额中同时设置 BestEffort 和 NotBestEffort 作用域。
  • 定义 scopeSelector 时,如果使用以下值之一作为 scopeName 的值,则对应的 operator 只能是 Exists:
    • Terminating
    • NotTerminating
    • BestEffort
    • NotBestEffort

2.3 资源配额选型

2.3.1 计算资源配额

  • 用户可以对给定命名空间下的可被请求的 计算资源 总量进行限制。
资源名称描述
limits.cpu所有非终止状态的 Pod,其 CPU 限额总量不能超过该值。
limits.memory所有非终止状态的 Pod,其内存限额总量不能超过该值。
requests.cpu所有非终止状态的 Pod,其 CPU 需求总量不能超过该值。
requests.memory所有非终止状态的 Pod,其内存需求总量不能超过该值。
hugepages-< size>对于所有非终止状态的 Pod,针对指定尺寸的巨页请求总数不能超过此值。
cpu与 requests.cpu 相同。
memory与 requests.memory 相同

示例:

apiVersion: v1
kind: ResourceQuota
metadata:
 name: compute-resources
 namespace: test        ##作用在哪个命名空间,对该命名空间的pod资源进行限制。
spec:
 hard:
   requests.cpu: "4"        ##test命名空间下的所有pod的cpu资源最小请求值不能超过4核。
   requests.memory: 10Gi    ##test命名空间下的所有pod的内存资源最小请求值不能超过10G。
   limits.cpu: "6"          ##test命名空间下的所有pod内的应用cpu资源最大限制值不能超过6核。
   limits.memory: 12Gi      ##test命名空间下的所有pod内的应用内存资源最大限制值不能超过12G。

1.创建一个计算资源配额qingjun,限制test命名空间的pod,最小请求cpu为2核,最小请求内存大小为2G;容器最大使用资源不能超过cpu 6核、内存10G。

[root@k8s-master1 ResourceQuota]# cat rq1.yaml 
apiVersion: v1
kind: ResourceQuota
metadata:
  name: qingjun
  namespace: test
spec:
  hard:
    requests.cpu: 2
    requests.memory: 2Gi
    limits.cpu: 6
    limits.memory: 10Gi

[root@k8s-master1 ResourceQuota]# kubectl  apply -f rq1.yaml 

2.查看创建的resourcequota。
在这里插入图片描述
3.创建pod资源,查看效果。此时所创建的3个pod要求资源是满足的,所以创建成功。

[root@k8s-master1 ResourceQuota]# cat deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: 
          requests:
            cpu: 0.2
            memory: 200Mi
          limits:
            cpu: 1
            memory: 1Gi

[root@k8s-master1 ResourceQuota]# kubectl  apply -f deploy.yaml 

在这里插入图片描述
4.给这组pod扩容到10个,发现最终只能扩容到6个,因为每个pod上限配置为cpu 1核、内存 1G,而限制的资源计数配额上限配置为6核,超过的部分不会被创建。

[root@k8s-master1 ResourceQuota]# kubectl  scale deploy nginx --replicas=10 -n test

在这里插入图片描述
5.查看创建失败原因。

[root@k8s-master1 ResourceQuota]# kubectl  describe rs -n test

在这里插入图片描述

在这里插入图片描述

2.3.2 存储资源配额

  • 用户可以对给定命名空间下的存储资源 总量进行限制。
资源名称说明
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 相关的所有持久卷申领中,命名空间中可以存在的持久卷申领总数。

示例:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: storage-resources
  namespace: test
spec:
  hard:
    requests.storage: "10G"     ##限制pvc能使用的最大内存。
    managed-nfs-storage.storageclass.storage.k8s.io/requests.storage: "5G"

1.创建资源配额baimu。

[root@k8s-master1 ResourceQuota]# cat rq2.yaml 
apiVersion: v1
kind: ResourceQuota
metadata:
  name: baimu
  namespace: test
spec:
  hard:
    requests.storage: "10G"

[root@k8s-master1 ResourceQuota]# kubectl  apply -f  rq2.yaml 

在这里插入图片描述
2.创建pvc测试效果,先创建指定内存为8G,小于限制大小,可以创建成功。

[root@k8s-master1 ResourceQuota]# cat pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
  namespace: test
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi

[root@k8s-master1 ResourceQuota]# kubectl  apply -f pvc.yaml

在这里插入图片描述
3.再创建第二个pvc,同样申请8G,此时会创建失败,原因是先前创建的pvc已经占用了8G,而这次创建要求的8G已经超过了限制大小的10G。
在这里插入图片描述

2.3.3 对象数量配额

  • 你可以使用以下语法对所有标准的、命名空间域的资源类型进行配额设置。
  • count/< resource >.< group >:用于非核心(core)组的资源。
  • count/< resource >:用于核心组的资源
资源名称描述
configmaps在该命名空间中允许存在的 ConfigMap 总数上限。
persistentvolumeclaims在该命名空间中允许存在的 PVC 的总数上限。
pods在该命名空间中允许存在的非终止状态的 Pod 总数上限。Pod 终止状态等价于 Pod 的 .status.phase in (Failed, Succeeded) 为真。
replicationcontrollers在该命名空间中允许存在的 ReplicationController 总数上限。
resourcequotas在该命名空间中允许存在的 ResourceQuota 总数上限。
services在该命名空间中允许存在的 Service 总数上限。
services.loadbalancers在该命名空间中允许存在的 LoadBalancer 类型的 Service 总数上限。
services.nodeports在该命名空间中允许存在的 NodePort 类型的 Service 总数上限。
secrets在该命名空间中允许存在的 Secret 总数上限。

示例:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: object-counts
  namespace: test
spec:
  hard:
    pods: "10"            ##最多可以创建pod数量。
    count/deployments.apps: "3"          ##最多可以创建deploy数量。
    count/services: "3"                  ##最多可以创建svc数量。

1.创建资源配额wuhan1。

[root@k8s-master1 ResourceQuota]# cat rq3.yaml 
apiVersion: v1
kind: ResourceQuota
metadata:
  name: wuhan
  namespace: test
spec:
  hard:
    pods: "10"                       ##最多可以创建pod数量。
    count/deployments.apps: "3"      ##最多可以创建deploy数量。
    count/services: "3"              ##最多可以创建svc数量。

[root@k8s-master1 ResourceQuota]# kubectl  apply -f rq3.yaml 

在这里插入图片描述
2.创建一个deploy,其pod副本有3个,满足限制要求,创建成功。
在这里插入图片描述
3.创建第二个、第三个deploy资源都可以,创建第四个deploy失败,原因时超过了限制要求。
在这里插入图片描述

三、资源限制 LimitRange

基本了解:

  • 默认情况下,K8s集群上的容器对计算资源没有任何限制,可能会导致个别容器资源过大导致影响其他容器正常工
    作,这时可以使用LimitRange定义容器默认CPU和内存请求值或者最大上限。
  • 也存在员工在设置ResourceQuota时,过大或过小,甚至忘记设置。那么limirange就可以设置个默认值,即时忘记没有设置限制值时,也可给你设置个默认限制值;也可以限制员工在设置限制值时要合理,不能超过limitrange的最小值,也不能低于limitrange的最小值。

LimitRange限制维度:

  1. 限制容器配置requests.cpu/memory,limits.cpu/memory的最小、最大值。
  2. 限制容器配置requests.cpu/memory,limits.cpu/memory的默认值。
  3. 限制PVC配置requests.storage的最小、最大值。

注意事项:
在这里插入图片描述

3.1 限制资源大小值

1.创建一个LimitRange。

[root@k8s-master1 ResourceQuota]# cat lr1.yaml 
apiVersion: v1
kind: LimitRange
metadata:
  name: qingjun
  namespace: test        ##策略作用哪个命名空间。
spec:
  limits:
  - max:                 ##容器能设置limit的最大值。
      cpu: 1
      memory: 1Gi
    min:                 ##容器能设置request的最小值。
      cpu: 200m 
      memory: 200Mi
    type: Container    ##限制对象。

[root@k8s-master1 ResourceQuota]# kubectl  apply -f lr1.yaml 

在这里插入图片描述
2.创建资源测试。创建的pod申请最大cpu资源超过设置值,会创建失败,限制成功。

[root@k8s-master1 ResourceQuota]# kubectl  describe rs -n test 

在这里插入图片描述

3.创建的pod申请最小cpu资源低于设置值,会创建失败,限制成功。
在这里插入图片描述

3.2 设置限制默认值

基本了解:

  • 这个资源默认值,是在限制资源大小值时就会默认创建,根据max最大值创建。
  • 当默认值不合理时,需要我们手动去设置。
  • Containers可以设置限制默认值,Pod不能设置Default Request和Default Limit参数。
    在这里插入图片描述

1.可以直接在限制大小的基础上设置限制默认值。

[root@k8s-master1 ResourceQuota]# cat lr1.yaml 
apiVersion: v1
kind: LimitRange
metadata:
  name: qingjun
  namespace: test
spec:
  limits:
  - max:               ##限制最大值。
      cpu: 2            
      memory: 5Gi
    min:               ##限制最小值。
      cpu: 0.5 
      memory: 1Gi
    type: Container
    default:              ##限制默认最大值。
      cpu: 1
      memory: 3Gi
    defaultRequest:       ##限制默认最小值。
      cpu: 0.5
      memory: 1Gi

[root@k8s-master1 ResourceQuota]# kubectl  apply  -f lr1.yaml 

2.查看。
在这里插入图片描述
3.创建pod时不设置资源申请大小时,可以看到会默认设置成默认值。

##创建。
[root@k8s-master1 ResourceQuota]# kubectl  run nginx1 --image=nginx -n test

##查看。
[root@k8s-master1 ResourceQuota]# kubectl  describe  pod nginx1 -n test

在这里插入图片描述

3.3 限制存储大小值

1.创建限制策略。

[root@k8s-master1 ResourceQuota]# cat lr2.yaml 
apiVersion: v1
kind: LimitRange
metadata:
  name: baimu1
  namespace: test
spec:
  limits:
  - type: PersistentVolumeClaim
    max:
      storage: 10Gi
    min:
      storage: 1Gi

[root@k8s-master1 ResourceQuota]# kubectl  apply -f lr2.yaml 

在这里插入图片描述
2.测试效果。生成一个pvc,申请资源为15G,超过了设置的限制最大值,创建失败,测试成功。

在这里插入图片描述
3.创建pvc的申请资源改成8G后,符合设置的限制区间值,创建成功,测试通过。
在这里插入图片描述

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

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

相关文章

buu [NPUCTF2020]共 模 攻 击 1

题目描述: task: hint: 题目分析&#xff1a; 先看hint(提示)这一部分&#xff0c;标题已经提示了是共模攻击&#xff0c;看到有e1,e2,c1,c2,n也可以想到是共模攻击&#xff0c;之后得到c&#xff0c;继续往下做 此时有点不知如何下手&#xff0c;e 256 并且 gcd(e // 4,p…

接口测试工具Postman接口测试图文教程(超详细)

目录 一、前言 二、Postman安装和使用 三、请求方式 四、资金记录接口实例演示 一、前言 在前后端分离开发时&#xff0c;后端工作人员完成系统接口开发后&#xff0c;需要与前端人员对接&#xff0c;测试调试接口&#xff0c;验证接口的正确性可用性。而这要求前端开发进度…

games103——作业4

实验四主要使用 Shallow Wave 模拟流体 完整项目已上传至github。 文章目录 Height Feild(高度场)更新高度场更新速度场 Shallow Wave EquationDiscretization(离散化)一阶导数二阶导数 Discretized Shallow Wave EquationSolution 1Solution 2Pressure(压强)Viscosity(粘滞) 算…

​性能测试基础——性能测试方案

前面所说的测试分析等准备工作实际上最终目的是制定测试方案&#xff0c;测试方案一般包括&#xff1a; 项目的简要说明、项目系统结构、项目的业务结构、以及项目的性能需求、测试环境数据以及测试策略方法、测试案例、测试人员进度安排以及测试风险预估等等。 下面是一个一般…

FreeRTOS创建静态任务教程及所遇到的问题解决方法

静态任务和动态任务的区别 相对于动态任务&#xff0c;静态任务不需要动态分配内存&#xff0c;而是手动指定一个静态内存缓冲区&#xff0c;并在任务生命周期中一直使用该缓冲区。这可以避免动态内存分配时可能出现的内存碎片和内存泄漏问题&#xff0c;提高了系统的稳定性。…

【Python lxml、BeautifulSoup和html.parser区别介绍】零基础也能轻松掌握的学习路线与参考资料

区别介绍 &#xff08;1&#xff09;lxml lxml是Python的一个XML解析库&#xff0c;它基于libxml2和libxslt库构建&#xff0c;可以读取、操作和输出XML文档。lxml具有很强的性能和稳定性&#xff0c;在处理较大的XML文件时表现尤佳&#xff0c;并且支持XPath、CSS选择器等高…

PHP复习资料(未完待续)

&#xff08;未完待续&#xff0c;请持续关注此板块&#xff09; 【计科三四】雪课堂PHP期末模拟题&#xff1a;https://ks.wjx.top/vm/tUAmjxq.aspx# 【计科一二】PHP第一章练习题 https://ks.wjx.top/vm/QnjHad4.aspx# 【计科一二】PHP第二章练习题 https://ks.wjx.top/vm/h2…

ggplot绘制带误差棒、置信区间的柱状图,并调整颜色为渐变

ggplot绘制带误差棒、置信区间的柱状图,并调整颜色为渐变 简单绘制柱状图控制柱状宽度,间距调整颜色渐变简单绘制柱状图 要在ggplot中绘制带有置信区间的柱状图,你可以使用geom_bar和geom_errorbar函数来完成。下面是一个示例代码: library(ggplot2)# 创建一个示例数据集…

【LeetCode热题100】打卡第1天:两数之和

文章目录 两数之和⛅前言&#x1f512;题目&#x1f511;题解 两数之和 ⛅前言 大家好&#xff0c;我是知识汲取者&#xff0c;欢迎来到我们的LeetCode热题100刷题专栏&#xff01; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识算法与…

《操作系统》期末最全复习题及解释答案

文章目录 选择题填空题简答题程序题综合题1.银行家算法2.页面置换算法3.进程调度算法4.磁盘调度算法5.求物理/逻辑地址6.分页存储管理7.可变分区分配算法 选择题 若信号量S的初值为2&#xff0c;且有3个进程共享此信号量&#xff0c;则S的取值范围是&#xff08;B &#xff09;…

Downie 4 4.6.17 MAC上最新最好用的一款视频下载工具

Downie for Mac 简介 Downie是Mac下一个简单的下载管理器&#xff0c;可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们。 Downie 4 下载 Downie 4 for Mac Downie 4 for Mac软件特点 支持许多站点 -当前支持1000多个不同的…

Linux学习笔记 --- Linux基础命令

一. Linux的目录结构 目标&#xff1a;1. 掌握Linux系统的目录结构 2. 掌握Linux系统的路径表达形式 1.1 Linux系统的目录结构 我们知道&#xff0c;在操作系统中&#xff0c;文件系统的目录结构一般都是树形结构。Linux的目录结构是一个树型结构Windows 系统可以拥有多…

学习【菜鸟教程】【C++ 类 对象】【C++ 类的静态成员】

链接 1. 教程 可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时&#xff0c;这意味着无论创建多少个类的对象&#xff0c;静态成员都只有一个副本。 静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句&#xff0c;在创建第一个对象时…

用Lua或c调用go的库

用Lua或c调用go编写的库或函数 背景思路操作golua代码汇总 参考文章 又好久没有更新了&#xff0c;这次肯定又是遇上了什么问题&#xff0c;但又解决了的&#xff0c;才跑过来更新的。我也是翻遍了全网都没找到lua去调go代码的&#xff0c;于是干脆自己写一个 背景 作为提供统…

堆结构与堆排序

二叉树的概念 满二叉树&#xff1a;二叉树的每一层的节点数都达到最大值 完全二叉树&#xff1a;满二叉树或是从左往右依次变满的树 二叉树的数组表示 01234567 堆结构&#xff08;优先级队列结构&#xff09; 完全二叉树 大根堆&#xff1…

图数据库评估难?一篇教你搞定图数据库产品评估

随着数字经济时代全面开启&#xff0c;数据作为重要的生产要素&#xff0c;赋能作用日渐凸显&#xff0c;企业逐渐开始关注自身数字化水平和数据资产价值。而当各企业数智水平提升&#xff0c;其业务环境和计算场景呈现数据间关系交错复杂的特点。在面对需要深度挖掘数据间复杂…

C语言——存储类型

目录 1. auto 自动型2. static 静态2.1 修饰变量要知道&#x1f447;&#xff08;数据在Linux内核中的分配图&#xff09; 2.2 static 的特点⭐⭐⭐⭐⭐&#xff1a;2.2 修饰函数 3. extern4. register 寄存器类型 存储类型 存储类型有&#xff1a;auto static extern register…

2023最全selenium面试题及答案,测试员没有碰到算我输.....

一、前言 Selenium&#xff0c;是一个开源的框架&#xff0c;主要用于做HTML页面的UI自动化测试。不过&#xff0c;selenium IDE在去年官方已宣告放弃维护了。官网上放着一句话&#xff0c;selenium IDE is Dead。Selenium IDE是火狐浏览器的一个插件&#xff0c;是Selenium的…

上午面了个腾讯拿 38K 出来的,让我见识到了基础的天花板

今年的校招基本已经进入大规模的开奖季了&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好…

低功耗IC后端培训 | 盘点Power Switch Cell在实际项目中应用注意事项

下面直接进入今天的技术干货分享——全面盘点power gating cell在数字IC后端实现中的各种注意事项。 什么是Power Gating? 随着工艺制程越做越小和芯片规模越来越大&#xff0c;芯片的leakage的比重越来越高&#xff0c;数字后端实现时就得考虑leakage的优化。而leakage优化…