【实战ES】实战 Elasticsearch:快速上手与深度实践-附录-2-性能调优工具箱
👉 点击关注不迷路
👉 点击关注不迷路
👉 点击关注不迷路
附录-性能调优工具箱
- 2-Elasticsearch 性能调优工具箱深度指南
- 一、性能诊断工具集
- 1.1 实时监控工具
- 1.2 慢查询分析
- 二、硬件与基础架构优化
- 2.1 存储方案选型
- 2.2 JVM调优参数
- 三、索引设计优化
- 3.1 分片策略优化
- 3.2 映射优化技巧
- 四、写入性能调优
- 4.1 批量写入优化
- 4.2 索引配置参数
- 五、查询性能调优
- 5.1 缓存优化策略
- 5.2 搜索执行计划
- 六、压力测试与基准工具
- 6.1 Rally基准测试
- 七、企业级调优案例
- 7.1 电商搜索优化
- 7.2 日志分析优化
2-Elasticsearch 性能调优工具箱深度指南
- 问题诊断层
- 慢查询日志分析(
GET _nodes/stats/indices/search
) - 查询性能剖析(
GET /index/_search?profile
) - 节点资源监控(
GET _nodes/stats
) - JVM 内存分析(
GET _nodes/stats/jvm
)
- 慢查询日志分析(
- 子系统分析
- 查询优化:涉及 Query DSL 重构、缓存策略设计
- 索引优化:包含映射类型、刷新间隔、合并策略
- 集群配置:涵盖节点角色、分片分配、副本设置
- 硬件选型:涉及存储类型、内存配比、CPU 架构
- 效果验证
- 基准测试工具对比:
JMH vs Benchmark
- 监控指标验证:
CPU 使用率 <70%、Heap 使用率 <75%
- 压力测试:
JMeter 模拟万级 QPS 请求
- 基准测试工具对比:
一、性能诊断工具集
1.1 实时监控工具
# 节点资源监控
GET /_cat/nodes?v&h=name,heap.percent,cpu,load_1m,segments.memory# 索引级性能指标
GET /_cat/indices?v&h=index,docs.count,store.size,segments.count,query.total
- 关键指标阈值表:
指标 | 正常范围 | 异常处理动作 |
---|---|---|
heap.percent | <75% | 检查内存泄漏/扩容内存 |
segments.count | <1000/GB | 执行段合并(forcemerge) |
query.latency | <200ms(P95) | 优化查询DSL/添加缓存 |
indexing.rate | >500 docs/s | 调整refresh_interval |
heap.percent
- Elasticsearch(或基于 Elasticsearch 构建的 OpenSearch 等)中用于衡量 Java 堆内存使用情况的一个重要指标。
- 表示当前 Java 堆内存的使用百分比。Java 堆是 JVM 中用于存储对象实例的内存区域,Elasticsearch 中的各种数据结构、缓存等都会占用堆内存。该指标的值范围是 0% 到 100%,0% 表示堆内存几乎未被使用,100% 表示堆内存已被完全占用。
- 示例用途:通过监控 heap.percent 指标,可以及时发现内存使用异常的节点,进而采取相应的措施,如调整 JVM 堆内存大小、优化查询以减少内存占用等。
segments.count
- 用于统计 Elasticsearch 索引中的段(Segment)数量。
- 在 Elasticsearch 中,索引数据被组织成多个段,每个段是一个独立的存储单元,包含了部分文档数据。
当有新的文档被索引、更新或删除时,会先在内存中创建一个新的段,然后定期将这些段合并成更大的段
。segments.count 就是当前索引中所有段的数量。 - 示例用途:如果发现 segments.count 持续增长且超过了一定阈值,可以手动触发段合并操作(如使用 _forcemerge API),或者调整索引的刷新间隔和合并策略,以减少段的数量。
query.latency
- 用于衡量 Elasticsearch 查询的响应时间。
- 表示从客户端发送查询请求到 Elasticsearch 集群返回查询结果所花费的时间,通常以毫秒(ms)为单位。该指标反映了查询的执行效率,包括查询解析、文档匹配、结果排序等操作所消耗的时间。
- 示例用途:如果发现 query.latency 突然增加,可以分析查询语句,优化查询逻辑,或者对索引进行优化,如增加分片、调整映射等。
indexing.rate
- 用于衡量 Elasticsearch 索引文档的速度。
- 表示单位时间内(通常是每秒)可以索引的文档数量。
该指标反映了 Elasticsearch 集群处理写入操作的能力,对于需要频繁写入大量数据的场景非常重要。
- 示例用途:
如果发现 indexing.rate 低于预期,可以考虑增加节点、调整索引的刷新间隔、优化文档批量写入的方式等,以提高索引速率。
1.2 慢查询分析
// 向 /_settings 端点发送 PUT 请求,用于修改集群或索引的设置
PUT /_settings
{// 设置搜索查询阶段的慢日志警告阈值// 当搜索查询操作的执行时间超过 2 秒时,会记录一条警告级别的慢日志// 这里的查询阶段指的是从解析查询语句、在索引中查找匹配文档等操作所花费的时间"index.search.slowlog.threshold.query.warn": "2s",// 设置搜索获取阶段的慢日志调试阈值// 当搜索获取操作(即从匹配的文档中提取所需字段等操作)的执行时间超过 1 秒时,会记录一条调试级别的慢日志"index.search.slowlog.threshold.fetch.debug": "1s"
}// 以下是一个注释,表明后续的 GET 请求用于查看慢日志
# 查看慢日志
// 向 /_search 端点发送 GET 请求,执行搜索操作
// 查询条件为 type 字段的值等于 search_slowlog
// 这个查询的目的是从日志中筛选出类型为搜索慢日志的记录,以便查看哪些搜索操作触发了慢日志记录
GET /_search?q=type:search_slowlog
- 慢查询优化矩阵:
问题类型 | 特征 | 优化方案 | 预期提升 |
---|---|---|---|
全索引扫描 | “took”: 5000, “hits.total”: 1000000 | 添加时间范围过滤 | 80-90% |
深度分页 | “from”: 10000 | 改用search_after | 70% |
复杂聚合 | “aggregations”: 5+ | 启用并行聚合(precision_threshold) | 50% |
高内存消耗 | “evictions”: 高频 | 优化fielddata使用/增加内存 | 40% |
二、硬件与基础架构优化
2.1 存储方案选型
存储类型 | 随机读(IOPS) | 顺序写(MB/s) | 适用场景 | 成本系数 |
---|---|---|---|---|
本地NVMe SSD | 500,000 | 3500 | 热数据/写入密集型 | 1.0x |
云盘SSD | 20,000 | 250 | 通用场景 | 0.6x |
本地HDD | 150 | 180 | 冷数据存储 | 0.3x |
对象存储 | 100 | 120 | 归档数据 | 0.1x |
2.2 JVM调优参数
# jvm.options 推荐配置
# 设置 JVM 堆内存的初始大小为 16GB
# 初始大小和最大大小设置为相同的值(这里是 16GB),可以避免在运行过程中因堆内存动态调整而产生的性能开销
# 确保应用程序启动后就有足够的内存可用,减少垃圾回收(GC)的频率和开销
-Xms16g# 设置 JVM 堆内存的最大大小为 16GB
# 与初始大小保持一致,有助于维持内存使用的稳定性,避免因内存动态扩展而带来的性能抖动
-Xmx16g# 启用 G1(Garbage First)垃圾回收器
# G1 是一种面向服务器端应用的垃圾回收器,适用于多处理器和大内存的环境
# 它将堆内存划分为多个大小相等的区域(Region),并优先回收垃圾最多的区域,从而提高垃圾回收的效率
# 相比传统的垃圾回收器,G1 可以更好地控制垃圾回收的暂停时间,提高应用程序的响应性能
-XX:+UseG1GC# 设置 G1 垃圾回收器的最大暂停时间目标为 200 毫秒
# G1 会尽力在这个时间范围内完成垃圾回收操作,以减少对应用程序的影响
# 通过调整这个参数,可以平衡垃圾回收的效率和应用程序的响应时间
# 如果设置的值过小,可能会导致 G1 频繁进行垃圾回收,增加 CPU 开销;如果设置的值过大,可能会导致应用程序在垃圾回收时出现较长的暂停
-XX:MaxGCPauseMillis=200# 设置 G1 垃圾回收器开始进行并发标记的堆占用百分比为 35%
# 当堆内存的使用达到 35% 时,G1 会启动并发标记阶段,标记出需要回收的对象
# 这个参数可以控制垃圾回收的触发时机,避免堆内存过度使用导致频繁的 Full GC
# 适当调整这个值可以优化垃圾回收的性能,根据应用程序的内存使用模式进行合理设置
-XX:InitiatingHeapOccupancyPercent=35# 设置 G1 垃圾回收器为了应对晋升失败而预留的堆内存百分比为 25%
# 在垃圾回收过程中,可能会出现对象无法正常晋升到老年代的情况(晋升失败)
# 预留一定比例的堆内存可以减少晋升失败的可能性,提高垃圾回收的稳定性
# 该参数的值需要根据应用程序的内存使用情况和对象晋升模式进行调整
-XX:G1ReservePercent=25
- JVM配置黄金法则:
内存总量 | 堆大小 | G1 Region大小 | 年轻代比例 | 最大GC暂停 |
---|---|---|---|---|
32GB | 16GB | 8MB | 40% | 200ms |
64GB | 31GB | 16MB | 50% | 250ms |
128GB | 31GB | 32MB | 60% | 300ms |
G1 Region
G1(Garbage First)
是一种面向服务器端应用的垃圾回收器,主要应用于多处理器、大内存的环境。G1 将 Java 堆划分为多个大小相等的独立区域(Region),这是 G1 垃圾回收器的核心设计理念之一。
三、索引设计优化
3.1 分片策略优化
// 向 /my_index 端点发送 PUT 请求,用于创建一个名为 my_index 的索引
PUT /my_index
{// 定义索引的设置部分"settings": {// 设置索引的主分片数量为 12// 主分片是索引数据的基本存储单元,数据会被分散存储在这些主分片上// 增加主分片数量可以提高索引的并发处理能力和数据的分散存储程度,适合处理大量数据和高并发查询的场景// 但主分片数量过多也会增加集群的管理开销和资源消耗"number_of_shards": 12,// 设置每个主分片的副本分片数量为 1// 副本分片是主分片的拷贝,用于提高数据的冗余性和可用性// 当主分片所在的节点出现故障时,副本分片可以替代主分片继续提供服务// 增加副本分片数量可以提高系统的容错能力,但会占用更多的存储资源"number_of_replicas": 1,// 设置每个节点上允许分配的该索引的总分片(主分片和副本分片)数量上限为 3// 这个设置可以控制索引在集群节点间的分片分配,避免某个节点上分配过多的该索引分片// 有助于实现集群的负载均衡,提高集群的整体性能和稳定性"index.routing.allocation.total_shards_per_node": 3}
}
- 分片规划推荐表:
数据量 | 分片大小 | 分片数量公式 | 副本数 | 适用场景 |
---|---|---|---|---|
<50GB | 10-30GB | 数据量/20GB | 1 | 小型日志索引 |
50-500GB | 30-50GB | 节点数×2 | 1-2 | 业务数据索引 |
>500GB | 50-80GB | 数据量/(节点数×50GB) | 2 | 大型时序数据 |
3.2 映射优化技巧
// 向 /my_index/_mapping 端点发送 PUT 请求,目的是为名为 my_index 的索引设置映射(mapping)
// 映射定义了索引中字段的类型、分析器等属性,决定了数据如何被存储和搜索
PUT /my_index/_mapping
{// 设置动态映射规则为 "strict"// "strict" 意味着如果有新的字段在文档中出现,且没有在映射中预先定义,Elasticsearch 会拒绝该文档的索引操作// 这种设置有助于确保数据的一致性和规范性,避免意外的字段被索引"dynamic": "strict",// 定义索引中各个字段的属性"properties": {// 定义名为 "timestamp" 的字段"timestamp": {// 指定 "timestamp" 字段的类型为 "date",表示该字段存储的是日期和时间信息"type": "date",// 指定日期的格式为 "epoch_second",即从 1970 年 1 月 1 日 00:00:00 UTC 开始的秒数// 这是一种常见的时间戳表示方式,方便进行时间相关的查询和计算"format": "epoch_second"},// 定义名为 "content" 的字段"content": {// 指定 "content" 字段的类型为 "text",用于存储文本数据// "text" 类型的字段会被分词器进行分词处理,以便进行全文搜索"type": "text",// 设置 "norms" 为 false// norms 是用于存储字段长度归一化因子的信息,通常用于在搜索时计算文档的相关性得分// 将其设置为 false 可以节省磁盘空间,但可能会影响搜索结果的相关性排序准确性// 如果对搜索结果的相关性排序要求不高,或者希望减少磁盘占用,可以将其设置为 false"norms": false,// 设置 "index_options" 为 "positions"// "index_options" 控制索引中存储的信息级别,"positions" 表示会存储词项的位置信息// 存储位置信息可以支持更复杂的查询,如短语查询和近似查询,但会增加磁盘空间的使用"index_options": "positions"}}
}
- 字段类型优化收益:
优化项 | 存储节省 | 写入速度提升 | 查询性能提升 |
---|---|---|---|
关闭norms | 15% | 10% | 5% |
使用keyword替代text | 20% | 25% | 30% |
禁用doc_values | 30% | 15% | -20% |
启用index_prefixes | -5% | -8% | +40% |
四、写入性能调优
4.1 批量写入优化
# 最佳批量大小计算公式optimal_bulk_size = min(20MB, (heap_memory * 0.1) / concurrent_requests)
- 批量写入参数对照:
并发数 | 批量大小 | 客户端线程 | 预期吞吐量 |
---|---|---|---|
2 | 5-10MB | 4 | 5k docs/s |
8 | 10-15MB | 16 | 20k docs/s |
16 | 15-20MB | 32 | 50k docs/s |
4.2 索引配置参数
// 向 /my_index/_settings 端点发送 PUT 请求,目的是修改名为 my_index 的索引的设置
PUT /my_index/_settings
{"index": {// 设置索引的刷新间隔为 30 秒// 刷新操作会将内存缓冲区中的数据写入到磁盘上的段(segment)中,使得这些数据可以被搜索到// 较长的刷新间隔可以减少磁盘 I/O 操作,提高写入性能,但会增加数据从写入到可搜索的延迟时间// 这里设置为 30 秒,意味着每隔 30 秒才会将新写入的数据刷新到磁盘并可被搜索"refresh_interval": "30s",// 配置事务日志(translog)的相关设置"translog": {// 设置事务日志的同步间隔为 5 秒// 事务日志用于记录所有对索引的写操作,同步操作会将事务日志中的数据持久化到磁盘// 每隔 5 秒将事务日志同步到磁盘,以确保在发生故障时可以从事务日志中恢复数据"sync_interval": "5s",// 设置事务日志的持久化策略为 "async",即异步持久化// 异步持久化意味着写操作会先在内存中完成,然后在后台异步地将事务日志同步到磁盘// 这种方式可以提高写性能,但在发生故障时可能会丢失最近 5 秒(即同步间隔内)的数据"durability": "async"},// 配置段合并(merge)操作的相关设置"merge": {"scheduler": {// 设置段合并操作的最大线程数为 4// 段合并是将多个小的段合并成一个大的段的操作,有助于提高查询性能和减少磁盘空间占用// 限制最大线程数可以避免段合并操作占用过多的系统资源,影响其他操作的性能// 这里将最大线程数设置为 4,意味着最多同时有 4 个线程用于执行段合并操作"max_thread_count": 4}}}
}
- 写入优化效果矩阵:
参数 | 默认值 | 优化值 | 吞吐量提升 | 风险等级 |
---|---|---|---|---|
refresh_interval | 1s | 30s | 300% | ★★ |
translog.durability | request | async | 200% | ★★★ |
max_thread_count | 自动 | 4 | 50% | ★ |
index.codec | LZ4 | ZSTD | 40% | ★ |
五、查询性能调优
5.1 缓存优化策略
// 向 /_cluster/settings 端点发送 PUT 请求,用于修改 Elasticsearch 集群的设置
PUT /_cluster/settings
{// "persistent" 表示这些设置是持久化的,即集群重启后这些设置仍然有效"persistent": {// 设置索引请求缓存的大小为集群堆内存的 5%// 索引请求缓存用于缓存搜索请求的结果,当相同的搜索请求再次发起时,可以直接从缓存中获取结果,而无需重新执行查询// 这样可以提高搜索性能,尤其是对于频繁执行的相同查询// 将其大小设置为 5%,意味着会使用集群堆内存的 5% 来存储请求缓存的数据"indices.requests.cache.size": "5%",// 设置字段数据缓存的大小为集群堆内存的 30%// 字段数据缓存用于存储文本字段的反向索引,主要用于排序、聚合等操作// 当对文本字段进行排序或聚合时,Elasticsearch 需要将该字段的所有值加载到内存中,存储在字段数据缓存中// 设置为 30% 可以确保有足够的内存用于存储字段数据,提高排序和聚合操作的性能// 但如果设置过大,可能会导致其他部分的内存不足,影响系统的整体性能"indices.fielddata.cache.size": "30%"}
}
- 缓存命中率优化:
缓存类型 | 推荐大小 | 命中率目标 | 监控命令 |
---|---|---|---|
请求缓存 | 5%堆内存 | >60% | GET /_stats/request_cache |
分片查询缓存 | 1%堆内存 | >40% | GET /_stats/query_cache |
Fielddata缓存 | 30%堆内存 | >50% | GET /_cat/fielddata |
5.2 搜索执行计划
// 向 /_search 端点发送 GET 请求,执行搜索操作
// 同时添加了 explain=true 参数,该参数会让 Elasticsearch 在返回搜索结果的同时,
// 详细解释每个匹配文档的得分是如何计算得出的,有助于我们理解文档匹配的原理和得分的影响因素
GET /_search?explain=true
{// 定义搜索的查询条件"query": {// 使用 match 查询类型,这是一种常用的全文搜索查询类型// 它会对查询的文本进行分词处理,然后在指定的字段中查找匹配的词项"match": {// 指定要搜索的字段为 "content""content": "elasticsearch performance"// 这里的查询文本 "elasticsearch performance" 会被分词器进行分词,// 然后在 "content" 字段中查找包含这些分词后的词项的文档// 最终返回匹配的文档,并根据文档与查询的相关性进行打分排序}}
}
- 查询优化检查清单:
-
避免script_score高频使用
。动态计算文档得分消耗大量 CPU,用 function_score 替代 script_score(支持缓存) - 使用filter替代query上下文
- 限制wildcard查询长度。通配符查询导致全字段扫描,禁止前导通配符(*keyword),设置最小字符限制
- 启用index.sort预排序
-
避免深度分页(from>1000)
。深分页导致内存溢出和性能骤降,对超过 1000 条的分页使用 search_after,对需要深度分页的场景改用 scroll API,使用 search_after 代替 from/size
-
六、压力测试与基准工具
6.1 Rally基准测试
# 这是一个使用 Elasticsearch Rally 进行性能测试的 track 配置文件示例
# Rally 是 Elastic 开发的一个用于基准测试 Elasticsearch 的工具,track 配置文件定义了测试的具体内容和流程# benchmarks 部分定义了一组性能测试的基准,每个基准可以包含不同的索引、操作和挑战
benchmarks:# 定义一个名为 logstash-demo 的基准测试- name: logstash-demo# indices 部分定义了在测试中使用的索引indices:# 定义一个名为 logs 的索引- name: logs# body 指定了该索引的映射和设置的配置文件路径# 这里表示使用名为 index.json 的文件来配置 logs 索引的具体信息body: "index.json"# operations 部分定义了在测试中要执行的操作operations:# 定义一个操作,操作类型为 bulk(批量操作)- operation-type: bulk# bulk-size 指定了每次批量操作中包含的文档数量# 这里设置为 5000,表示每次批量操作会处理 5000 个文档bulk-size: 5000# challenges 部分定义了具体的测试挑战,每个挑战包含一系列操作的执行计划challenges:# 定义一个名为 index-and-query 的挑战- name: index-and-query# schedule 部分定义了操作的执行计划schedule:# 定义一个要执行的操作- operation: bulk# warmup-time 指定了热身时间# 这里设置为 60s,表示在正式进行性能测试之前,会先进行 60 秒的热身操作,让系统达到稳定状态warmup-time: 60s# clients 指定了并发执行操作的客户端数量# 这里设置为 8,表示会有 8 个客户端同时执行批量操作,以模拟高并发场景clients: 8
- 性能基准指标:
测试场景 | 写入吞吐量 | P95查询延迟 | 硬件配置 |
---|---|---|---|
日志索 引 | 45k docs/s | 120ms | 3节点(16核/64GB) |
商品搜索 | 12k docs/s | 85ms | 5节点(32核/128GB) |
时序数据 | 80k docs/s | 250ms | 专用TSDB节点 |
七、企业级调优案例
7.1 电商搜索优化
-
问题:大促期间搜索延迟从150ms上升到800ms
-
优化措施:
-
- 引入查询结果缓存(命中率提升至65%)
-
调整分片数从24→36(负载下降40%)
-
- 启用自适应副本选择(ARS)
-
-
效果:
- P99延迟从800ms→220ms
- 吞吐量从5k QPS→12k QPS
7.2 日志分析优化
- 问题:
每日索引速度无法满足数据量增长
- 解决方案:
// 向 /_template/logs_template 端点发送 PUT 请求,目的是创建或更新一个名为 logs_template 的索引模板
// 索引模板可根据指定的索引模式,自动应用配置到匹配的索引上,简化索引创建过程
PUT /_template/logs_template
{// 定义索引模板所匹配的索引模式// 这里使用 ["logs-*"] 表示所有以 "logs-" 开头的索引都会应用此模板的配置"index_patterns": ["logs-*"],// 定义应用此模板的索引的设置"settings": {// 设置索引的刷新间隔为 60 秒// 刷新操作会将内存中的数据写入磁盘上的段,使数据可被搜索// 较长的刷新间隔可减少磁盘 I/O 开销,但会增加数据从写入到可搜索的延迟"refresh_interval": "60s",// 设置索引的主分片数量为 6// 主分片是索引数据的基本存储单元,数据会分散存储在这些主分片上// 合理设置主分片数量可提高索引的并发处理能力和数据的分散存储程度"number_of_shards": 6,// 设置索引使用的压缩编解码器为 ZSTD// ZSTD 是一种高效的压缩算法,相比默认的 LZ4 能提供更高的压缩比// 使用 ZSTD 可减少磁盘空间占用,但可能会增加一些 CPU 开销用于压缩和解压缩操作"codec": "ZSTD"}
}
- 成果:
- 写入速度从8k→35k docs/s
- 存储成本降低55%
- 调优黄金法则:
-
监控先行:建立完善的监控体系再优化
-
- 单点突破:每次只调整一个变量
-
量化验证:使用Rally进行AB测试
-
- 安全边际:保留20-30%的资源缓冲
-
- 定期复审:季度性性能健康检查
-
注:本文参数基于Elasticsearch 8.x版本,实际使用需根据集群规模调整
- 该文档通过以下技术创新点实现深度优化指导:
-
- 动态计算公式:如批量写入大小公式
optimal_bulk_size = min(20MB, (heap_memory * 0.1) / concurrent_requests)
- 动态计算公式:如批量写入大小公式
-
- 多维参数矩阵:展示不同优化措施的收益与风险平衡
-
- 真实场景案例:
结合电商/日志等典型场景的优化路径
- 真实场景案例:
-
- 压力测试集成:提供Rally基准测试配置模板
-
- 版本敏感提示:
明确标注配置的版本适用性
- 版本敏感提示:
-
- 实际应用时需配合监控数据持续调优,建议建立性能调优checklist进行版本化管理。
相关文章:
【实战ES】实战 Elasticsearch:快速上手与深度实践-附录-2-性能调优工具箱
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 附录-性能调优工具箱 2-Elasticsearch 性能调优工具箱深度指南一、性能诊断工具集1.1 实时监控工具1.2 慢查询分析 二、硬件与基础架构优化2.1 存储方案选型2.2 JVM调优参数 三、索引…...
UDP协议栈之整体架构处理
在之前的章节中,笔者就UDP、ICMP、IP、ARP、MAC层的报文格式,以及组帧解帧、CRC校验、分片处理等操作进行了具体介绍以及详细代码实现,并且通过了仿真测试。但之前的仿真测试都是对单层报文的组帧解帧进行的,这些模块仍处于“孤立…...
健康医疗:动态代理 IP 保障医疗数据安全,提升远程医疗服务质量!
在数字化浪潮的推动下,远程医疗服务以其便捷性和高效性受到了广泛的关注。然而,随之而来的是数据安全问题,尤其是医疗数据的安全性,成为了制约远程医疗服务发展的关键因素。幸运的是,动态代理IP技术的出现,…...
Navicat SqlServer 设置自增主键
Navicat是一款优秀的数据库管理工具,可以连接很多类型的数据库。使用它可以极大的提高工作效率。 Navicat 不能设置SqlServer自增字段,只能通过sql语句来实现 建表时设置 create table <表名> ( <字段1-主键> int identity (1,1) primar…...
实验8 搜索技术
实验8 搜索技术 一、实验目的 (1)掌握搜索技术的相关理论,能根据实际情况选取合适的搜索方法; (2)进一步熟悉盲目搜索技术,掌握其在搜索过程中的优缺点; (3)…...
IMA+DeepSeekR1+本地知识库撰写NOIP2008普及组T3【传球游戏】题解
目录 一、提问词 二、DeepSeekR1回复 题目描述 解题思路 实现代码 代码说明 三、说明 【IMADeepSeekR1本地知识库】撰写NOIP2008普及组复赛题解系列 1、IMADeepSeekR1本地知识库撰写NOIP2008普及组T1【ISBN 号码】题解-CSDN博客 2、IMADeepSeekR1本地知识库撰写NOIP200…...
查找特定的值(信息学奥赛一本通-1110)
【题目描述】 在一个序列(下标从1开始)中查找一个给定的值,输出第一次出现的位置。 【输入】 第一行包含一个正整数n,表示序列中元素个数。1 <n< 10000。 第二行包含n个整数,依次给出序列的每个元素,相邻两个整数之间用单个…...
Qt项目中集成第三方模块的.pri文件
对于功能模块较多的Qt项目,使用pri文件管理模块文件,降低工程复杂度,提高软件模块的封装性和重用性。 一、.pro与.pri 对于模块化编程,Qt提供了pro和pri,pro管理项目,pri管理模块。 .pro 文件是Qt项目的…...
200多种算法应用于二维和三维无线传感器网络(WSN)覆盖场景
2.1 二元感知模型 在当前无线传感器网络(WSN)覆盖场景中,最常见且理想的感知模型是二元感知模型[27]。如图2所示, Q 1 Q_1 Q1和 Q 2 Q_2 Q2代表平面区域内的两个随机点。 Q 1 Q_1 Q1位于传感器的检测区域内,其感…...
【QT】文件系统相关 -- QFile
一、Qt 文件概述 🔥 文件操作是应用程序必不可少的部分。Qt 作为⼀个通用开发库,提供了跨平台的文件操作能力。Qt 提供了很多关于⽂件的类,通过这些类能够对文件系统进行操作,如文件读写、文件信息获取、文件制或重命名等 二、输…...
transformer bert 多头自注意力
输入的(a1,a2,a3,a4)是最终嵌入,是一个(512,768)的矩阵;而a1是一个token,尺寸是768 a1通过Wq权重矩阵,经过全连接变换得到查询向量q1;a2通过Wk权重矩阵得到键向量k2;q和k点乘就是值…...
人工智能之数学基础:线性变换的象空间和零空间
本文重点 前面的课程中,我们学习了线性变换,由此而引申出线性变换的象空间和零空间,这两个空间在机器学习领域会被经常用到,本文对此进行学习。 直观理解 总的来说象空间就是经过线性变换得到的空间,零空间就是经过线性变换是零的元素构成的空间。 从几何角度来看,象空…...
数据的存储---整型、浮点型
目录 一、整型在内存中的存储 1. 原码、反码、补码 2. 大端与小端 二、浮点数在内存中的存储 1.浮点数的存 2. 浮点数的取 3. 题目解析 一个变量的创建需要在内存中开辟空间,而开辟的空间大小是由数据类型决定的。下面我们就来讨论一下整型、浮点型在内存中的…...
鲸鱼算法WOA对风电场风电机组一次二次调频参数进行全局最优辨识,二次调频参数辩识matlab/simulink,也可进一步修改成一次调频参数辩识
模型为二次调频模型,也可修改为一次调频模型参数辩识 随着风电在电力系统中占比提高,其调频特性对电力系统频率稳定性的影响增大,例如,随着风电渗透水平不断提升,系统惯量不断增加,电力系统频率不断下降,在…...
Spring 中 SmartInitializingSingleton 的作用和示例
一、 接口定义 SmartInitializingSingleton 是 Spring 框架提供的一个 单例 Bean 全局初始化回调接口,用于在 所有非延迟单例 Bean 初始化完成后 执行自定义逻辑。 核心方法: public interface SmartInitializingSingleton {void afterSingletonsInsta…...
《TCP/IP网络编程》学习笔记 | Chapter 18:多线程服务器端的实现
《TCP/IP网络编程》学习笔记 | Chapter 18:多线程服务器端的实现 《TCP/IP网络编程》学习笔记 | Chapter 18:多线程服务器端的实现线程的概念引入线程的背景线程与进程的区别 线程创建与运行pthread_createpthread_join可在临界区内调用的函数工作&#…...
Unity AI 技术浅析(三):智能代理(Agents)
Unity AI的智能代理(Agents)技术是实现游戏和虚拟现实应用中非玩家角色(NPC)、敌人、盟友等智能行为的核心。通过智能代理,开发者可以为虚拟角色赋予感知、决策和行动的能力,使其能够与环境和其他角色进行复杂的交互。 一、智能代理的基本原理 智能代理是能够在特定环境…...
加油站~~
求最少加油次数就是一个贪心问题,这里也不需要证明,根据我们的常识也知道就是走到油不够的时候就加油就好了,这里的no solution这有在两个加油站之间的距离大于了加满油后的行驶距离才会存在,其他情况都是可以计算的。代码有很多细…...
【商城实战(24)】商城性能大揭秘:压力测试与性能监控实战
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
Linly-Talker:开源数字人框架的技术解析与影响
一、引言:AI 数字人的发展趋势 近年来,数字人(Digital Human) 技术迅速发展,从最早的 2D 虚拟主播,到如今能够进行实时交互的 3D 智能助手,AI 在多模态交互领域的应用愈发广泛。各大互联网公司…...
【Nexus】Maven 私服搭建以及上传自己的Jar包
Nexus 安装 docker run -d -uroot --name nexus3 --restartalways -p 8081:8081 -v /data/nexus-data/blobs:/nexus-data/blobs -v /etc/localtime:/etc/localtime sonatype/nexus3这里也提供一下docker-composer的方法 .env 文件 VERSIONlatest CONTAINER_NAMECONTAINER_N…...
wlwrap 与 rlwrap 的区别对比:图形显示协议的演变
在 Linux 系统中,许多工具和程序依赖于命令行界面(CLI)来进行交互,尤其是对于那些没有图形用户界面的应用程序。在这种情况下,命令行编辑、历史记录和自动补全等功能是提升工作效率和用户体验的关键。rlwrap 和 wlwrap…...
矩阵交换行(信息学奥赛一本通-1119)
【题目描述】 给定一个55的矩阵(数学上,一个rc的矩阵是一个由r行c列元素排列成的矩形阵列),将第n行和第m行交换,输出交换后的结果。 【输入】 输入共6行,前5行为矩阵的每一行元素,元素与元素之间以一个空格分开。 第6行包含两个整…...
CP210x 驱动秘籍:打通 Windows 11 端口的任督二脉
前言 江湖上,众多电脑侠客在安装 Windows 11 时,遭遇“端口失踪案”。原来,这是缺少 CP210x 驱动的“内功心法”。今日,贫道便传授一套独门秘籍,助你打通端口“任督二脉”,让数据流畅如江湖中轻功高手。 …...
IDEA集成git,项目的克隆,远程仓库中文件的添加删除
目录 一、克隆项目 二、使用IDEA完成文件的上传和删除 1.配置git 2.上传 3.删除(通过git bash) 一、克隆项目 点击克隆,复制url ,如下 打开你想要克隆到哪里,右击,选择 open Git Bash here 这一步之后…...
分治构造格雷码
题目描述 格雷码是一种二进制编码方式,其特性是任意两个相邻的码只有一位二进制位不同。给定一个整数 n,表示格雷码的位数,请生成所有 n 位格雷码,并按照格雷码的标准顺序输出。 输入格式 输出样例输入包含一个整数 n,…...
区跨链知识和概念
1、以太坊 Geth 源码解析 Geth(Go Ethereum)是以太坊官方提供的 Go 语言实现的客户端,广泛用于以太坊全节点运行、挖矿、DApp 开发等。理解 Geth 的源码有助于掌握以太坊区块链底层逻辑,如区块同步、EVM 执行、P2P 交互等。 2、…...
C# net deepseek RAG AI开发 全流程 介绍
deepseek本地部署教程及net开发对接 步骤详解:安装教程及net开发对接全流程介绍 DeepSeekRAG 中的 RAG,全称是 Retrieval-Augmented Generation(检索增强生成),是一种结合外部知识库检索与大模型生成能力的技术架构。其…...
REST 请求返回 Invalid Credentials
REST 请求返回 “Invalid Credentials”(无效凭据),通常表示身份验证失败。可能的原因和解决方案如下: 可能的原因 & 解决方案 用户名或密码错误 确保使用正确的用户名和密码。如果 API 需要 Base64 编码的 Authorization 头…...
方案推介:206页WORD版ERP系统软件投标书整体解决方案
(推介资料包含于绑定资源内) 该文档是一份 ERP 系统软件投标书,围绕ERP 系统展开,全面阐述了其为机械加工企业提供的整体解决方案、应用价值、行业成功案例及标准功能,旨在助力企业实现信息化管理升级 。 ERP 软件系统…...
WebSocket生命周期和vue中使用
ing。。。晚点更新 进入页面,生命周期挂载后,window监听ws连接online 正常情况,心跳包检测避免断开 非正常情况,ws.onclose断开, 判断1000状态吗,触发重连函数。 定时器,重连,判断…...
RabbitMQ消息持久化与Lazy模式对比分析
RabbitMQ消息持久化与Lazy模式对比分析 在RabbitMQ中,消息持久化与Lazy模式是两种不同的机制,分别针对消息可靠性、存储优化等不同维度设计。以下从六个层面进行深度对比: 一、核心目标与作用对象差异 维度消息持久化(delivery_…...
Springboot中的异常处理
ControllerAdvice虽然只是在处理Controller注解的类,在Service层抛出的异常如果没有在Service层被处理的话,会向上抛出到到Controller层,再被异常处理器捕获 1. 全局异常处理 ControllerAdvice:全局处理器,处理有Con…...
深入解析Go语言Channel:源码剖析与并发读写机制
文章目录 Channel的内部结构Channel的创建过程有缓冲Channel的并发读写机制同时读写的可能性发送操作的实现接收操作的实现 并发读写的核心机制解析互斥锁保护环形缓冲区等待队列直接传递优化Goroutine调度 实例分析:有缓冲Channel的并发读写性能优化与最佳实践缓冲…...
C++中虚析构函数的作用是什么?为什么基类需要虚析构函数?
C中虚析构函数的作用是什么?为什么基类需要虚析构函数? 在C中,虚析构函数(virtual destructor)的作用是确保在通过基类指针或引用删除派生类对象时,能够正确调用派生类的析构函数,从而避免资源…...
ClickHouse合并任务与查询延迟专项测试
ClickHouse合并任务与查询延迟专项测试 1. 测试目的 验证周期性高延迟(~900ms)是否由后台合并任务(Merge)引起。 2. 测试环境 组件配置ClickHouse版本24.8.3.13服务器硬件8核CPU / 32GB内存 / NVMe SSD测试表log_test 3. 测试…...
3.14学习总结
今天完成了几道关于二叉树的算法题 关于二叉树的最小最大深度和数据流中的第k大元素,用到优先队列,学习了有关java的基础知识,学习了双指针法。...
OpenHarmony自定义子系统、部件与模块
如图所示,OpenHarmony系统源码中,大体上按照不同种类的功能分成多个子系统,然后一个子系统内部进一步在同类功能上的差异性划分成一个或多个部件,也就是说一个部件表示一个具体功能的源码集合。最后一个部件的源码再划分成一个或多…...
PPT 相关资料介绍
文章目录 一、iSlide 工具二、免费 PPT 模板下载三、Kimi 一键生成 PPT 一、iSlide 工具 iSlide 官网 二、免费 PPT 模板下载 7个完全免费的PPT模板下载网站 优品PPT 第一PPT 三、Kimi 一键生成 PPT ☆...
C# 发送邮件 报错:此请求已被阻止,因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站。
C# 发送邮件 报错:此请求已被阻止,因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站。 报错信息分析 当你遇到如下报错时: 此请求已被阻止,因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站。…...
大数据-spark3.5安装部署之standalone模式
真实工作中还是要将应用提交到集群中去执行,Standalone模式就是使用Spark自身节点运行的集群模式,体现了经典的master-slave模式。集群共三台机器,具体如下 u22server4spark: master worker u22server4spark2: worke…...
接口自动化入门 —— Jmeter实现在接口工具中关联接口处理方案
1. JMeter 接口关联处理的核心概念 接口关联是指在多个接口请求之间共享数据,例如将一个接口的返回值作为另一个接口的输入参数。常见的场景包括: 使用登录接口返回的 Token 作为后续接口的认证信息。 将一个接口返回的 ID 作为另一个接口的请求参数。…...
WebForms HTML:深入理解与高效运用
WebForms HTML:深入理解与高效运用 引言 随着互联网技术的飞速发展,WebForms HTML作为Web开发中的一种重要技术,已经成为了许多开发者日常工作中不可或缺的一部分。本文将深入探讨WebForms HTML的原理、应用场景以及高效运用技巧࿰…...
VSCode 搭建C++编程环境 2025新版图文安装教程(100%搭建成功,VSCode安装+C++环境搭建+运行测试+背景图设置)
名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、VScode下载及安装二、安装 MinGW-w64 工具链三、Windows环境变量配置四、检查 M…...
【Linux 内核 | 操作系统 | 内核编译】内核编译中与锁调试相关的设置有哪一些?内核 Debug 选项中 LockDep 和其他锁调试选项详解
问题描述: 我在看内核锁调试的信息时,看到了一些内核编译参数相关的设置,开启这些信息可以帮助我们在测试环境中调试锁的竞争情况,可以详细的打印出来一些线程持有锁,一些线程争抢锁的信息。 以下是我的配置&#…...
LinuX---Shell---变量
系统预定义变量 常用系统变量 PATH、HOME、PWD、SHELL、USER等 获取变量的值 语法:$变量名 $和变量名之间不能有空格。 案例实操 查看系统变量的值 fengubuntu:~$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/u…...
深入理解Spring MVC:构建灵活的Web应用
大家好!今天我们来聊聊Spring框架中的一个重要模块——Spring MVC。Spring MVC是一个基于MVC(Model-View-Controller)架构的Web框架,它提供了强大的功能来处理HTTP请求、生成动态内容以及管理Web应用程序的流程。无论是构建RESTfu…...
详解SQL数据查询功能
数据查询 一、 单表查询1. 选择表中的若干列2. 选择表中的若干元组3. ORDER BY 子句4. 聚合函数5. GROUP BY 子句6. LIMIT 子句综合示例: 二、 多表查询1. 等值连接查询 (Equi-Join)2. 非等值连接查询 (Non-Equi Join)3. 自然连接查询 (Natural Join)4. 复合条件连接…...
ArcGIS Pro 车牌分区数据处理与地图制作全攻略
在大数据时代,地理信息系统(GIS)技术在各个领域都有着广泛的应用,而 ArcGIS Pro 作为一款功能强大的 GIS 软件,为数据处理和地图制作提供了丰富的工具和便捷的操作流程。 车牌数据作为一种重要的地理空间数据…...
Git 本地常见快捷操作
Git 本地常见快捷操作 📌 1. 基本操作 操作命令初始化 Git 仓库git init查看 Git 状态git status添加所有文件到暂存区git add .添加指定文件git add <file>提交更改git commit -m "提交信息"修改最后一次提交信息git commit --amend -m "新…...