15、Kubernetes核心技术 - 探针
目录
一、概述
二、探针类型
2.1、就绪探针(Readiness Probe)
2.2、存活探针(Liveness Probe)
三、探针探测方法
3.1、exec
3.2、httpGet
3.3、tcpSocket
四、探针配置项
五、探针使用
5.1、就绪探针(Readiness Probe)
5.2、存活探针(Liveness Probe)
5.3、TCP就绪/存活探测
六、Liveness Probe(存活探针) VS Readiness Probe(就绪探针)
一、概述
在k8s中,我们不能仅仅通过查看应用的运行状态,来判断应用是否正常,因为在某些时候,容器正常运行并不能代表应用健康,因此,k8s提供了探针(Probe)技术,来帮助我们判断容器内运行的应用是否运行正常,探针有点类似心跳检测。
二、探针类型
Kubernetes 的探针有三种类型:
2.1、就绪探针(Readiness Probe)
判断容器是否启动完成,即容器的 Ready 是否为 True,可以接收请求,如果ReadinessProbe 探测失败,则容器的 Ready 将为 False,控制器将此Pod 的Endpoint 从对应的Service的Endpoint 列表中移除,从此不再将任何请求调度此Pod 上,直到下次探测成功。通过使用 Readiness 探针,Kubernetes 能够等待应用程序完全启动,然后才允许服务将流量发送到新副本。
2.2、存活探针(Liveness Probe)
判断容器是否存活,即 Pod 是否为 running 状态,如果 LivenessProbe探测到容器不健康,则 kubelet 将 kill 掉容器,并根据容器的重启策略是否重启。如果一个容器不包含 LivenessProbe 探针,则 Kubelet 认为容器的 LivenessProbe 探针的返回值永远成功。
有时应用程序可能因为某些原因(后端服务故障等)导致暂时无法对外提供服务,但应用软件没有终止,导致 k8s无法隔离有故障的 pod,调用者可能会访问到有故障的pod,导致业务不稳定。k8s提供 livenessProbe 来检测应用程序是否正常运行,并且对相应状况进行相应的补救措施。
三、探针探测方法
每类探针都支持三种探测方法:
3.1、exec
通过在容器内执行命令来检查服务是否正常,针对复杂检测或无HTTP 接口的服务,返回值为 0,则表示容器健康。
3.2、httpGet
通过发送 http 请求检查服务是否正常,返回 200-399 状态码则表明容器健康。
3.3、tcpSocket
通过容器的 IP 和 Port 执行 TCP 检查,如果能够建立TCP 连接,则表明容器健康。
四、探针配置项
探针(Probe)有许多可选字段,可以用来更加精确的控制探针的行为。这些参数包括:
- initialDelaySeconds:容器启动后第一次执行探测是需要等待多少秒;
- periodSeconds:执行探测的间隔时间,默认是10秒;
- timeoutSeconds:超时时间,当超过我们定义的时间后,便会被视为失败,默认 1 秒;
- successThreshold:探测失败后,最少连续探测成功多少次才被认定为成功,默认是1次。;
- failureThreshold:探测成功后,最少连续探测失败多少次才被认定为失败,默认是3次;
五、探针使用
5.1、就绪探针(Readiness Probe)
创建Pod资源清单:vim nginx-readiness-probe.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx-readiness-probe
spec:containers:- name: nginx-readiness-probeimage: nginxreadinessProbe:  # 就绪探针httpGet:  # 对容器的IP地址、端口和URL路径来发送GET请求path: /healthzport: 80initialDelaySeconds: 10   # 等待10s后便开始就绪检查periodSeconds: 5    # 间隔5s检查一次successThreshold: 2   # 探测失败后,最少连续探测成功多少次才被认定为成功我们指定了探针检测方式为httpGet,通过发送 http 请求检查服务是否正常,返回 200-399 状态码则表明容器健康。
$ kubectl apply -f nginx-readiness-probe.yaml 
pod/nginx-readiness-probe created$ kubectl get pod -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
nginx-readiness-probe   0/1     Running   0          32s   192.168.1.3   node01   <none>           <none>$ kubectl describe pod nginx-readiness-probe
Name:             nginx-readiness-probe
Namespace:        default
Priority:         0
Service Account:  default
Node:             node01/172.30.2.2
Start Time:       Mon, 16 Jan 2023 03:23:11 +0000
Labels:           <none>
Annotations:      cni.projectcalico.org/containerID: 67b08cbc5b07020dcd7040cd47565c5405ee82641a9d3d68d9fd68b6b599c10f
cni.projectcalico.org/podIP: 192.168.1.3/32
cni.projectcalico.org/podIPs: 192.168.1.3/32
Status:           Running
IP:               192.168.1.3
IPs:
IP:  192.168.1.3
Containers:
nginx-readiness-probe:
Container ID:   containerd://23eca4eaeffce3e6801d3e7c26a60360d33b1fdb4046843ff9cf7c647adcf0a2
Image:          nginx
Image ID:       docker.io/library/nginx@sha256:b8f2383a95879e1ae064940d9a200f67a6c79e710ed82ac42263397367e7cc4e
Port:           <none>
Host Port:      <none>
State:          Running
Started:      Mon, 16 Jan 2023 03:23:16 +0000
Ready:          False
Restart Count:  0
Readiness:      http-get http://:80/healthz delay=10s timeout=1s period=5s #success=2 #failure=3
Environment:    <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-8xsm8 (ro)
Conditions:
Type              Status
Initialized       True 
Ready             False 
ContainersReady   False 
PodScheduled      True 
Volumes:
kube-api-access-8xsm8:
Type:                    Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds:  3607
ConfigMapName:           kube-root-ca.crt
ConfigMapOptional:       <nil>
DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type     Reason     Age               From               Message
----     ------     ----              ----               -------
Normal   Scheduled  43s               default-scheduler  Successfully assigned default/nginx-readiness-probe to node01
Normal   Pulling    43s               kubelet            Pulling image "nginx"
Normal   Pulled     38s               kubelet            Successfully pulled image "nginx" in 4.968467021s (4.968471311s including waiting)
Normal   Created    38s               kubelet            Created container nginx-readiness-probe
Normal   Started    38s               kubelet            Started container nginx-readiness-probe
Warning  Unhealthy  3s (x6 over 28s)  kubelet            Readiness probe failed: HTTP probe failed with statuscode: 404通过describe查看Pod描述信息后,可以看到,Readiness probe就绪检测失败了,失败原因就是我们的nginx容器中并不存在/healthz这个接口,所以响应码是404,并不在 200-399 状态码中,所以我们看到的Pod的Ready一直都是未就绪状态。

