【Prometheus】PromQL进阶用法

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生k8s,Prometheus监控,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:Prometheus监控系统零基础到进阶
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • PromQL进阶用法
    • 1、PromQL资源监控案例
      • 1.1 监控系统资源方法论
      • 1.2 使用USE监控系统资源
    • 2、CPU监控案例实践
      • 2.1 CPU重点监控的维度
      • 2.2 计算CPU平均使用率
      • 2.3 计算CPU饱和度
      • 2.4 配置CPU告警规则
    • 3、内存监控案例实践
      • 3.1 内存重点监控的维度
      • 3.2 计算内存使用率
      • 3.3 计算内存饱和度
      • 3.4 配置内存告警规则
    • 4、磁盘监控案例实践
      • 4.1 磁盘重点监控的维度
      • 4.2 计算磁盘空间使用率
      • 4.3 计算磁盘IO吞吐量
      • 4.4 计算磁盘IOPS
      • 4.5 配置磁盘告警规则
    • 5、网络监控案例实践
      • 5.1 网络重点监控的维度
      • 5.2 计算网络传输速率
      • 5.3 计算网络连接数使用率
      • 5.4 配置网络告警规则

PromQL进阶用法

1、PromQL资源监控案例

资源监控无外乎CPU,内存,磁盘,网络等。
怎么监控呢?需要找到具体的指标,寻找指标又要用到方法论,如下:

1.1 监控系统资源方法论

1、Google 的四个黄金指标着眼点在“服务监控”,这四个指标分别是“延迟、
流量、错误、饱和度”
2、RED方法主要着眼点在“用户体验”,它基于Google的黄金指标,细化了
三个关键指标,“请求率、错误数、请求处理时间”
3、USE方法主要着眼点在“系统资源”,的使用情况,这三个指标分别是“使
用率、饱和度、错误”。因此USE方法是最适合系统资源监控的

1.2 使用USE监控系统资源

在监控CPU、内存、磁盘和⽹络等系统资源时,使⽤USE的⽅法论是最为合适
的,它要求我们针对每个资源(也就是CPU、内存 、⽹络等)分别检查三个关键
方面:使用率、饱和度和错误。
使用率:表示资源在占作时占用的平均时间,例如,CPU在过去的60秒内有
30秒被用来执行指令,那么我们可以说这个CPU的使用率是50%。
饱和度:指明资源已经到达或接近其处理能力极限的程度,表明无法再处理
更多的工作量。这通常通过队列长度等指标来衡量。
错误:记录了资源在运行过程中发生的错误事件的次数。网络监控用的比较多

2、CPU监控案例实践

2.1 CPU重点监控的维度

对于CPU资源的监控,采用USE方法论通常关注以下几点:
CPU使用率:衡量CPU在一段时间内处于活跃状态的百分比。高使用率可能表明系统正在密集执行任务。
CPU饱和度:反映了在某一时间点等待CPU时间的进程数量。高饱和度可能意味着有很多任务在争夺CPU资源。
错误:通常对CPU不太有影响;
案例1:监控CPU1分钟的平均使用率;
案例2:监控CPU的饱和度;

2.2 计算CPU平均使用率

计算CPU平均使用率的公式: (1 - CPU 空闲率) * 100 = CPU 使用率

第一步:获取每个CPU模式的变化率,使用irate函数灵敏度更高,反映更接近实际使用率。

rate(node_cpu_seconds_total[1m])

第二步:查询CPU的空闲时间比率,即CPU处于空闲状态的时间比例。

irate(node_cpu_seconds_total{mode="idle"}[1m])

第三步:系统可能会有多个CPU核心,因此我们需要通过avg聚合函数来计算CPU平均空闲率,最后按照实例进行分组统计。

avg(irate(node_cpu_seconds_total{mode="idle"}[1m])) by (instance)

第四步:使用1减去每个核心的平均空闲率,得到平均使用率,然后将此值乘以100,转换为百分比,最终得出CPU的整体平均使用率

