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

Pod控制器之hpa

简述

HPA全称HorizontalPodAutoscaler Pod水平自动扩缩容,Kubernetes控制器HPA是一种用于自动调整Pod数量的控制器。它可以根据资源使用情况自动增加或减少Pod的数量,以确保应用程序的高可用性和性能。HPA可以根据CPU使用率或自定义指标来进行调整,例如请求延迟或网络吞吐量

Pod 水平自动扩缩中文文档

工作原理

HPA一般通过指示工作负载资源如Deployment、StatefulSet 或其他类似资源进行扩缩容,对于像DaemonSet这种无法扩缩的对象不适用

使用之前我们先安装metrics-server,它可以用来收集集群中的资源使用情况。hpa通过metrics-server的api获取这些数据,然后进行扩缩容的副本计算,得到目标副本数量,如果与当前副本数不相同就通过副本控制器进行scale操作

metrics-server的yaml清单获取
metrics-server

安装完后使用top命令查看

[root@master hpa]# kubectl top node
NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
master   124m         6%     2508Mi          69%       
node01   59m          2%     1941Mi          54%       
node02   53m          2%     2010Mi          55%

hpa资源文件清单

apiVersion: autoscaling/v2beta1  # 使用autoscaling/v2beta1版本的HPA API
kind: HorizontalPodAutoscaler   # 定义HPA控制器
metadata:name: example-hpa   # HPA资源的名称namespace: default  # HPA资源所在的命名空间
spec:scaleTargetRef:apiVersion: apps/v1kind: Deployment   # 所有Pod数量将根据该Deployment对象的副本数量进行自动缩放name: example-deployment  # HPA将控制的Deployment对象名称minReplicas: 2   # 最小Pod数量maxReplicas: 10  # 最大Pod数量metrics:- type: Resource   # 使用资源指标类型resource:name: cpu   # 使用CPU使用率作为资源指标target:type: Utilization   # 使用CPU利用率作为度量标准averageUtilization: 50   # 目标CPU利用率,达到该利用率时触发自动扩缩容- type: Object   # 使用对象指标类型object:metricName: example_http_requests_total   # 自定义指标名称target:type: Value   # 目标值类型,可以是Value或AverageValuevalue: "100"  # 触发自动扩缩容的目标值describedObject:apiVersion: v1kind: Service   # 该对象指标作用于Service对象name: example-service   # 该对象指标作用于的Service对象名称

上面的自定义指标配置不会再本章讲解

案例

下面以一个案例来解释hpa的使用

使用hpa来控制deployment自动扩缩容,当pod资源平均使用率达到3%时进行扩容

创建一个Deployment

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx
spec:selector:matchLabels:app: nginx-hpatemplate:metadata:labels:app: nginx-hpaspec:containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 80protocol: TCPresources:requests:memory: "50Mi"cpu: "100m"
# 创建deployment
[root@master hpa]# kubectl create -f hpa-deploy.yaml 
deployment.apps/nginx created
# 记录下IP后面压测用到 10.244.2.104
[root@master hpa]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE    IP             NODE     NOMINATED NODE   READINESS GATES
nginx-659b6d57bd-5tbg2   1/1     Running   0          10s   10.244.2.104   node02   <none>           <none>

创建HPA
最小副本数1,最大10 autoscaling/v1版本

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:name: hpa
spec:minReplicas: 1maxReplicas: 10targetCPUUtilizationPercentage: 3scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: nginx

autoscaling/v2版本

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: hpa
spec:minReplicas: 1maxReplicas: 10scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: nginxmetrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 3
# 创建hpa
[root@master hpa]# kubectl create -f hpa.yaml 
horizontalpodautoscaler.autoscaling/hpa created# 查看hpa,还没有完全启动完
[root@master hpa]# kubectl get hpa
NAME   REFERENCE          TARGETS        MINPODS   MAXPODS   REPLICAS   AGE
hpa    Deployment/nginx   <unknown>/3%   1         10        0          6s# 再次查看hpa,启动完成 目前资源使用率 0%
[root@master hpa]# kubectl get hpa
NAME   REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa    Deployment/nginx   0%/3%     1         10        1          20s

