19、Kubernetes核心技术 - 资源限制

目录

一、概述

二、Kubernetes 中的资源单位

2.1、CPU资源单位

2.2、内存资源单位

三、Pod资源限制

四、namespace资源限制

4.1、为命名空间配置内存和 CPU 配额

4.2、为命名空间配置默认的内存请求和限制

4.3、为命名空间配置默认的CPU请求和限制

五、超过容器限制的内存


一、概述

当定义 Pod 时,我们可以定义多个容器,我们知道,容器的程序要运行肯定是要占用一定资源的,比如CPU和内存等,默认情况下,Pod运行没有CPU和内存的限额。如果不对某个容器的资源进行限制,那么它就可能消耗大量资源,导致其他容器无法运行。

针对这样情况,kubernetes提供了对内存和CPU资源进行配额的机制,这种机制主要通过配置spec.containers[].resources选项实现,resources提供了2个主要的参数,如下:

  • limits

用于限制运行时容器的最大占用资源,当容器占用资源超过limit时就会被终止,并将进行重启。当为容器指定了 limit 资源时,kubelet 就可以确保运行的容器不会使用超出所设限制的资源,设置为0表示对使用的资源不做限制, 可无限的使用。

  • requests

用于设置容器需要的最小资源,如果环境资源不够,容器将无法启动。当为Pod中的容器指定了 request资源时,调度器( kube-scheduler )就使用该信息来决定将 Pod 调度到哪个节点上,只有当前节点上可分配的资源量 >= request 时才允许将容器调度到该节点。

如果 Pod 运行所在的节点具有足够的可用资源,容器可能(且可以)使用超出对应资源 request 属性所设置的资源量。不过,容器不可以使用超出其资源 limit 属性所设置的资源量。

例如,如果你将容器的 memory 的请求量设置为 256 MiB,而该容器所处的 Pod 被调度到一个具有 8 GiB 内存的节点上,并且该节点上没有其他 Pod 运行,那么该容器就可以尝试使用更多的内存。

如果你将某容器的 memory 限制设置为 4 GiB,kubelet (和容器运行时)就会确保该限制生效。 容器运行时会禁止容器使用超出所设置资源限制的资源。 例如:当容器中进程尝试使用超出所允许内存量的资源时,系统内核会将尝试申请内存的进程终止, 并引发内存不足(OOM)错误。

针对每个容器,你都可以指定其资源限制和请求,包括如下选项:

pod.spec.containers.resources:
	requests: <map[string]string>
		cpu:		// 定义创建容器时预分配的CPU资源
		memory:		// 定义创建容器时预分配的内存资源
	limits: <map[string]string>
		cpu:		// 定义cpu的资源上限 
		memory:		// 定义内存的资源上限

二、Kubernetes 中的资源单位

2.1、CPU资源单位

CPU 资源的限制和请求以 “cpu” 为单位。 在 Kubernetes 中,一个 CPU 等于 1 个物理 CPU 核 或者 1 个虚拟核, 取决于节点是一台物理主机还是运行在某物理主机上的虚拟机。

也可以表达带小数 CPU 的请求。 当定义一个容器,将其 spec.containers[].resources.requests.cpu 设置为 0.5 时, 所请求的 CPU 是请求 1.0 CPU 时的一半。 对于 CPU 资源单位,数量 表达式 0.1 等价于表达式 100m,可以看作 “100 millicpu”(“一百毫核”)。

CPU 资源总是设置为资源的绝对数量而非相对数量值。 例如,无论容器运行在单核、双核或者 48-核的机器上,500m CPU 表示的是大约相同的计算能力。

2.2、内存资源单位

以字节为单位。可以以整数表示,或者以10为底数的指数的单位(E、P、T、G、M、K)来表示, 或者使用对应的 2 的幂数:Ei、Pi、Ti、Gi、Mi、Ki(Ei、Pi、Ti、Gi、Mi、Ki)来表示。

三、Pod资源限制

vim resource-limit.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          resources:
            limits:	# 限制最大资源,上限
              memory: 1Gi 		# 定义内存的资源上限
              cpu: 1  		# 定义cpu的资源上限
            requests:	#请求资源(最小,下限)
              memory: 256Mi   	# 定义创建容器时预分配的内存资源
              cpu: 100m   		# 定义创建容器时预分配的CPU资源

cpu的单位m:代表“千分之一核心”,譬如100m的含义是指100/1000核心,即10%,表示每 1000 毫秒容器可以使用的 CPU 时间总量为 0.1*1000 毫秒。