(1 - avg(irate(node_cpu_seconds_total{mode="idle"}[1m])) by (instance) ) *100

2.3 计算CPU饱和度

评估主机的CPU饱和度,最常用的方法是跟踪系统的平均负载。通常情况下,如
果这个负载的值低于CPU核心的数量,可以认为系统运行正常。然而,当平均负
载持续高于CPU核心数量的两倍时,这通常是CPU已经非常饱和了。
计算CPU饱和度的公式:1分钟平均负载 / (CPU核⼼数*2) * 100 = CPU饱和度
的百分比,当大于80%则认为CPU已经接近处理能力的极限。

第一步:获取1分钟平均负载值,然后按照实例和job进行分组计算。

sum(node_load1) by (instance,job)

第二步:获取CPU的核心数,然后乘以2,按实例进行分组计算每个实例的核心数。 这个mode找空闲的还是其他的都可以,因为是要查找CPU核心数

(count(node_cpu_seconds_total{mode="idle"}) by (instance,job) * 2)

第三步:计算CPU饱和度百分比,如果这个百分比大于80%,我们认为CPU已经
非常饱和,并且已经达到了处理能力的极限。

sum(node_load1) by (instance,job) / (count(node_cpu_seconds_total{mode="idle"}) by (instance,job) * 2) * 100 > 80

在这里插入图片描述

2.4 配置CPU告警规则

1、定义CPU告警规则组,然后注入两条规则
cat /etc/prometheus/rules/node_rules.yml
以groups开头

groups:
- name: CPU告警规则rules:- alert: 节点CPU使用率超过80%expr: ( 1 - avg(irate(node_cpu_seconds_total{mode="idle"}[1m])) by (instance,job) ) * 100 > 80for: 1mlabels:severity: warningannotations:summary: "主机CPU利用率过高,实例:{{ $labels.instance }}, 任务:{{ $labels.job }}"description: "该实例的CPU利用率高于80%,当前利用率:{{ $value }}%。请及时检查。"- alert: CPU饱和度过高expr: sum(node_load1) by (instance,job) / (count(node_cpu_seconds_total{mode="idle"}) by (instance,job) * 2) * 100 > 80for: 2mlabels:severity: criticalannotations:summary: "CPU饱和度过高,实例:{{ $labels.instance }}, 任务:{{ $labels.job }}"description: "该实例的1分钟平均CPU负载超过了核心数的两倍,已经持续2分钟,当前CPU饱和度:{{ $value }}%。需要立即检查系统负载情况。"

在这里插入图片描述

如果想要prometheus读取到我们配置的告警规则,需要让prometheus能够读取到该配置文件
我们先看下默认的prometheus.yml配置文件写法
需要指定告警规则的yml文件路径
在这里插入图片描述

如果告警规则比较多,我们可以指定某个路径下的所有yml文件
在这里插入图片描述

然后执行prometheus热加载

curl -X POST http://localhost:9090/-/reload

检查配置文件格式是否正确

./promtool check config prometheus.yml

在这里插入图片描述

然后在prometheus的alert界面,就可以看到我们配置的告警规则
在这里插入图片描述

3、内存监控案例实践

3.1 内存重点监控的维度

对于内存资源的监控,采用USE方法论通常关注以下几点:
1、内存使用率:衡量系统内存被使用的程度。
2、内存饱和度:表明系统内存的负载程度。内存饱和度,通常监控SWAP的使用率来评估。
3、内存错误:通常较少发生。
案例1:计算内存使用率;
案例2:计算内存饱和度;

3.2 计算内存使用率

计算内存使用率百分比公式: ( 总内存 - 可用内存)/ 总内存 * 100 = 内存使用率