使用ab工具进行压测,没有该工具需要安装 httpd-tools

# 安装 httpd-tools
yum -y install httpd-tools# ab工具可以模拟多个用户(并发请求),向Web服务器发送请求,并统计响应时间和处理请求数量等信息
# ab -n requests -c concurrency url
# 参数说明:
#- requests:总请求数,例如:-n 1000。
#- concurrency:并发请求数,例如:-c 10。
#- url:测试的URL地址。

压测

ab -n 10000 -c 1000 http://10.244.2.104/

观察压测结果

# 监听hpa 发现压测中cpu达到60% ,后面又降回去了
[root@master ~]# kubectl get hpa -w
NAME   REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa    Deployment/nginx   0%/3%     1         10        1          7m30s
hpa    Deployment/nginx   60%/3%    1         10        1          9m1s
hpa    Deployment/nginx   0%/3%     1         10        4          9m16s
hpa    Deployment/nginx   0%/3%     1         10        8          9m31s
hpa    Deployment/nginx   0%/3%     1         10        10         9m46s
# 监听Pod 一开始只有一个nginx-659b6d57bd-5tbg2 运行了8m47s,压测后又创建了9个Pod,观察ContainerCreating数量
[root@master hpa]# kubectl get pod -w
NAME                     READY   STATUS    RESTARTS   AGE
nginx-659b6d57bd-5tbg2   1/1     Running   0          8m47s
nginx-659b6d57bd-47f98   0/1     Pending   0          0s
nginx-659b6d57bd-47f98   0/1     Pending   0          0s
nginx-659b6d57bd-qs4tr   0/1     Pending   0          0s
nginx-659b6d57bd-tvnmp   0/1     Pending   0          0s
nginx-659b6d57bd-tvnmp   0/1     Pending   0          0s
nginx-659b6d57bd-qs4tr   0/1     Pending   0          0s
nginx-659b6d57bd-47f98   0/1     ContainerCreating   0          0s
nginx-659b6d57bd-qs4tr   0/1     ContainerCreating   0          0s
nginx-659b6d57bd-tvnmp   0/1     ContainerCreating   0          0s
nginx-659b6d57bd-47f98   1/1     Running             0          1s
nginx-659b6d57bd-tvnmp   1/1     Running             0          1s
nginx-659b6d57bd-qs4tr   1/1     Running             0          2s
nginx-659b6d57bd-mccdl   0/1     Pending             0          0s
nginx-659b6d57bd-mccdl   0/1     Pending             0          0s
nginx-659b6d57bd-w9r46   0/1     Pending             0          0s
nginx-659b6d57bd-498c2   0/1     Pending             0          0s
nginx-659b6d57bd-w9r46   0/1     Pending             0          0s
nginx-659b6d57bd-498c2   0/1     Pending             0          0s
nginx-659b6d57bd-mccdl   0/1     ContainerCreating   0          0s
nginx-659b6d57bd-nvhgh   0/1     Pending             0          0s
nginx-659b6d57bd-nvhgh   0/1     Pending             0          0s
nginx-659b6d57bd-w9r46   0/1     ContainerCreating   0          0s
nginx-659b6d57bd-498c2   0/1     ContainerCreating   0          0s
nginx-659b6d57bd-nvhgh   0/1     ContainerCreating   0          0s
nginx-659b6d57bd-mccdl   1/1     Running             0          1s
nginx-659b6d57bd-498c2   1/1     Running             0          1s
nginx-659b6d57bd-w9r46   1/1     Running             0          1s
nginx-659b6d57bd-nvhgh   1/1     Running             0          1s
nginx-659b6d57bd-gq6dc   0/1     Pending             0          0s
nginx-659b6d57bd-gq6dc   0/1     Pending             0          0s
nginx-659b6d57bd-k7vdz   0/1     Pending             0          0s
nginx-659b6d57bd-k7vdz   0/1     Pending             0          0s
nginx-659b6d57bd-gq6dc   0/1     ContainerCreating   0          0s
nginx-659b6d57bd-k7vdz   0/1     ContainerCreating   0          0s
nginx-659b6d57bd-gq6dc   1/1     Running             0          1s
nginx-659b6d57bd-k7vdz   1/1     Running             0          1s
# 观察deploy,看到副本数量也是达到10个
[root@master ~]# kubectl get deploy -w
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           9m19s
nginx   1/4     1            1           10m
nginx   1/4     1            1           10m
nginx   1/4     1            1           10m
nginx   1/4     4            1           10m
nginx   2/4     4            2           10m
nginx   3/4     4            3           10m
nginx   4/4     4            4           10m
nginx   4/8     4            4           10m
nginx   4/8     4            4           10m
nginx   4/8     4            4           10m
nginx   4/8     8            4           10m
nginx   5/8     8            5           10m
nginx   6/8     8            6           10m
nginx   7/8     8            7           10m
nginx   8/8     8            8           10m
nginx   8/10    8            8           11m
nginx   8/10    8            8           11m
nginx   8/10    8            8           11m
nginx   8/10    10           8           11m
nginx   9/10    10           9           11m
nginx   10/10   10           10          11m