注意:Gi和G,Mi和M的区别,官网解释:Mi表示(1Mi=1024×1024),M表示(1M=1000×1000)(其它单位类推, 如Ki/K Gi/G);

如上,nginx容器的request值为0.1个cpu和256MiB内存,nginx容器的limit 值为1个cpu和1GiB内存。

创建并查看pod:

$ kubectl apply -f resource-limit.yaml 
deployment.apps/nginx created

$ kubectl get pod -o wide
NAME                   READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
nginx-8c777cc7-6jj8x   1/1     Running   0          9s    192.168.1.3   node01   <none>           <none>

可以看到,pod被调度到node01节点,我们查看节点描述信息:

$ kubectl describe nodes node01

 

四、namespace资源限制

4.1、为命名空间配置内存和 CPU 配额

默认情况下, Kubernetes 集群上的容器运行使用的计算资源没有限制。 使用 Kubernetes 资源配额, 管理员(也称为集群操作者)可以在一个指定的命名空间内限制集群资源的使用与创建。 在命名空间中,一个 Pod 最多能够使用命名空间的资源配额所定义的 CPU 和内存用量。

如果需要为命名空间设置容器可用的内存和 CPU 总量,可以通过 ResourceQuota 对象来定义,对每个命名空间的资源消耗总量提供限制。使用 ResourceQuota 限制命名空间中所有容器的内存请求总量、内存限制总量、CPU 请求总量和CPU 限制总量。

需要理解的是ResourceQuota是给命名空间去配额,而不是给pod去配额,是所有pod运行的总量和。

下面是 ResourceQuota 的示例清单:

vim resource-quota.yaml 

apiVersion: v1
kind: ResourceQuota
metadata:
  name: my-resource-quota
spec:
  hard:
    requests.cpu: "1"		# 所有非终止状态的 Pod,其 CPU 需求总量不能超过该值。
    requests.memory: 1Gi	# 所有非终止状态的 Pod,其内存需求总量不能超过该值。
    limits.cpu: "2"			# 所有非终止状态的 Pod,其 CPU 限额总量不能超过该值。
    limits.memory: 2Gi		# 所有非终止状态的 Pod,其内存限额总量不能超过该值。

创建并查看 ResourceQuota 详情:

$ kubectl create -f resource-quota.yaml --namespace=default
resourcequota/my-resource-quota created

$ kubectl get resourcequota my-resource-quota --namespace=default --output=yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  creationTimestamp: "2023-01-30T05:12:54Z"
  name: my-resource-quota
  namespace: default
  resourceVersion: "1753"
  uid: f6170a87-f22f-45f7-9dac-c721f9eb1a44
spec:
  hard:
    limits.cpu: "2"
    limits.memory: 2Gi
    requests.cpu: "1"
    requests.memory: 1Gi
status:
  hard:
    limits.cpu: "2"
    limits.memory: 2Gi
    requests.cpu: "1"
    requests.memory: 1Gi
  used:
    limits.cpu: "0"
    limits.memory: "0"
    requests.cpu: "0"
    requests.memory: "0"

ResourceQuota 在 default 命名空间中设置了如下要求:

  • 在该命名空间中的每个 Pod 的所有容器都必须要有内存请求和限制,以及 CPU 请求和限制。
  • 在该命名空间中所有 Pod 的内存请求总和不能超过 1 GiB。
  • 在该命名空间中所有 Pod 的内存限制总和不能超过 2 GiB。
  • 在该命名空间中所有 Pod 的 CPU 请求总和不能超过 1 cpu。
  • 在该命名空间中所有 Pod 的 CPU 限制总和不能超过 2 cpu。

接下来,我们创建一个Pod,清单如下:vim quota-mem-cpu-nginx-pod.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      limits:
        memory: "800Mi"
        cpu: "800m"
      requests:
        memory: "600Mi"
        cpu: "400m"

创建并查看Pod:

$ kubectl apply -f quota-mem-cpu-nginx-pod.yaml 
pod/nginx created

$ kubectl get pod -o wide 
NAME    READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          17s   192.168.1.3   node01   <none>           <none>

 可以看到,Pod处于正常运行状态,接着再次查看 ResourceQuota 的详情:

$ kubectl get resourcequota my-resource-quota --namespace=default --output=yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  creationTimestamp: "2023-01-30T05:12:54Z"
  name: my-resource-quota
  namespace: default
  resourceVersion: "1943"
  uid: f6170a87-f22f-45f7-9dac-c721f9eb1a44
spec:
  hard:
    limits.cpu: "2"
    limits.memory: 2Gi
    requests.cpu: "1"
    requests.memory: 1Gi
status:
  hard:
    limits.cpu: "2"
    limits.memory: 2Gi
    requests.cpu: "1"
    requests.memory: 1Gi
  used:
    limits.cpu: 800m
    limits.memory: 800Mi
    requests.cpu: 400m
    requests.memory: 600Mi

输出结果显示了配额以及有多少配额已经被使用,可以看到 Pod 的内存和 CPU 请求值及限制值没有超过配额。

我们再次尝试创建另外一个Pod,清单如下:vim quota-mem-cpu-redis-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis
    resources:
      limits:
        memory: "1Gi"
        cpu: "800m"
      requests:
        memory: "700Mi"
        cpu: "400m"

在清单中,你可以看到 Pod 的内存请求为 700 MiB。 请注意新的内存请求与已经使用的内存请求之和超过了内存请求的配额: 600 MiB + 700 MiB > 1 GiB。

尝试创建 Pod:

$ kubectl apply -f quota-mem-cpu-redis-pod.yaml 
Error from server (Forbidden): error when creating "quota-mem-cpu-redis-pod.yaml": pods "redis" is forbidden: exceeded quota: my-resource-quota, requested: requests.memory=700Mi, used: requests.memory=600Mi, limited: requests.memory=1Gi

可以看到,第二个 Pod 不能被创建成功。输出结果显示创建第二个 Pod 会导致内存请求总量超过内存请求配额。

4.2、为命名空间配置默认的内存请求和限制

如果想对命名空间中的单个容器而不是所有容器进行限制,需要使用 LimitRange对象。

LimitRange 是限制命名空间内可为每个适用的对象类别 (例如 Pod 或 PersistentVolumeClaim) 指定的资源分配量(限制和请求)的策略对象。

一个 LimitRange(限制范围) 对象提供的限制能够做到:

  • 在一个命名空间中实施对每个 Pod 或 Container 最小和最大的资源使用量的限制。
  • 在一个命名空间中实施对每个 PersistentVolumeClaim 能申请的最小和最大的存储空间大小的限制。
  • 在一个命名空间中实施对一种资源的申请值和限制值的比值的控制。
  • 设置一个命名空间中对计算资源的默认申请/限制值,并且自动的在运行时注入到多个 Container 中。

当某命名空间中有一个 LimitRange 对象时,将在该命名空间中实施 LimitRange 限制。

以下为 LimitRange 的示例清单。 清单中声明了默认的内存请求和默认的内存限制。

vim memory-default.yaml 

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
    - default:
        memory: 512Mi
      defaultRequest:
        memory: 256Mi
      type: Container

在default命名空间创建限制范围:  

$ kubectl create -f memory-default.yaml --namespace=default
limitrange/mem-limit-range created

如上,如果我们在default命名空间中创建Pod,并且该 Pod 中所有容器都没有声明自己的内存请求和内存限制,那么控制面会将内存的默认请求值 256MiB 和默认限制值 512MiB 应用到 Pod 上。

以下为只包含一个nginx容器的 Pod 的清单,该容器没有声明内存请求和限制。

vim nginx-without-resource.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx

 创建并查看pod:

$ kubectl apply -f nginx-without-resource.yaml 
deployment.apps/nginx created

$ kubectl get pod       
NAME                     READY   STATUS    RESTARTS   AGE
nginx-748c667d99-gq5rs   1/1     Running   0          13s

 

可以看到,输出显示nginx容器已经被指定一个默认的最小内存请求256 MiB和一个默认的最大内存限制512 Mib。

4.3、为命名空间配置默认的CPU请求和限制

以下为 LimitRange 的示例清单。 清单中声明了默认 CPU 请求和默认 CPU 限制。

vim cpu-default.yaml

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-limit-range
spec:
  limits:
    - default:
        cpu: 1
      defaultRequest:
        cpu: 0.5
      type: Container

在命名空间 default中创建 LimitRange 对象:

$ kubectl create -f cpu-default.yaml --namespace=default
limitrange/cpu-limit-range created

如果在 default命名空间创建一个Pod,并且该 Pod 中所有容器都没有声明自己的 CPU 请求和 CPU 限制, 控制面会将 CPU 的默认请求值 0.5 和默认限制值 1 应用到 Pod 上。