5.2、存活探针(Liveness Probe)
创建Pod资源清单:vim centos-liveness-probe.yaml
apiVersion: v1
kind: Pod
metadata:name: centos-liveness-probe
spec:containers:- name: centos-liveness-probeimage: centosargs:   # 容器启动时,执行如下的命令, 30s后删除/tmp/healthy文件- /bin/sh- -c- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600livenessProbe: # 存活探针exec: # 在容器内执行指定命令cat /tmp/healthycommand:- cat- /tmp/healthyinitialDelaySeconds: 5  # 等待5s后开始存活检查periodSeconds: 5  # 间隔5s检查一次在这个配置文件中,可以看到 Pod 中只有一个 Container。 periodSeconds 字段指定了 kubelet 应该每 5 秒执行一次存活探测。 initialDelaySeconds 字段告诉 kubelet 在执行第一次探测前应该等待 5 秒。 kubelet 在容器内执行命令 cat /tmp/healthy 来进行探测。 如果命令执行成功并且返回值为 0,kubelet 就会认为这个容器是健康存活的。 如果这个命令返回非 0 值,kubelet 会杀死这个容器并根据重启策略重新启动它。
当容器启动时,执行如下的命令:
/bin/sh -c "touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600"这个容器生命的前 30 秒,/tmp/healthy 文件是存在的。 所以在这最开始的 30 秒内,执行命令 cat /tmp/healthy 会返回成功代码。 30 秒之后,执行命令 cat /tmp/healthy 就会返回失败代码。
创建 Pod:
$ kubectl apply -f centos-liveness-probe.yaml 
pod/centos-liveness-probe created$ kubectl get pod -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
centos-liveness-probe   1/1     Running   0          9s    192.168.1.6   node01   <none>           <none># 在 30 秒内,查看 Pod 的事件
$ kubectl describe pod centos-liveness-probe
Name:             centos-liveness-probe
Namespace:        default
Priority:         0
Service Account:  default
Node:             node01/172.30.2.2
Start Time:       Mon, 16 Jan 2023 03:42:49 +0000
Labels:           <none>
Annotations:      cni.projectcalico.org/containerID: 74ae52265e8236ec904a23c98f8eb6a929df6709c29643f8cf3a624274105ab6cni.projectcalico.org/podIP: 192.168.1.6/32cni.projectcalico.org/podIPs: 192.168.1.6/32
Status:           Running
IP:               192.168.1.6
IPs:IP:  192.168.1.6
Containers:centos-liveness-probe:Container ID:  containerd://272c3f8bf293271f3657d98e1e23922312de46afebc3ed76a65104bbe4209e39Image:         centosImage ID:      docker.io/library/centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177Port:          <none>Host Port:     <none>Args:/bin/sh-ctouch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600State:          RunningStarted:      Mon, 16 Jan 2023 03:42:50 +0000Ready:          TrueRestart Count:  0Liveness:       exec [cat /tmp/healthy] delay=5s timeout=1s period=5s #success=1 #failure=3Environment:    <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-d69p9 (ro)
Conditions:Type              StatusInitialized       True Ready             True ContainersReady   True PodScheduled      True 
Volumes:kube-api-access-d69p9:Type:                    Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds:  3607ConfigMapName:           kube-root-ca.crtConfigMapOptional:       <nil>DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type    Reason     Age   From               Message----    ------     ----  ----               -------Normal  Scheduled  17s   default-scheduler  Successfully assigned default/centos-liveness-probe to node01Normal  Pulling    16s   kubelet            Pulling image "centos"Normal  Pulled     16s   kubelet            Successfully pulled image "centos" in 458.064227ms (458.070248ms including waiting)Normal  Created    16s   kubelet            Created container centos-liveness-probeNormal  Started    16s   kubelet            Started container centos-liveness-probe如上,可以看到,30s内输出结果表明还没有存活探针失败。
那么等待30s以后,我们再次查看Pod详细信息:
$ kubectl describe pod centos-liveness-probe
Name:             centos-liveness-probe
Namespace:        default
Priority:         0
Service Account:  default
Node:             node01/172.30.2.2
Start Time:       Mon, 16 Jan 2023 03:42:49 +0000
Labels:           <none>
Annotations:      cni.projectcalico.org/containerID: 74ae52265e8236ec904a23c98f8eb6a929df6709c29643f8cf3a624274105ab6cni.projectcalico.org/podIP: 192.168.1.6/32cni.projectcalico.org/podIPs: 192.168.1.6/32
Status:           Running
IP:               192.168.1.6
IPs:IP:  192.168.1.6
Containers:centos-liveness-probe:Container ID:  containerd://b03f2aaf2b854071223aae43cdfee4b9d1d4d3dd03f8ee7270b857817d362ca7Image:         centosImage ID:      docker.io/library/centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177Port:          <none>Host Port:     <none>Args:/bin/sh-ctouch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600State:          RunningStarted:      Mon, 16 Jan 2023 03:44:05 +0000Last State:     TerminatedReason:       ErrorExit Code:    137Started:      Mon, 16 Jan 2023 03:42:50 +0000Finished:     Mon, 16 Jan 2023 03:44:04 +0000Ready:          TrueRestart Count:  1Liveness:       exec [cat /tmp/healthy] delay=5s timeout=1s period=5s #success=1 #failure=3Environment:    <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-d69p9 (ro)
Conditions:Type              StatusInitialized       True Ready             True ContainersReady   True PodScheduled      True 
Volumes:kube-api-access-d69p9:Type:                    Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds:  3607ConfigMapName:           kube-root-ca.crtConfigMapOptional:       <nil>DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type     Reason     Age                 From               Message----     ------     ----                ----               -------Normal   Scheduled  109s                default-scheduler  Successfully assigned default/centos-liveness-probe to node01Normal   Pulled     108s                kubelet            Successfully pulled image "centos" in 458.064227ms (458.070248ms including waiting)Warning  Unhealthy  64s (x3 over 74s)   kubelet            Liveness probe failed: cat: /tmp/healthy: No such file or directoryNormal   Killing    64s                 kubelet            Container centos-liveness-probe failed liveness probe, will be restartedNormal   Pulling    33s (x2 over 108s)  kubelet            Pulling image "centos"Normal   Created    33s (x2 over 108s)  kubelet            Created container centos-liveness-probeNormal   Started    33s (x2 over 108s)  kubelet            Started container centos-liveness-probeNormal   Pulled     33s                 kubelet            Successfully pulled image "centos" in 405.865965ms (405.870664ms including waiting)在输出结果的最下面,有信息显示存活探针失败了(Liveness probe failed: cat: /tmp/healthy: No such file or directory),这个失败的容器被杀死并且被重建了。
再等 30 秒,这个容器被重启了,输出结果显示 RESTARTS 的值增加了 1。 请注意,一旦失败的容器恢复为运行状态,RESTARTS 计数器就会增加 1:
controlplane $ kubectl get pod -o wide
NAME                    READY   STATUS    RESTARTS      AGE     IP            NODE     NOMINATED NODE   READINESS GATES
centos-liveness-probe   1/1     Running   2 (69s ago)   3m39s   192.168.1.6   node01   <none>           <none>因为默认的重启策略restartPolicy是Always,所以centos-liveness-probe将会一直重启。
5.3、TCP就绪/存活探测
前面两个示例,分别演示了exec和httpGet探测方式,这里演示一下基于tcpSocket的探测方式。
创建资源清单文件:vim tcp-socket-probe.yaml
apiVersion: v1
kind: Pod
metadata:name: goproxylabels:app: goproxy
spec:containers:- name: goproxyimage: registry.k8s.io/goproxy:0.1ports:- containerPort: 8080readinessProbe:	# 就绪探针tcpSocket:port: 8080initialDelaySeconds: 5periodSeconds: 10livenessProbe:	# 存活探针tcpSocket:port: 8080initialDelaySeconds: 15periodSeconds: 20如上配置,kubelet 会在容器启动 5 秒后发送第一个就绪探针。 探针会尝试连接 goproxy 容器的 8080 端口。 如果探测成功,这个 Pod 会被标记为就绪状态,kubelet 将继续每隔 10 秒运行一次探测。
除了就绪探针,这个配置包括了一个存活探针。 kubelet 会在容器启动 15 秒后进行第一次存活探测。 与就绪探针类似,存活探针会尝试连接 goproxy 容器的 8080 端口。 如果存活探测失败,容器会被重新启动。
$ kubectl apply -f tcp-socket-probe.yaml 
pod/goproxy created$ kubectl get pod/goproxy -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
goproxy   1/1     Running   0          99s   192.168.1.3   node01   <none>           <none>可以看到,goproxy容器的READY为1/1,说明就绪探测成功了,并且STATUS为Running运行状态,说明goproxy容器当前是健康的。
$ kubectl describe pod/goproxy
Name:             goproxy
Namespace:        default
Priority:         0
Service Account:  default
Node:             node01/172.30.2.2
Start Time:       Mon, 16 Jan 2023 05:15:18 +0000
Labels:           app=goproxy
Annotations:      cni.projectcalico.org/containerID: 24cf48d7ee8e5ea9fe846afb16510c46cd63c9214c3a54aa2d548e647aa162fbcni.projectcalico.org/podIP: 192.168.1.3/32cni.projectcalico.org/podIPs: 192.168.1.3/32
Status:           Running
IP:               192.168.1.3
IPs:IP:  192.168.1.3
Containers:goproxy:Container ID:   containerd://c07e285dda94eb1ebc75c7aef01dc1816d4f027c007a7bb741b2a023ab4112d2Image:          registry.k8s.io/goproxy:0.1Image ID:       registry.k8s.io/goproxy@sha256:5334c7ad43048e3538775cb09aaf184f5e8acf4b0ea60e3bc8f1d93c209865a5Port:           8080/TCPHost Port:      0/TCPState:          RunningStarted:      Mon, 16 Jan 2023 05:15:21 +0000Ready:          TrueRestart Count:  0Liveness:       tcp-socket :8080 delay=15s timeout=1s period=20s #success=1 #failure=3Readiness:      tcp-socket :8080 delay=5s timeout=1s period=10s #success=1 #failure=3Environment:    <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-4bcg8 (ro)
Conditions:Type              StatusInitialized       True Ready             True ContainersReady   True PodScheduled      True 
Volumes:kube-api-access-4bcg8:Type:                    Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds:  3607ConfigMapName:           kube-root-ca.crtConfigMapOptional:       <nil>DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type    Reason     Age    From               Message----    ------     ----   ----               -------Normal  Scheduled  3m27s  default-scheduler  Successfully assigned default/goproxy to node01Normal  Pulling    3m26s  kubelet            Pulling image "registry.k8s.io/goproxy:0.1"Normal  Pulled     3m24s  kubelet            Successfully pulled image "registry.k8s.io/goproxy:0.1" in 2.531715761s (2.53172162s including waiting)Normal  Created    3m24s  kubelet            Created container goproxyNormal  Started    3m24s  kubelet            Started container goproxy六、Liveness Probe(存活探针) VS Readiness Probe(就绪探针)
| liveness probe(存活探针) | readiness probe(就绪探针) | |
| 用途 | 判断容器是否存活 | 判断Pod是否就绪 | 
| 检测期 | Pod运行期 | Pod启动期 | 
| 失败处理 | Kill容器 | 停止向Pod发送流量 | 
| 探针类型 | httpGet、exec、tcpSocket | httpGet、exec、tcpSocket | 
相关文章:
 