压测完后缩容
大概等待五分钟,会看到缩容效果

# deploy的pod副本书已经缩为1个
[root@master ~]# kubectl get deploy -w
nginx   10/10   10           10          11m
nginx   10/1    10           10          16m
nginx   10/1    10           10          16m
nginx   1/1     1            1           16m# 观察Pod,开始逐步缩容 Pod停止Terminating
[root@master ~]# kubectl get pod -w
nginx-659b6d57bd-mccdl   1/1     Terminating         0          5m45s
nginx-659b6d57bd-47f98   1/1     Terminating         0          6m
nginx-659b6d57bd-w9r46   1/1     Terminating         0          5m45s
nginx-659b6d57bd-gq6dc   1/1     Terminating         0          5m30s
nginx-659b6d57bd-nvhgh   1/1     Terminating         0          5m45s
nginx-659b6d57bd-k7vdz   1/1     Terminating         0          5m30s
nginx-659b6d57bd-498c2   1/1     Terminating         0          5m45s
nginx-659b6d57bd-qs4tr   1/1     Terminating         0          6m
nginx-659b6d57bd-tvnmp   1/1     Terminating         0          6m
nginx-659b6d57bd-498c2   0/1     Terminating         0          5m46s
nginx-659b6d57bd-498c2   0/1     Terminating         0          5m46s
nginx-659b6d57bd-498c2   0/1     Terminating         0          5m46s
nginx-659b6d57bd-k7vdz   0/1     Terminating         0          5m31s
nginx-659b6d57bd-k7vdz   0/1     Terminating         0          5m31s
nginx-659b6d57bd-k7vdz   0/1     Terminating         0          5m31s
nginx-659b6d57bd-nvhgh   0/1     Terminating         0          5m46s
nginx-659b6d57bd-nvhgh   0/1     Terminating         0          5m46s
nginx-659b6d57bd-nvhgh   0/1     Terminating         0          5m46s
nginx-659b6d57bd-47f98   0/1     Terminating         0          6m1s
nginx-659b6d57bd-47f98   0/1     Terminating         0          6m2s
nginx-659b6d57bd-47f98   0/1     Terminating         0          6m2s
nginx-659b6d57bd-gq6dc   0/1     Terminating         0          5m32s
nginx-659b6d57bd-gq6dc   0/1     Terminating         0          5m32s
nginx-659b6d57bd-gq6dc   0/1     Terminating         0          5m32s
nginx-659b6d57bd-mccdl   0/1     Terminating         0          5m47s
nginx-659b6d57bd-mccdl   0/1     Terminating         0          5m47s
nginx-659b6d57bd-mccdl   0/1     Terminating         0          5m47s
nginx-659b6d57bd-qs4tr   0/1     Terminating         0          6m2s
nginx-659b6d57bd-w9r46   0/1     Terminating         0          5m47s
nginx-659b6d57bd-qs4tr   0/1     Terminating         0          6m2s
nginx-659b6d57bd-qs4tr   0/1     Terminating         0          6m2s
nginx-659b6d57bd-w9r46   0/1     Terminating         0          5m47s
nginx-659b6d57bd-w9r46   0/1     Terminating         0          5m47s
nginx-659b6d57bd-tvnmp   0/1     Terminating         0          6m3s
nginx-659b6d57bd-tvnmp   0/1     Terminating         0          6m3s
nginx-659b6d57bd-tvnmp   0/1     Terminating         0          6m3s# 只有一个Pod
[root@master ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-659b6d57bd-5tbg2   1/1     Running   0          18m

欢迎关注,学习不迷路!

相关文章:

Pod控制器之hpa

简述 HPA全称HorizontalPodAutoscaler Pod水平自动扩缩容&#xff0c;Kubernetes控制器HPA是一种用于自动调整Pod数量的控制器。它可以根据资源使用情况自动增加或减少Pod的数量&#xff0c;以确保应用程序的高可用性和性能。HPA可以根据CPU使用率或自定义指标来进行调整&…...

发现一个白嫖GPT4.0的方法!真的是完胜3.5!

大家好&#xff0c;我是五竹。 先说个基本的科普&#xff0c;最近被问的人都嘛了。 1、ChatGPT账号只有两种:普通账号和plus账号。 2、普通账号升级到plus账号&#xff0c;需要绑定国外的支付方式&#xff0c;每个月大概130左右&#xff01;plus账号更稳&#xff01;更快&am…...

数据结构之第四章、ArrayList和顺序表

一、线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。但是…...

webase全家桶搭建教程过程记录+bug解决

前置条件 Ubuntu20 基础环境搭建 检查Java java -version 检查mysql&#xff08;Ubuntu部署MySQL&#xff09; mysql --version 在装MySQL的时候发现了一个问题 就是不管怎么sudo mysql_secure_installation&#xff0c;&#xff0c;第二步设置密码就是不对&#xff0c;解…...

openEuler Linux 部署 HadoopHA

openEuler Linux 部署 HadoopHA 升级操作系统和软件 yum -y update升级后建议重启 安装常用软件 yum -y install gcc gcc-c autoconf automake cmake make rsync vim man zip unzip net-tools zlib zlib-devel openssl openssl-devel pcre-devel tcpdump lrzsz tar wget修改…...

React-Hooks----useEffect()

文章目录前言用法前言 useEffect() 是 React 中最常用的 Hook 之一&#xff0c;它可以让函数组件拥有类似于类组件中 componentDidMount、componentDidUpdate 和 componentWillUnmount 生命周期函数的功能。 用法 useEffect() 接受两个参数 第一个参数是一个函数&#xff0c…...

JavaWeb基础-汇总

SSM框架课程汇总01-MySQL基础02-MySQL高级03-JDBC04-JDBC练习05-Maven&Mybatis基础06-Mybatis练习07-JavaScript08-Web概述09-HTTP10-Tomcat11-Servlet12-Request&Response13-用户注册登录案例14-JSP15-JSP案例16-会话技术17-用户登录注册案例18-Filter19-Listener&…...

Niuke:JZ36.二叉树与双向链表

文章目录&#xff2e;iuke:JZ36.二叉树与双向链表题目描述示例思路分析代码实现&#xff2e;iuke:JZ36.二叉树与双向链表 题目描述 描述 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。如下图所示 注意: 1.要求不能创建任何新的结点&#xff0c;只…...

javaScript---读懂promise、async/await

一、Promise Promise 是一个 Es 6 提供的类,目的是更加优雅地书写复杂的异步任务。可以解决嵌套式的回调地域问题,Promise 将嵌套格式的代码变成了顺序格式的代码。 //回调地域 setTimeout(function () {console.log("红灯");setTimeout(function () {console.lo…...

【Linux】TCP编程流程

TCP编程流程 socket()创建套接字&#xff0c;套接字TCP协议选择流式服务SOCK_STREAM。 bind()指定套接字使用的IP地址和端口。IP地址是自己主机地址&#xff0c;端口为一个16位的整形值。 listen()方法创建监听队列。监听队列分为存放未完成三次握手的连接和完成三次握手的连…...

SuperMap iDesktop 下载安装,生成本地瓦片,以及发布本地瓦片服务

SuperMap iDesktop 是插件式桌面GIS软件&#xff0c;提供基础版、标准版、专业版和高级版四个版本&#xff0c;具备二三维一体化的数据处理、制图、分析、海图、二三维标绘等功能&#xff0c;支持对在线地图服务的无缝访问及云端资源的协同共享&#xff0c;可用于空间数据的生产…...

【ONE·Data || 常见排序说明】

总言 数据结构基础&#xff1a;排序相关内容。    文章目录总言1、基本介绍2、插入排序2.1、直接插入排序&#xff1a;InsertSort2.1.1、单趟2.1.2、总趟2.2、希尔排序&#xff08;缩小增量排序&#xff09;&#xff1a;ShellSort2.2.1、预排序1.0&#xff1a;单组分别排序2.…...

本节作业之跟随鼠标的天使、模拟京东按键输入内容、模拟京东快递单号查询

本节作业之跟随鼠标的天使、模拟京东按键输入内容、模拟京东快递单号查询1 跟随鼠标的天使2 模拟京东按键输入内容3 模拟京东快递单号查询1 跟随鼠标的天使 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><met…...

ChatGPT 被大面积封号,到底发生什么了?

意大利数据保护机表示 OpenAI 公司不但非法收集大量意大利用户个人数据&#xff0c;没有设立检查 ChatGPT 用户年龄的机制。 ChatGPT 似乎正在遭遇一场滑铁卢。 3月31日&#xff0c; 大量用户在社交平台吐槽&#xff0c;自己花钱开通的 ChatGPT 账户已经无法登录&#xff0c;更…...

教你精通JavaSE语法之第十一章、认识异常

一、异常的概念与体系结构 1.1异常的概念 在Java中&#xff0c;将程序执行过程中发生的不正常行为称为异常。比如之前写代码时经常遇到的&#xff1a; 1.算术异常 System.out.println(10 / 0); // 执行结果 Exception in thread "main" java.lang.ArithmeticExcep…...

display、visibility、opacity隐藏元素的区别

display、visibility、opacity隐藏元素的区别 display: none 事件监听&#xff1a;无法进行DOM事件监听。 元素从网页中消失&#xff0c;并且不占据位置再次从网页中出现会引起重排 进而引起重绘继承&#xff1a;不会被子元素继承&#xff0c;因为子元素也不被渲染。 visib…...

Linux Shell 实现一键部署tomcat10+java13

tomcat 前言 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。对于一个初学者来说&#xff0c;可以这样认为&#xff0c;当…...

软硬皆施,WMS仓库管理系统+PDA,实现效率狂飙

人工经验Excel表格&#xff0c;是传统第三方仓储企业常用的管理模式。在这种管理模式下&#xff0c;对仓库员工的Excel操作能力、业务经验和工作素养要求极高。一旦员工的经验能力不足&#xff0c;就会导致仓库业务运行不顺畅&#xff0c;效率低下&#xff0c;而员工也会因长时…...

DJ3-2 传输层(第二节课)

目录 一、如何实现可靠数据传输 1. 需要解决地问题 2. 使用的描述方法 二、rdt1.0&#xff1a;完全可靠信道上的可靠数据传输 1. 前提条件 2. 有限状态机 FSM 三、rdt2.0&#xff1a;仅具有 bit 错误的信道上的可靠数据传输 1. 前提条件 2. 有限状态机 FSM 3. 停等协…...

FrIf-FrIf功能模块概述和与底层驱动的交互

总目录链接==>> AutoSAR入门和实战系列总目录 总目录链接==>> AutoSAR BSW高阶配置系列总目录 文章目录 1 FlexRay 接口模块概述2 与FlexRay底层驱动的交互1 FlexRay 接口模块概述 FlexRay 接口模块通过 FlexRay 驱动程序模块间接与 FlexRay 控制器通信。 它…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...