以下为只包含一个nginx容器的 Pod 的清单,该容器没有声明 CPU 请求和限制。

vim nginx-without-cpu-resource.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx

创建并查看pod:

$ kubectl apply -f nginx-without-cpu-resource.yaml 
deployment.apps/nginx created

$ kubectl get pod 
NAME                     READY   STATUS    RESTARTS   AGE
nginx-748c667d99-p2mqk   1/1     Running   0          69s

 

可以看到,输出显示nginx容器已经被指定默认的 最小CPU请求为0.5和默认的最大CPU限制值为1。

五、超过容器限制的内存

当节点拥有足够的可用内存时,容器可以使用其请求的内存。 但是,容器不允许使用超过其限制的内存。 如果容器分配的内存超过其限制,该容器会成为被终止的候选容器。 如果容器继续消耗超出其限制的内存,则终止容器。 如果终止的容器可以被重启,则 kubelet 会重新启动它,就像其他任何类型的运行时失败一样。

我们看一个示例,资源清单如下:

vim oom-demo.yaml

apiVersion: v1
kind: Pod
metadata:
  name: stress
spec:
  containers:
  - name: stress
    image: polinux/stress
    resources:
      requests:
        memory: "50Mi"
      limits:
        memory: "100Mi"
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "250M", "--vm-hang", "1"]

这里定义了一个容器,该容器的内存请求为 50 MiB,内存限制为 100 MiB。并且在配置文件的 args 部分中,可以看到容器会尝试分配 250 MiB 内存,这远高于 100 MiB 的限制。

创建并查看Pod:

$ kubectl apply -f oom-demo.yaml 
pod/stress created

$ kubectl get pod -o wide 
NAME     READY   STATUS      RESTARTS      AGE   IP            NODE     NOMINATED NODE   READINESS GATES
stress   0/1     OOMKilled   2 (26s ago)   30s   192.168.1.3   node01   <none>           <none>

可以看到,容器已经被杀死,并且kubelet 会尝试重启它。获取容器更详细的状态信息:

$ kubectl get pod stress -o yaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    cni.projectcalico.org/containerID: b371e450fa7a62b0a3ad0744ef21c05aef265b049ad754ef6296f95c979fdb00
    cni.projectcalico.org/podIP: 192.168.1.3/32
    cni.projectcalico.org/podIPs: 192.168.1.3/32
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"stress","namespace":"default"},"spec":{"containers":[{"args":["--vm","1","--vm-bytes","250M","--vm-hang","1"],"command":["stress"],"image":"polinux/stress","name":"stress","resources":{"limits":{"memory":"100Mi"},"requests":{"memory":"50Mi"}}}]}}
  creationTimestamp: "2023-01-30T06:20:50Z"
  name: stress
  namespace: default
  resourceVersion: "2112"
  uid: a2ee4e2f-2e12-4403-89ba-502956ab4f70
spec:
  containers:
  - args:
    - --vm
    - "1"
    - --vm-bytes
    - 250M
    - --vm-hang
    - "1"
    command:
    - stress
    image: polinux/stress
    imagePullPolicy: Always
    name: stress
    resources:
      limits:
        memory: 100Mi
      requests:
        memory: 50Mi
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-sckdb
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  nodeName: node01
  preemptionPolicy: PreemptLowerPriority
  priority: 0
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  tolerations:
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  volumes:
  - name: kube-api-access-sckdb
    projected:
      defaultMode: 420
      sources:
      - serviceAccountToken:
          expirationSeconds: 3607
          path: token
      - configMap:
          items:
          - key: ca.crt
            path: ca.crt
          name: kube-root-ca.crt
      - downwardAPI:
          items:
          - fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
            path: namespace