(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100

在这里插入图片描述

3.3 计算内存饱和度

计算内存饱和度百分比公式: (总SWAP - 未使用的SWAP) / 总SWAP * 100> 20

(node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes) / node_memory_SwapTotal_bytes * 100

3.4 配置内存告警规则

1、定义内存告警规则组,然后注入两条规则
[root@prom-node01 ~]# cat /etc/prometheus/rules/node_rules.yml

groups:
- name: 内存告警规则rules:- alert: 主机内存不足expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 80for: 2mlabels:severity: warningannotations:summary: "主机内存使用率较高, 实例:{{ $labels.instance }}, 任务:{{ $labels.job }}"description: "该实例的内存使用率持续2分钟高于80%,当前利用率:{{ $value}}%"- alert: 内存饱和度高expr: (node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes) / node_memory_SwapTotal_bytes * 100 > 10for: 2mlabels:severity: warningannotations:summary: "主机内存内存饱和度高, 实例:{{ $labels.instance }}, 任务:{{ $labels.job }}"description: "SWAP内存使用率已连续2分钟超过10%,表明内存饱和度过高,当前SWAP使用率为:{{ $value }}%。"

我们可以去掉–name 和rules
在这里插入图片描述

这样,告警规则就在一个分组下
在这里插入图片描述

如果我们加上,就单独是一个分组
在这里插入图片描述
在这里插入图片描述

4、磁盘监控案例实践

4.1 磁盘重点监控的维度

对于磁盘,我们不光需要度量磁盘使用率,甚至还需要度量 磁盘IO读写吞吐量、以及磁盘IOPS
1、磁盘使用率:衡量磁盘空间使用率、Inode使用率;
2、磁盘延迟:有些磁盘明确标注了延迟,我们可以监控磁盘的读写延迟,而后进行判定;
3、磁盘饱和度:通过监控I/O吞吐量和IOPS,可以衡量磁盘在繁忙时段的饱和度情况。

案例1:计算磁盘空间使用率、磁盘Inode空间使用率;
案例2:计算磁盘的IO吞吐量的饱和度;
案例3:计算IOPS每秒读写次数的饱和度;

常规磁盘的每秒的IOPS能力和IO吞吐量,有标准后,就好基于标准进行触发器设定,例如当IOPS每秒读写次数的饱和度超过80%则需要关注了
在这里插入图片描述

4.2 计算磁盘空间使用率

计算磁盘空间使用率:(总的磁盘空间 - 可用的磁盘空间 = 已用的磁盘空间) / 总的磁盘空间 * 100
计算Inode空间使用率:( 总的Inode数 - 可用的inode数) / 总的inode数 * 100

1、计算不同分区的磁盘空间使用率(排除tmpfs的分区)

( node_filesystem_size_bytes{device!="tmpfs"} - node_filesystem_avail_bytes{device!="tmpfs"} ) / node_filesystem_size_bytes{device!="tmpfs"} * 100 

在这里插入图片描述

2、计算inode使用率(排除tmpfs的分区)

(node_filesystem_files{device!="tmpfs"} - node_filesystem_files_free{device!="tmpfs"} ) / node_filesystem_files{device!="tmpfs"} * 100 

在这里插入图片描述

4.3 计算磁盘IO吞吐量

I/O吞吐量:衡量在单位时间内磁盘能够读写多少数据量,通常以MB/s(兆字节每秒)为单位。
I/O吞吐量饱和度(%)=(当前IO吞吐量 / 磁盘的最大IO吞吐量能力)× 100
要根据不同的磁盘类型来确定磁盘的最大IO吞吐能力,如果使用云主机,厂商告诉你磁盘的最大吞吐能力为多大

磁盘吞吐量指标
在这里插入图片描述

1、模拟IO写入吞吐量,并限制写入IO最大20MB/s

yum install pv -ydd if=/dev/zero bs=1M count=10000 | pv -L 20M > /tmp/bigdata

在这里插入图片描述

2、获取当前磁盘最近1分钟的,写入吞吐量最大的值,然后按实例进行分组计算,最后将结果转为MB

max(rate(node_disk_written_bytes_total[1m])) by (instance,job) / 1024 /1024

在这里插入图片描述

3、使用当前IO写入吞吐量 除以 磁盘最大写入I/O吞吐量30MB/s,而后乘以100,获取I/O吞吐的饱和度百分比

(max(rate(node_disk_written_bytes_total[1m])) by (instance,job) / 1024 /1024) / 30 * 100

在这里插入图片描述

# 告警(当IO写入吞吐大于80%则触发告警),round四舍五入取整数
round(max(rate(node_disk_written_bytes_total[1m])) by (instance,job) / 1024/1024 / 30 * 100) > 60

4、模拟IO读取吞吐量,并限制读取IO最大20MB/s

# yum install pv -y
pv -L 20M /tmp/bigdata > /dev/null

在这里插入图片描述

5、获取当前磁盘最近1分钟的,读取吞吐量最大的值,然后按实例进行分组计算,最后将结果转为MB

max(rate(node_disk_read_bytes_total[1m])) by (instance,job) / 1024 /1024

在这里插入图片描述

6、使用当前IO读取吞吐量 除以 磁盘最大读取I/O吞吐量30MB/s,而后乘以100,获取I/O吞吐的饱和度百分比

max(rate(node_disk_read_bytes_total[1m])) by (instance,job) / 1024 /1024 /30 * 100

在这里插入图片描述

# 告警(当IO读取吞吐大于60%则触发告警)
round(max(irate(node_disk_read_bytes_total[1m])) by (instance,job) / 1024 /1024 /30 * 100 ) > 60

4.4 计算磁盘IOPS

IOPS:衡量在单位时间内磁盘能够读写操作的次数。
IOPS饱和度(%)=(当前IOPS / 磁盘的最大IOPS能力)× 100

iops指标
在这里插入图片描述

1、模拟IO写入,也相当于有大量IOPS

dd if=/dev/zero bs=1M count=10000 | pv -L 100M > /tmp/bigdata

在这里插入图片描述

2、获取当前磁盘最近1分钟的,IOPS写入次数的最大的值,然后按实例进行分组计算

max(irate(node_disk_writes_completed_total[1m])) by (instance,job)

在这里插入图片描述

3、使用当前IOPS写入次数 除以 磁盘最大IOPS,这里是120,而后乘以100,获取IOPS写入的饱和度百分比

max(irate(node_disk_writes_completed_total[1m])) by (instance,job) / 120 *100

在这里插入图片描述

# 告警(当IOPS饱和度大于60%则触发告警)
round(max(irate(node_disk_writes_completed_total[1m])) by (instance,job) /120 * 100) > 60

4、模拟IO读取,也相当于有大量IOPS

yum install pv -y
pv -L 50M /tmp/bigdata > /dev/null

在这里插入图片描述

5、获取当前磁盘最近1分钟的,读取IOPS最大次数的值,然后按实例进行分组计算

max(irate(node_disk_reads_completed_total[1m])) by (instance,job)

在这里插入图片描述

6、使用当前IO读取吞吐量 除以 磁盘最大读取I/O吞吐量,而后乘以100,获取IOPS读取的饱和度百分比

max(irate(node_disk_reads_completed_total[1m])) by (instance,job) / 120 * 100

在这里插入图片描述

# 告警(当IOPS读取大于60%则触发告警)
round(max(irate(node_disk_reads_completed_total[1m])) by (instance,job) / 120 * 100) > 60

4.5 配置磁盘告警规则

1、编写磁盘告警规则文件

groups:
- name: 磁盘告警规则rules:- alert: 磁盘空间告急expr: ( node_filesystem_size_bytes{device!="tmpfs"} - node_filesystem_avail_bytes{device!="tmpfs"} ) / node_filesystem_size_bytes{device!="tmpfs"} * 100 > 70for: 1mlabels:severity: criticalannotations:summary: "实例 {{ $labels.instance }} 磁盘 {{ $labels.mountpoint }}分区空间不足"description: "实例 {{ $labels.instance }} 磁盘 {{ $labels.mountpoint}} 分区空间使用率已超过 70%,当前使用率为 {{ $value }}%,请及时处理。"- alert: 磁盘Inode空间告急expr: (node_filesystem_files{device!="tmpfs"} - node_filesystem_files_free{device!="tmpfs"} ) / node_filesystem_files{device!="tmpfs"} * 100 > 70for: 1mlabels:severity: criticalannotations:summary: "实例 {{ $labels.instance }} 磁盘 {{ $labels.mountpoint }}分区Inode空间不足"description: "实例 {{ $labels.instance }} 磁盘 {{ $labels.mountpoint}} 分区的Inode空间使用率已超过 70%,当前使用率为 {{ $value }}%,请及时处理。"- alert: 磁盘IOPS写入较高#expr: sum(rate(node_disk_writes_completed_total[1m])) by (instance,job) / 120 * 100 >60#round函数可以对值进行四舍五入expr: round(max(irate(node_disk_writes_completed_total[1m])) by (instance,job) / 120 * 100,0.01) > 60for: 1mlabels:severity: criticalannotations:summary: "实例 {{ $labels.instance }} IOPS每秒写入次数超过120次/s"description: 目前磁盘IOPS写入饱和度是 {{ $value }}%,目前磁盘IOPS每秒写入最大 {{ printf `max(rate(node_disk_writes_completed_total{instance="%s",job="%s"}[1m]))` $labels.instance $labels.job | query | first | value | printf "%.2f" }} 次/s- alert: 磁盘IOPS读取较高expr: round(max(irate(node_disk_reads_completed_total[1m])) by (instance,job) / 120 * 100) > 60for: 1mlabels:severity: criticalannotations:summary: "实例 {{ $labels.instance }} IOPS每秒读取次数超过120次/s"description: 目前磁盘IOPS读取饱和度是 {{ $value }}%,目前磁盘IOPS每秒读取最大{{ printf `max(rate(node_disk_reads_completed_total{instance="%s",job="%s"}[1m]))` $labels.instance $labels.job | query | first | value | printf "%.2f" }} 次/s- alert: 磁盘IO写入吞吐较高expr: round(max(rate(node_disk_written_bytes_total[1m])) by (instance,job) / 1024 /1024 / 30 * 100) > 60for: 1mlabels:severity: criticalannotations:summary: "实例 {{ $labels.instance }} 磁盘IO写入每秒超过最大30MB/s"description: 目前磁盘IO写⼊吞吐量的饱和度是 {{ $value }}%。目前磁盘IO写入吞吐量每秒最大是 {{ printf `max(rate(node_disk_written_bytes_total{instance="%s",job="%s"}[1m])) /1024/1024` $labels.instance $labels.job | query | first | value | printf "%.2f" }}MB/s- alert: 磁盘IO读取吞吐较高expr: round(max(rate(node_disk_read_bytes_total[1m])) by (instance,job) / 1024 /1024 /30 * 100 ) > 60for: 1mlabels:severity: criticalannotations:summary: "实例 {{ $labels.instance }} 磁盘IO读取每秒超过最大30MB/s"description: 目前磁盘IO读取吞吐量的饱和度是 {{ $value }}%。目前磁盘IO读取吞吐量每秒最大是 {{ printf `max(rate(node_disk_read_bytes_total{instance="%s",job="%s"}[1m])) /1024/1024` $labels.instance $labels.job | query | first | value | printf "%.2f" }}MB/s

在这里插入图片描述
在这里插入图片描述

5、网络监控案例实践

5.1 网络重点监控的维度

对于网络,通常使用USE方法监控如下几个维度:
1、网络传输速率:即当前网络每秒传输的带宽。
2、网络饱和度:对于网络饱和度,通常查看网络是否丢包严重,如果持续有丢包情况则认为目前网络比较饱和;
3、网络错误率:可以通过监控网络发送和接收的错误来获得;
案例1:计算网络每秒传输带宽;
案例2:计算网络饱和度,例如:当带宽速率达到100%,并且发送和接收的丢包率持续上升则告警 node_network_transmit_drop_total、node_network_receive_drop_total
案例3:计算网络TCP连接数使用率;

5.2 计算网络传输速率

网络传输速率 = irate(网络接口 “发送/接收” 的总数据量) * 8 /1024 /1024 =Mbps

1、模拟带宽

# 1、在两个测试的节点上安装:yum install iperf -y
# 2、服务端运行并指定端口:iperf -s -p 9999

在这里插入图片描述

3、客户端模拟带宽发送命令,-b指定发送大小,-t指定发送持续时间:iperf -c -p 9999 -b 300M -t 60
在这里插入图片描述

2、获取最大的下载带宽,也就是每秒能接收多少Mbps

max(irate(node_network_receive_bytes_total[1m]) * 8 / 1024 / 1024) by (instance,job,device)

在这里插入图片描述

3、获取最大的上传带宽,也就是每秒能上传多少Mbps

max(irate(node_network_transmit_bytes_total[1m]) * 8 / 1024 / 1024) by (instance,job,device)

在这里插入图片描述

4、假设公司带宽是500Mbps,我希望达到400Mbps时则触发告警,计算公式: 网络每秒传输带宽 / 网络最大带宽 * 100 >= 80
下载

max(irate(node_network_receive_bytes_total[1m]) * 8 / 1024 / 1024) by (instance,job,device) / 500 * 100 >= 80

在这里插入图片描述

上传

max(irate(node_network_transmit_bytes_total[1m]) * 8 / 1024 / 1024) by (instance,job,device) / 500 * 100 >= 80

在这里插入图片描述

5.3 计算网络连接数使用率

网络连接率 = 当前活跃TCP连接数 / 系统内核最大支持的TCP连接数 * 100

(node_nf_conntrack_entries / node_nf_conntrack_entries_limit) * 100
# 告警
(node_nf_conntrack_entries / node_nf_conntrack_entries_limit) * 100 > 80

在这里插入图片描述

5.4 配置网络告警规则

1、配置网络告警规则

- name: 网络告警规则rules:- alert: 网络下载带宽占用过高,超过80%expr: max(irate(node_network_receive_bytes_total[1m]) * 8 / 1024 / 1024) by (instance,job,device) / 50 * 100 >= 80for: 1mlabels:severity: criticalannotations:summary: "实例 {{ $labels.instance }} 的 {{ $labels.device }} 接口下载流量即将超过公司实际50Mbps"description: 目前下载带宽已经达到 {{ printf `(irate(node_network_receive_bytes_total{instance="%s",job="%s",device="%s"}[1m]) * 8 / 1024 / 1024)` $labels.instance $labels.job $labels.device | query | first | value | printf "%.2f"}} Mbps/s 目前下载带宽使用率在 {{ $value }}%- alert: 网络上传带宽占用过高,超过80%expr: max(irate(node_network_transmit_bytes_total[1m]) * 8 / 1024 / 1024) by (instance,job,device) / 50 * 100 >= 80for: 1mlabels:severity: criticalannotations:summary: "实例 {{ $labels.instance }} 的 {{ $labels.device }} 接口上传流量即将超过公司实际50Mbps"description: 目前上传带宽已经达到 {{ printf `(irate(node_network_transmit_bytes_total{instance="%s",job="%s",device="%s"}[1m]) * 8 / 1024 / 1024)` $labels.instance $labels.job $labels.device | query | first | value | printf "%.2f"}} Mbps/s 目前上传带宽使用率在 {{ $value }}%- alert: 网络TCP连接数过高,超过80%expr: node_nf_conntrack_entries / node_nf_conntrack_entries_limit * 100 > 80for: 1mlabels:severity: criticalannotations:summary: "实例 {{ $labels.instance }} 的 tcp连接数超过80%"description: 目前TCP连接数是 {{ printf `node_nf_conntrack_entries{instance="%s",job="%s"}` $labels.instance $labels.job | query | first | value" }} 目前TCP连接使用率是 {{ $value }}%

最后一个TCP的没法用,我们先去掉
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++《AVL树》

在之前的学习当中我们已经了解了二叉搜索树,并且我们知道二叉搜索树的查找效率是无法满足我们的要求,当二叉树为左或者右斜树查找的效率就很低下了,那么这本篇当中我们就要来学习对二叉搜索树进行优化的二叉树——AVL树。在此会先来了解AVL树…

微信小程序:实现单选,多选,通过变量控制单选/多选

一、实现单选功能 微信小程序提供了 radio 组件来实现单选功能。radio 组件需要配合 radio-group 使用。 1. WXML 代码 <radio-group bindchange"onRadioChange"><label wx:for"{{items}}" wx:key"id"><radio value"{{it…

《Effective Java》学习笔记——第1部分 创建对象和销毁对象的最佳实践

文章目录 第1部分 创建和销毁对象一、前言二、创建和销毁对象最佳实践内容1. 优先使用工厂方法而非直接使用构造器2. 避免创建不必要的对象3. 避免使用过多的构造器4. 避免使用原始类型&#xff08;Raw Types&#xff09;5. 避免创建对象的过度依赖6. 清理资源和关闭对象&#…

解决conda create速度过慢的问题

问题 构建了docker容器 想在容器中创建conda环境&#xff0c;但是conda create的时候速度一直很慢 解决办法 宿主机安装的是anaconda 能正常conda create,容器里安装的是miniforge conda create的时候速度一直很慢&#xff0c;因为容器和宿主机共享网络了&#xff0c;宿主机…

【知识分享】PCIe5.0 TxRx 电气设计参数汇总

目录 0 引言 1 参考时钟--Refclk 2 发射端通道设计 3 发送均衡技术 4 接收端通道设计 5 接收均衡技术 6 结语 7 参考文献 8 扩展阅读 0 引言 PCI Express Base Specification 5.0的电气规范中&#xff0c;关键技术要点如下&#xff1a; 1. 支持2.5、5.0、8.0、16.0和3…

Java 的初认识(一)

好久不见兄弟们&#xff01;之前更新完 C 语言的内容之后呢&#xff0c;我是做了一个“ 短暂 ”的休息昂&#xff0c;当然我自己的学习是没有停歇的&#xff0c;只是在更新博客这上面休息了一下&#xff0c;主要还是想让自己先把这部分的知识掌握透彻了之后&#xff0c;再来为大…

2024年美赛C题评委文章及O奖论文解读 | AI工具如何影响数学建模?从评委和O奖论文出发-O奖论文做对了什么?

模型假设仅仅是简单陈述吗&#xff1f;允许AI的使用是否降低了比赛难度&#xff1f;还在依赖机器学习的模型吗&#xff1f;处理题目的方法有哪些&#xff1f;O奖论文的优点在哪里&#xff1f; 本文调研了当年赛题的评委文章和O奖论文&#xff0c;这些问题都会在文章中一一解答…

C语言练习(17)

两个乒乓球队进行比赛&#xff0c;各出3人。甲队为A、B、C 3人&#xff0c;乙队为X、Y、Z 3人&#xff0c;并抽签决定比赛名单。有人向队员打听比赛的名单&#xff0c;A说他不和X比&#xff0c;C说他不和X、Z比&#xff0c;请编程序找出3对选手的对阵名单。 #include <stdi…

【回忆迷宫——处理方法+DFS】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 250; int g[N][N]; bool vis[N][N]; int dx[4] {0, 0, -1, 1}; int dy[4] {-1, 1, 0, 0}; int nx 999, ny 999, mx, my; int x 101, y 101; //0墙 (1空地 2远方) bool jud(int x, int y) {if…

Flowable 审核功能封装

文章目录 引言I 查询当前用户需要审核的数据列表整体逻辑根据组获取任务数据根据审核人获取任务数据II 进行审核整体逻辑III 审核历史查询IV 流程图查看流程进度思路根据任务 ID 获取任务进度流程图引言 流程引擎功能封装 : 审核列表数据查询进行审核的整体逻辑:获取任务 Id,…

Java-数据结构-二叉树习题(2)

第一题、平衡二叉树 ① 暴力求解法 &#x1f4da; 思路提示&#xff1a; 该题要求我们判断给定的二叉树是否为"平衡二叉树"。 平衡二叉树指&#xff1a;该树所有节点的左右子树的高度相差不超过 1。 也就是说需要我们会求二叉树的高&#xff0c;并且要对节点内所…

github汉化

本文主要讲述了github如何汉化的方法。 目录 问题描述汉化步骤1.打开github&#xff0c;搜索github-chinese2.打开项目&#xff0c;打开README.md3.下载安装脚本管理器3.1 在README.md中往下滑动&#xff0c;找到浏览器与脚本管理器3.2 选择浏览器对应的脚本管理器3.2.1 点击去…

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证8)

为进一步测试通过请求头传递token进行身份验证&#xff0c;在main.htm中增加layui的数据表格组件&#xff0c;并调用后台服务分页显示数据&#xff0c;后台分页查询数据接口如下所示&#xff08;测试时&#xff0c;直接将数据写死到代码中&#xff0c;没有查询数据库&#xff0…

Linux系统 C/C++编程基础——使用make工具和Makefile实现自动编译

ℹ️大家好&#xff0c;我是练小杰&#xff0c;今天周二了&#xff0c;距离除夕只有&#xff16;天了&#xff0c;新的一年就快到了&#x1f606; 本文是有关Linux C/C编程的make和Makefile实现自动编译相关知识点&#xff0c;后续会不断添加相关内容 ~~ 回顾:【Emacs编辑器、G…

68,[8] BUUCTF WEB [RoarCTF 2019]Simple Upload(未写完)

<?php // 声明命名空间&#xff0c;遵循 PSR-4 自动加载规范&#xff0c;命名空间为 Home\Controller namespace Home\Controller;// 导入 Think\Controller 类&#xff0c;以便扩展该类 use Think\Controller;// 定义 IndexController 类&#xff0c;继承自 Think\Control…

可以自己部署的微博 Mastodon

Mastodon&#xff08;又称乳齿象、长毛象或万象&#xff09;是一个自由开源的去中心化的分布式微博客社交网络。它的用户界面和操作方式跟推特&#xff08;Twitter&#xff09;类似&#xff0c;但整个网路并非由单一机构运作&#xff0c;而是以多个由不同营运者独立运作的伺服器…

机器学习-核函数(Kernel Function)

核函数&#xff08;Kernel Function&#xff09;是一种数学函数&#xff0c;主要用于将数据映射到一个更高维的特征空间&#xff0c;以便于在这个新特征空间中更容易找到数据的结构或模式。核函数的主要作用是在不需要显式计算高维特征空间的情况下&#xff0c;通过内积操作来实…

AQS公平锁与非公平锁之源码解析

AQS加锁逻辑 ReentrantLock.lock public void lock() {sync.acquire(1);}AbstractQueuedSynchronizer#acquire public final void acquire(int arg) {if (!tryAcquire(arg) &&acquireQueued(addWaiter(Node.EXCLUSIVE), arg))selfInterrupt();}addWaiter就是将节点加入…

软件授权产品介绍

CodeMeter技术可提供高达40亿个授权模块&#xff0c;其中6000个可存放于硬件加密狗CmDongle中&#xff0c;其他可存放于软授权CmActLicense中按需激活&#xff0c;CodeMeter云授权CmCloud也可以无任何限制的为“云中软件”提供灵活的授权控制。 CodeMeter安全时钟模块采用了独…

Excel 技巧17 - 如何计算倒计时,并添加该倒计时的数据条(★)

本文讲如何计算倒计时&#xff0c;并添加该倒计时的数据条。 1&#xff0c;如何计算倒计时 这里也要用公式 D3 - TODAY() 显示为下面这个样子的 然后右键该单元格&#xff0c;选 设置单元格格式 然后点 常规 这样就能显示出还书倒计时的日数了。 下拉适用到其他单元格。 2&a…