15、Kubernetes核心技术 - 探针
目录 一、概述 二、探针类型 2.1、就绪探针(Readiness Probe) 2.2、存活探针(Liveness Probe) 三、探针探测方法 3.1、exec 3.2、httpGet 3.3、tcpSocket 四、探针配置项 五、探针使用 5.1、就绪探针(Readin…...
GTK4 环境配置
1 安装gtk4包裹: # sudo yum install gtk4 gtk4-devel gtk4-devel-docs devhelp glib2 glib2-devel glib2-doc 2 安装 glade 4 git clone https://github.com/ag-python/cambalache.git 记住 把软件目录 复制到 一个你不会移动删除的地方(千万别删除这个软件文件夹 因为运行…...
Yolov8部署——segmentation部署以及批量推理
Yolov8部署——segmentation部署以及批量推理 参考:在windows上部署Yolov8主要参考下面两个仓库,https://github.com/xunzixunzi/tensorrt-cpp-api和https://github.com/xunzixunzi/YOLOv8-TensorRT-CPP,代码说是适合批量处理,但是代码中是以…...
 
再见2023,你好2024!
大家好,我是老三,本来今天晚上打算出去转一转,陆家嘴打车实在太艰难了,一公里多的路,司机走了四十分钟,还没到,再加上身体不适,咳嗽地比较厉害,所以还是宅在酒店里&#…...
 
【计算机毕业设计】SSM二手交易网站
项目介绍 该项目分为前后台,前台普通用户角色,后台管理员角色。 管理员主要功能如下: 登陆,商品分类管理,商品管理,商品订单管理,用户管理等功能。 用户角色主要功能如下: 包含以下功能:查看所有商品,用户登陆注册…...
 
纠删码ReedSolomon
随着大数据技术的发展,HDFS作为Hadoop的核心模块之一得到了广泛的应用。为了数据的可靠性,HDFS通过多副本机制来保证。在HDFS中的每一份数据都有两个副本,1TB的原始数据需要占用3TB的磁盘空间,存储利用率只有1/3。而且系统中大部分…...
C++音视频开发技巧汇总(持续更新)
1.录制PCM数据 有时候我们需要录制PCM数据到文件以测试录制数据是否正确,一般可以使用以下代码实现: FILE *pf; fopen_s(&pf, "rec.pcm", "wb"); fwrite(myPcmArr, 1, outBufferLen, pf); 录制pcm文件后可以使用Audacity来导…...
 
4462 4.曙曙献爱心
#include<bits/stdc.h> using namespace std; int n,m,k; int a[1001]; int s[1001]; int f[1001][1001];//f[i][j],i个警察,j个点,能管理的最大人数 int main(){cin>>n>>m>>k;for(int i1;i<n;i){cin>>a[i…...
浅谈命令模式
命令模式是一种行为设计模式,用于将一个请求封装成一个对象,从而使得请求的发送者和接收者解耦,并支持对请求进行参数化、队列化、撤销和重做等操作。 在命令模式中,有一下介个关键角色: Command(命令&am…...
 
软件测试/测试开发丨Python 模块与包
python 模块与包 python 模块 项目目录结构 组成 package包module模块function方法 模块定义 定义 包含python定义和语句的文件.py文件作为脚本运行 导入模块 import 模块名from <模块名> import <方法 | 变量 | 类>from <模块名> import * 注意&a…...
 
java企业网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 java Web企业网站系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…...
 
MAC电脑安装java开发工具
一、安装brew 1.1、官网地址 链接 1.2、更新地址 二、安装 java brew install openjdk11 三、安装gradle Gradle安装与配置教程 - 知乎 四、GIT 4.1、GIT安装 brew install git 4.2、rsa ssh-keygen -t rsa -C "jhestarbucks.com" 五、自动搭建一个springBoot…...
 
高压继电器,未来几年市场将保持稳定增长
高压继电器是一种用于控制大功率电气设备的开关装置,广泛应用于电力系统、轨道交通、工业自动化等领域。随着各行业对电气控制需求的不断增加,高压继电器市场也在不断扩大。全球高压继电器市场分析: 在全球市场中,目前主要的高压继…...
 
在Go语言中实现HTTP请求的缓存
大家好,我是你们可爱的编程小助手,今天我们要一起探讨如何使用Go语言实现HTTP请求的缓存。听起来是不是很酷?让我们开始吧! 首先,我们要明白什么是缓存。简单来说,缓存就是将数据存储在内存中,…...
 
技术扫盲:如何优雅的使用 java -jar
java -jar xxx.jar java -jar 是一个用于在命令行界面中执行 Java 可执行 JAR 文件的命令。它的语法如下: java -jar <JAR 文件路径> [参数]其中: java 是 Java 运行时环境的可执行文件。-jar 是一个选项,表示要执行的文件是一个 JA…...
 
『番外篇七』SwiftUI 获取视图全局位置在 NavigationStack 中失效的解决方法
概览 在 番外篇六』SwiftUI 取得任意视图全局位置的三种方法 这篇博文里,我们详细讨论了在 SwiftUI 中获取任意视图全局坐标的几种方法。 不过,我们也从中提到了某些方法无法适用于 NavigationStack 视图,本篇博文由此应运而生。 在本篇博文种,您将学到如下内容: 概览1.…...
 
GBASE南大通用 GCDW阿里云计算巢:自动化部署云原生数据仓库
目前,GBASE南大通用已与阿里云计算巢合作,双方融合各自技术优势,助力企业用户实现云上数据仓库的自动化部署,让用户在云端获取数据仓库服务“更简单”,让用户在云端使用数据仓库服务“更便捷”,满足企业用户…...
 
Docker实战02|Namespace
在上一文《Docker实战01|容器与开发语言》中主要介绍了Docker的基本概念与Docker安装、Go语言安装等实战技巧。 本文继续针对Namespace技术展开讲解并利用Go语言进行实践。 本系列所有代码均已经开源。关公众号回复「Go语言实现Docker」即可获得。 目录 2.1.2 U…...
 
01-03
利用模板类完成顺序表...
数据可视化与地理空间
写在开头 数据可视化是将数据以图形形式呈现,使其更易于理解和分析的过程。在地理空间分析中,数据可视化不仅能够展示地理位置信息,还能够有效地传达地理空间数据的模式、趋势和关联。本文将探讨数据可视化在地理空间分析中的作用,介绍Python中常用的数据可视化工具,并深…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
 
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
 
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
 
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
 
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
 
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
 
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
 
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器:  线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。  每个线程都有一个程序计数…...
 
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