status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2023-01-30T06:20:50Z"
    status: "True"
    type: Initialized
  - lastProbeTime: null
    lastTransitionTime: "2023-01-30T06:21:38Z"
    message: 'containers with unready status: [stress]'
    reason: ContainersNotReady
    status: "False"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: "2023-01-30T06:21:38Z"
    message: 'containers with unready status: [stress]'
    reason: ContainersNotReady
    status: "False"
    type: ContainersReady
  - lastProbeTime: null
    lastTransitionTime: "2023-01-30T06:20:50Z"
    status: "True"
    type: PodScheduled
  containerStatuses:
  - containerID: containerd://a735f113298aa42255bda94e798291330e9db922ebdc820855be290a049e9dad
    image: docker.io/polinux/stress:latest
    imageID: docker.io/polinux/stress@sha256:b6144f84f9c15dac80deb48d3a646b55c7043ab1d83ea0a697c09097aaad21aa
    lastState:
      terminated:
        containerID: containerd://a735f113298aa42255bda94e798291330e9db922ebdc820855be290a049e9dad
        exitCode: 1
        finishedAt: "2023-01-30T06:22:19Z"
        reason: OOMKilled
        startedAt: "2023-01-30T06:22:19Z"
    name: stress
    ready: false
    restartCount: 4
    started: false
    state:
      waiting:
        message: back-off 1m20s restarting failed container=stress pod=stress_default(a2ee4e2f-2e12-4403-89ba-502956ab4f70)
        reason: CrashLoopBackOff
  hostIP: 172.30.2.2
  phase: Running
  podIP: 192.168.1.3
  podIPs:
  - ip: 192.168.1.3
  qosClass: Burstable

 

输出结果显示:由于内存溢出(OOM),容器已被杀掉。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FreeRTOS概述

什么是FreeRTOSFreeRTOS官网地址 FreeRTOS 是市场领先的面向微控制器和小型微处理器的实时操作系统 (RTOS)&#xff0c;与世界领先的芯片公司合作开发&#xff0c;现在每 170 秒下载一次。MIT 通过 FreeRTOS 开源许可免费分发&#xff0c;包括一个内核和一组不断丰富的 IoT 库&…

muduo网络库剖析——日志Log类

muduo网络库剖析——日志Log类 前情从muduo到my_muduo 概要日志日志级别 框架与细节成员函数 源码 前情 从muduo到my_muduo 作为一个宏大的、功能健全的muduo库&#xff0c;考虑的肯定是众多情况是否可以高效满足&#xff1b;而作为学习者&#xff0c;我们需要抽取其中的精华…

【Leetcode】240. 搜索二维矩阵 II

一、题目 1、题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例1: 输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21…

新火种AI|小冰摊牌了!大模型已获国内备案,克隆人发布箭在弦上...

作者&#xff1a;小岩 编辑&#xff1a;彩云 2024年国内AI圈的第一个重磅消息已然来袭。 1月4日&#xff0c;小冰公司宣布&#xff0c;已于去年12月成功获得“小冰大模型”的国内备案。结合此前公司在日本研发的Rinna大模型&#xff0c;小冰方面称&#xff0c;公司已实现不同…

视频会员付费系统源码 影视视频模版源码 模板PC+WAP苹果CMS影视模板源码

快猫视频会员付费视频系统/x站视频模板/苹果CMS影视模板/可打包成双端APP 适用程序&#xff1a;苹果cmsv10 兼容性和面向场景&#xff1a; 1、Windows 平台&#xff1a; IIS/Apache PHP&#xff08;5.6&#xff09; MySQL&#xff08;5.5&#xff09; 2、Linux/Unix 平台…

深度学习|4.7 参数和超参数

4.7 参数和超参数 超参数是指需要用户提前设置好的参数&#xff0c;这些超参数最终会影响到参数的数值&#xff08;相当于参数是动态调整得到的&#xff09; 学习率的选取 最优学习率应该能使得代价函数趋于一个较低的常数。

SpringBoot Import提示Cannot resolve symbol

背景 项目开发过程中经常在IDEA中出现Cannot resolve symbol&#xff0c;但是依赖确定已经通过maven或者gradle依赖了 常见原因 IDEA 存在缓存 File -> Invalidate Caches/Restart jar包的scope不正常&#xff0c;如果只是runtime则无法import&#xff0c;需要调整为com…

ssm使用web工程的相关知识

不使用框架创建web的两种方式&#xff08;这里是idea2022.3.2版&#xff09; 第一种&#xff1a;项目右键点击&#xff1a;add Framwork support选择框架进行创建。 操作步骤&#xff1a; 使用这种方式创建可能会存在的问题&#xff1a; 如果你创建web框架前&#xff1a;在…

软测如果这么学,培训班都得倒闭,直接省去上万元的学费!

俗话说外行看热闹&#xff0c;内行看门道。 写这篇文章&#xff0c;是希望把我的一些我认为是非常有价值的经验总结出来&#xff0c;能够帮助刚做测试不久的新同学&#xff0c;或者是测试经验丰富的老同学以共享。 希望我们可爱的新同学&#xff0c;准备要在测试领域耕耘的伙…

HNU-数据库系统-实验3-数据库设计

数据库系统 课程实验3数据库设计 计科210X 甘晴void 202108010XXX 目录 文章目录 数据库系统 课程实验3<br>数据库设计实验目的实验内容实验重难点实验环境实验过程&#xff08;0&#xff09;数据库需求描述&#xff08;1&#xff09;数据库概念结构设计E-R图实体图书馆…

电子电器架构网络演化 —— 车载以太网TSN

电子电器架构网络演化 —— 车载以太网TSN 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消…

Weblogic安全漫谈(一)

前言 frohoff在2015年初发现commons-collections的反序列化利用链并发布了ysoserial工具[1]。9个月后&#xff0c;breenmachine对众多知名Java中间件的利用文章[2]使Java反序列化漏洞变得广为人知&#xff0c;Weblogic中首当其冲的就是大家多少都有点耳熟的T3协议反序列化。本…

家用洗地机哪款好用?洗地机品牌排行榜推荐

在如今的日常生活中&#xff0c;家用洗地机已经成为了家庭清洁中不可或缺的工具。然而&#xff0c;市面上各种不同品牌型号的洗地机让人眼花缭乱&#xff0c;让人难以选择。那么&#xff0c;家用洗地机现在买什么牌子质量好呢?为了解答这个问题&#xff0c;笔者选了几款品牌质…

Vue3+Vite打包跨平台(七牛、阿里OSS)上传部署前端项目

1、业务场景 阅读之前&#xff0c;想了解一下各位观众老爷们&#xff0c;你们公司的项目是怎么部署的&#xff1a; 1.本地打包手动上传服务器&#xff1b; 2.本地打包自动上传服务器&#xff1b; 3.代码仓库流水线自动构建&#xff1b; 4.其他…&#xff1b; 我们用的第3种部…

【Linux Shell】11. 输入/输出 重定向

文章目录 【 1. 重定向简介 】【 2. 输出重定向 】【 3. 输入重定向 】【 4. Here Document 】【 5. /dev/null 文件 】 【 1. 重定向简介 】 大多数 UNIX 系统命令从终端接受输入并将所产生的输出发送回​​到原来输入的终端。一个命令通常从标准输入的地方读取输入&#xff…

MySql8的那些不为人知的秘密揭晓

前言 MySQL 8.0 是MySQL数据库的一个重大版本更新&#xff0c;带来了许多改进和新功能。以下是MySQL 8.0的一些主要改进&#xff1a; 事务控制&#xff1a;引入了原子性、一致性、隔离性和持久性&#xff08;ACID&#xff09;的事务支持。该版本的MySQL引入了新的事务日志存储引…

Mysql大数据量下流式查询优化:Jdbc中的useFetchSize参数及其原理解析

前言 最近我朋友公司有个需求场景&#xff1a;查询千万级数据量并写入txt文件的程序优化需求。 朋友找到我对程序进行优化&#xff0c; 不然饭碗不保......&#x1f4a6; 下面就分享一下解决这个优化问题的过程和思路&#xff0c;并总结一下&#xff0c;在以后不要在踩同样的坑…

4.4 TILING FOR REDUCED MEMORY TRAFFIC

我们在CUDA中使用设备内存方面有一个内在的权衡&#xff1a;全局内存大但速度慢&#xff0c;而共享内存小但速度快。一个常见的策略是将数据划分为称为tile的子集&#xff0c;以便每个tile都适合共享内存。tile一词”借鉴了一个类比&#xff0c;即大墙&#xff08;即全局内存数…

基于协同过滤推荐的购物系统

介绍 本购物系统是一个基于协同过滤推荐算法的电商平台&#xff0c;使用 Python Django 框架、Django-simpleui 前端框架和 Vue、Element-Plus UI 组件库构建而成。该系统可根据关键词、分类等搜索筛选商品&#xff0c;并提供了个性化推荐功能&#xff0c;根据用户的历史订单、…

linux日志管理

一.inode与block 访问文件的流程&#xff1a; 根据文件夹的文件名和inode号&#xff0c;找到对应的inode表&#xff0c;再根据inode表的指针找到磁盘上的真实数据 tips&#xff1a;我磁盘空间还剩很多&#xff0c;但是无法建立文件&#xff1f; 因为inode号被分完了 解决方法&a…