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

Elasticsearch性能调优全攻略:从日志分析到集群优化

#作者:猎人

文章目录

  • 前言
  • 搜索慢查询日志
  • 索引慢写入日志
  • 性能调优之基本优化建议
  • 性能调优之索引写入性能优化
  • 提升es集群写入性能方法:
  • 性能调优之集群读性能优化
  • 性能调优之搜索性能优化
  • 性能调优之GC优化
  • 性能调优之路由优化
  • 性能调优之分片优化

前言

es里面的操作,主要分为两种,一种写入(增删改),另一种是查询(搜索)。分别要识别出来哪些写入操作性能比较慢,哪些查询操作性能比较慢,先要识别出来有性能问题的这些慢查询,慢写入,然后才能去考虑如何优化写入性能,如何优化搜索性能。如果一次搜索,或者一次聚合,一下子就要10s,或者十几秒,不能接受。

搜索慢查询日志

无论是慢查询日志,还是慢写入日志,都是针对shard级别的,无论执行增删改,还是执行搜索,都是对某个数据执行写入或者是搜索,其实都是到某个shard上面去执行。 shard上面执行的慢的写入或者是搜索,都会记录在针对这个shard的日志中。比如设置一个阈值,5s就是搜索的阈值,5s就叫做慢,那么一旦一个搜索请求超过了5s之后,就会记录一条慢搜索日志到日志文件中。

shard level的搜索慢查询日志,辉将搜索性能较慢的查询写入一个专门的日志文件中。可以针对query phase和fetch phase单独设置慢查询的阈值,而具体的慢查询阈值设置如下所示:

vim   elasticsearch.yml     
index.search.slowlog.threshold.query.warn: 10s
index.search.slowlog.threshold.query.info: 5s
index.search.slowlog.threshold.query.debug: 2s
index.search.slowlog.threshold.query.trace: 500msindex.search.slowlog.threshold.fetch.warn: 1s
index.search.slowlog.threshold.fetch.info: 800ms
index.search.slowlog.threshold.fetch.debug: 500ms
index.search.slowlog.threshold.fetch.trace: 200ms

而慢查询日志具体的格式,都是在log4j2.properties中配置的,比如下面的配置:

appender.index_search_slowlog_rolling.type = RollingFile
appender.index_search_slowlog_rolling.name = index_search_slowlog_rolling
appender.index_search_slowlog_rolling.fileName = ${sys:es.logs}_index_search_slowlog.log
appender.index_search_slowlog_rolling.layout.type = PatternLayout
appender.index_search_slowlog_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %.10000m%n
appender.index_search_slowlog_rolling.filePattern = ${sys:es.logs}_index_search_slowlog-%d{yyyy-MM-dd}.log
appender.index_search_slowlog_rolling.policies.type = Policies
appender.index_search_slowlog_rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.index_search_slowlog_rolling.policies.time.interval = 1
appender.index_search_slowlog_rolling.policies.time.modulate = truelogger.index_search_slowlog_rolling.name = index.search.slowlog
logger.index_search_slowlog_rolling.level = trace
logger.index_search_slowlog_rolling.appenderRef.index_search_slowlog_rolling.ref = index_search_slowlog_rolling
logger.index_search_slowlog_rolling.additivity = false

索引慢写入日志

可以用如下的配置来设置索引写入慢日志的阈值:

index.indexing.slowlog.threshold.index.warn: 10s
index.indexing.slowlog.threshold.index.info: 5s
index.indexing.slowlog.threshold.index.debug: 2s
index.indexing.slowlog.threshold.index.trace: 500ms
index.indexing.slowlog.level: info
index.indexing.slowlog.source: 1000

用下面的log4j.properties配置就可以设置索引慢写入日志的格式:

appender.index_indexing_slowlog_rolling.type = RollingFile
appender.index_indexing_slowlog_rolling.name = index_indexing_slowlog_rolling
appender.index_indexing_slowlog_rolling.fileName = ${sys:es.logs}_index_indexing_slowlog.log
appender.index_indexing_slowlog_rolling.layout.type = PatternLayout
appender.index_indexing_slowlog_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %marker%.10000m%n
appender.index_indexing_slowlog_rolling.filePattern = ${sys:es.logs}_index_indexing_slowlog-%d{yyyy-MM-dd}.log
appender.index_indexing_slowlog_rolling.policies.type = Policies
appender.index_indexing_slowlog_rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.index_indexing_slowlog_rolling.policies.time.interval = 1
appender.index_indexing_slowlog_rolling.policies.time.modulate = truelogger.index_indexing_slowlog.name = index.indexing.slowlog.index
logger.index_indexing_slowlog.level = trace
logger.index_indexing_slowlog.appenderRef.index_indexing_slowlog_rolling.ref = index_indexing_slowlog_rolling
logger.index_indexing_slowlog.additivity = false

正常情况下,慢查询应该是比较少数的。如果发现某个查询特别慢,就要通知写这个查询的开发人员,让他们去优化一下性能。

设置 Slowlogs,发现一些性能不好,甚至是错误的使用 Pattern。例如:错误的将网址映射成 keyword,然后用通配符查询。应该使用 Text,结合 URL 分词器。严禁一切“x”开头的通配符查询

性能调优之基本优化建议

  1. 搜索结果不要返回过大的结果集
    es是一个搜索引擎,所以如果用这个搜索引擎对大量的数据进行搜索,并且返回搜索结果中排在最前面的少数结果,是非常合适的。然而,如果要做成类似数据库的东西,每次都进行大批量的查询,是很不合适的。如果真的要做大批量结果的查询,记得考虑用scroll api,批量滚动查询。

  2. 避免超大的document
    http.max_context_length的默认值是100mb,意味着一次document写入时,document的内容不能超过100mb,否则es就会拒绝写入。也许可以将这个参数设置的更大,从而让超大的documdent可以写入es,但是es底层的lucene引擎还是有一个2gb的最大限制。

即使不考虑引擎层的限制,超大的document在实际生产环境中是很不好的。超大document会耗费更多的网络资源,内存资源和磁盘资源,甚至对那些不要求获取_source的请求,也是一样,因为es需要从_source中提取_id字段,对于超大document这个获取_id字段的过程的资源开销也是很大的。而将这种超大document写入es也会使用大量的内存,占用内存空间的大小甚至会是documdent本身大小的数倍。近似匹配的搜索,比如phrase query,以及高亮显示,对超大document的资源开销会更大,因为这些操作的性能开销直接跟document的大小成正比。
因此对于超大document,我们需要考虑一下,我们到底需要其中的哪些部分。举例来说,如果我们要对一些书进行搜索,那么我们并不需要将整本书的内容就放入es中。可以仅仅使用每一篇章或者一个段落作为一个document,然后给一个field标识出来这些document属于哪本书,这样每个document的大小就变小了。可以避免超大document导致的各种开销,同时可以优化搜索的体验。

  1. 避免稀疏的数据
    lucene的内核结构,跟稠密的数据配合起来,性能会更好, 原因就是,lucene在内部会通过doc id来唯一标识一个document,这个doc id是integer类型,范围在0到索引中含有的document数量之间。这些doc id是用来在lucene内部的api之间进行通信的,比如说,对一个term用一个match query来进行搜索,就会产生一个doc id集合,然后这些doc id会用来获取对应的norm值,以用来计算每个doc的相关度分数。而根据doc id查找norm的过程,是通过每个document的每个field保留一个字节来进行的一个算法,这个过程叫做norm查找,norm就是每个document的每个field保留的一个字节。对于每个doc id对应的那个norm值,可以通过读取es一个内置索引,叫做doc_id的索引,中的一个字节来获取。这个过程是性能很高的,而且可以帮助lucene快速的定位到每个document的norm值,但是同时这样的话document本身就不需要存储这一个字节的norm值了。

在实际运行过程中,这就意味着,如果一个索引有100个document,对于每个field,就需要100个字节来存储norm值,即使100个document中只有10个document含有某个field,但是对那个field来说,还是要100个字节来存储norm值。这就会对存储产生更大的开销,存储空间被浪费的一个问题,而且也会影响读写性能。

下面有一些避免稀疏数据的办法:
(1)避免将没有任何关联性的数据写入同一个索引
必须避免将结构完全不一样的数据写入同一个索引中,因为结构完全不一样的数据,field是完全不一样的,会导致index数据非常稀疏。最好将这种数据写入不同的索引中,如果这种索引数据量比较少,那么可以考虑给其很少的primary shard,比如1个,避免资源浪费。
(2)对document的结构进行规范化/标准化
即使要将不同类型的document写入相同的索引中,可对不同类型的document进行标准化。如果所有的document都有一个时间戳field,不过有的叫做timestamp,有的叫做creation_date,那么可以将不同document的这个field重命名为相同的字段,尽量让documment的结构相同。另外一个,就是比如有的document有一个字段,叫做goods_type,但是有的document没有这个字段,此时可以对没有这个字段的document,补充一个goods_type给一个默认值,比如default。
(3)避免使用多个types存储不一样结构的document
不建议在一个index中放很多个types来存储不同类型的数据。但是其实不是这样的,最好不要这么干,如果你在一个index中有多个type,但是这些type的数据结构不太一样,那么这些type实际上底层都是写到这个索引中的,还是会导致稀疏性。如果多个type的结构不太一样,最好放入不同的索引中,不要写入一个索引中。
(4)对稀疏的field禁用norms和doc_values
如果上面的步骤都没法做,那么只能对那种稀疏的field,禁止norms和doc_values字段,因为这两个字段的存储机制类似,都是每个field有一个全量的存储,对存储浪费很大。如果一个field不需要考虑其相关度分数,那么可以禁用norms,如果不需要对一个field进行排序或者聚合,那么可以禁用doc_values字段。

性能调优之索引写入性能优化

提高写入性能就是提高吞吐量

  1. 用bulk批量写入
    调整bulk线程池和队列。
    如果要往es里面灌入数据的话,那么根据业务场景来,如果业务场景可以支持,,将一批数据聚合起来,一次性写入es,那么就尽量采用bulk的方式,每次批量写个几百条这样子。
    bulk批量写入的性能比一条一条写入大量的document的性能要好很多。如果要知道一个bulk请求最佳的大小,需要对单个es node的单个shard做压测。先bulk写入100个document,然后200个,400个,以此类推,每次都将bulk size加倍一次。如果bulk写入性能开始变平缓的时候,那么这个就是最佳的bulk大小。并不是bulk size越大越好,而是根据集群等环境具体要测试出来的,因为越大的bulk size会导致内存压力过大,因此最好一个请求不要发送超过10mb的数据量。

之前测试这个bulk写入,上来就是多线程并发写bulk,先确定一个是bulk size,此时就尽量是用你的程序,单线程,一个es node,一个shard,测试。看看单线程最多一次性写多少条数据,性能是比较好的。

Bulk、线程池、队列大小:
1)客户端:
单个 bulk 请求体的数据量不要太大,官方建议大约5-15mb
写入端的 bulk 请求超时需要足够长,建议60s 以上
写入端尽量将数据轮询打到不同节点
2)服务器端:
索引创建属于计算密集型任务,应该使用固定大小的线程池来配置。来不及处理的放入队列,线程数应该配置成CPU 核心数 +1,避免过多的上下文切换
队列大小可以话当增加 不要过大 否则占用的内存会成为 GC 的负担

  1. 使用多线程将数据写入es
    单线程发送bulk请求是无法最大化es集群写入的吞吐量的。如果要利用集群的所有资源,就需要使用多线程并发将数据bulk写入集群中。为了更好的利用集群的资源,这样多线程并发写入,可以减少每次底层磁盘fsync的次数和开销。一样,可以对单个es节点的单个shard做压测,比如说,先是2个线程,然后是4个线程,然后是8个线程,16个,每次线程数量倍增。一旦发现es返回了TOO_MANY_REQUESTS的错误,JavaClient也就是EsRejectedExecutionException,之前有学员就是做多线程的bulk写入的时候,就发生了。此时那么就说明es是说已经到了一个并发写入的最大瓶颈了,此时我们就知道最多只能支撑这么高的并发写入了。

  2. 降低IO操作,增加refresh间隔和时长,降低refresh频率
    默认的refresh间隔是1s,用index.refresh_interval参数可以设置,这样会其强迫es每秒中都将内存中的数据写入磁盘中,创建一个新的segment file。正是这个间隔,让我们每次写入数据后,1s以后才能看到。但是如果我们将这个间隔调大,比如30s,可以接受写入的数据30s后才看到,那么我们就可以获取更大的写入吞吐量,因为30s内都是写内存的,每隔30s才会创建一个segment file。
    增加 refresh interval 的数值。默认为 1s,如果设置成-1,会禁止自动 refresh。避免过于频繁的 refresh,而生成过多的 segment 文件。但是会降低搜索的实时性
    增大静态配置参数indices.memory.index buffer_size,默认是 10%,会导致自动触发 refresh

  3. 禁止refresh和replia
    如果要一次性加载大批量的数据进es,可以先禁止refresh和replia复制,将index.refresh_interval设置为-1,将index.number_of_replicas设置为0即可。这可能会导致数据丢失,因为没有refresh和replica机制了。但是不需要创建segment file,也不需要将数据replica复制到其他的replica shasrd上面去。一旦写完之后,可以将refresh和replica修改回正常的状态。

  4. 禁止swapping交换内存
    可以将swapping禁止掉,有的时候,如果要将es jvm内存交换到磁盘,再交换回内存,大量磁盘IO,性能很差。

  5. 给filesystem cache更多的内存
    filesystem cache被用来执行更多的IO操作,如果能给filesystem cache更多的内存资源,那么es的写入性能会好很多。

  6. 使用es自动生成的文档id
    如果要手动给es document设置一个id,那么es需要每次都去确认一下那个id是否存在,这个过程是比较耗费时间的。如果我们使用自动生成的id,那么es就可以跳过这个步骤,写入性能会更好。对于你的业务中的表id,可以作为es document的一个field。

  7. 用性能更好的硬件
    我们可以给filesystem cache更多的内存,也可以使用SSD替代机械硬盘,避免使用NAS等网络存储,考虑使用RAID 0来条带化存储提升磁盘并行读写效率,等等。

  8. index buffer
    如果要进行非常重的高并发写入操作,那么最好将index buffer调大一些,indices.memory.index_buffer_size,这个可以调节大一些,设置的这个index buffer大小,是所有的shard公用的,但是如果除以shard数量以后,算出来平均每个shard可以使用的内存大小,一般建议,但是对于每个shard来说,最多给512mb。es会将这个设置作为每个shard共享的index buffer,那些特别活跃的shard会更多的使用这个buffer。默认这个参数的值是10%,也就是jvm heap的10%,如果我们给jvm heap分配10gb内存,那么这个index buffer就有1gb,对于两个shard共享来说,是足够的了。

提升es集群写入性能方法:

写性能优化的目标: 增大写吞吐量 (Events Per Second) ,越高越好

  1. 客户端: 多线程,批量写
    可以通过性能测试,确定最佳文档数量
    多线程:需要观察是否有 HTTP 429 返回,实现 Retry 以及线程数量的自动调节
  2. 服务器端: 单个性能问题,往往是多个因素造成的。需要先分解问题,在单个节点上进行调整并且结合测试,尽可能压榨硬件资源,以达到最高吞吐量
    使用更好的硬件。观察 CPU /IO Block0
    线程切换、堆栈情况
    降低 CPU 和存储开销,减少不必要分词 /避免不需要的 doc values /文档的字段尽量保证相同的顺序,可以提高文档的压缩率
    尽可能做到写入和分片的均衡负载,实现水平扩展,0Shard FilteringWrite Load Balancer

关闭无关的功能:
只需要聚合不需要搜索,lndex 设置成 false
不需要算分,Norms 设置成 false
不要对字符串使用默认的 dynamic mapping。因为索引字段数量过多,会对性能产生比较大的影响
Index_options 控制在创建倒排索引时,哪些内容会被添加到倒排索引中。优化这些设置,一定程度可以节约 CPU
关闭_source,减少IO 操作;(适合指标型数据)

针对性能的取舍:
如果需要追求极致的写入速度,可以牺牲数据可靠性及搜索实时性以换取性能
牺牲可靠性: 将副本分片设置为 0,写入完毕再调整回去
牺牲搜索实时性: 增加 Refresh interval 的时间
牺牲可靠性: 修改 Translog 的配置

ES 的默认设置,已经综合考虑了数据可靠性,搜索的实时性质,写入速度,一般不要盲目修改。一切优化,都要基于高质量的数据建模

性能调优之集群读性能优化

尽量 Denormalize 数据:避免嵌套和父子关系
Elasticsearch != 关系型数据库
尽可能Denormalize 数据,从而获取最佳的性能
使用 Nested 类型的数据。查询速度会慢几倍
使用 Parent /Child 关系。查询速度会慢几百倍

数据建模:
尽量将数据先行计算,然后保存到 Elasticsearch 中。尽量避免查询时的 Script 脚本计算
尽量使用 Filter Context,利用缓存机制,减少不必要的算分
结合 profile,explain API 分析慢查询的问题,持续优化数据模型。严禁使用*开头通配符 Terms 查询

左侧可以优化为右侧,filter方式查询,避免使用query context
聚合查询中使用query方式控制聚合数据量
避免使用*星号开头查询

优化分片:
避免 Over Sharing。一个查询需要访问每一个分片,分片过多,会导致不必要的查询开销
结合应用场景,控制单个分片的尺寸
Search: 20GB
Logging:40GB
Force-merge Read-only 索引。使用基于时间序列的索引,将只读的索引进行 force merge,减少 segment 数量

性能调优之搜索性能优化

  1. 给filesysgtem cache更多的内存
    es的搜索引擎严重依赖于底层的filesystem cache,如果给filesystem cache更多的内存,尽量让内存可以容纳所有的indx segment file索引数据文件,那么搜索的时候就基本都是走内存的,性能会非常高。
    如果最佳的情况下,生产环境实践经验,最好是用es就存少量的数据,就是要用来搜索的那些索引,内存留给filesystem cache的,就100G,那么你就控制在100gb以内,相当于数据几乎全部走内存来搜索,性能非常之高,一般可以在1秒以内。所以尽量在es里,就存储必须用来搜索的数据,比如现在有一份数据,有100个字段,其实用来搜索的只有10个字段,建议是将10个字段的数据,存入es,剩下90个字段的数据,可以放mysql,hadoop hbase,都可以。这样的话,es数据量很少,10个字段的数据,都可以放内存,就用来搜索,搜索出来一些id,通过id去mysql,hbase里面去查询明细的数据。

  2. 用更快的硬件资源
    (1)给filesystem cache更多的内存资源
    (2)用SSD固态硬盘
    (3)使用本地存储系统,不要用NFS等网络存储系统
    (4)给更多的CPU资源

  3. document模型设计
    document模型设计是非常重要的,尽量在document模型设计的时候,写入的时候就完成。另外对于一些太复杂的操作,比如join,nested,parent-child搜索都要尽量避免,性能都很差的。
    在搜索/查询的时候,要执行一些业务强相关的特别复杂的操作:
    (1)在写入数据的时候,就设计好模型,加几个字段,把处理好的数据写入加的字段里面
    (2)自己用java程序封装,es能做的用es来做,搜索出来的数据,在java程序里面去做,比如说我们基于es,用java封装一些特别复杂的操作

  4. 预先index data
    为了性能,提前优化data index时的数据模型,比如说document有一个price field,然后大多数查询都对一个固定的范围,对这个field使用range范围查询,那么可以提前将这个price的范围处理出来,写入一个字段中。

  5. 预热filesystem cache
    如果重启了es,那么filesystem cache是空壳的,就需要不断的查询才能重新让filesystem cache热起来,可以先对一些数据进行查询。比如一个查询,要用户点击以后才执行,才能从磁盘加载到filesystem cache里,第一次执行要10s,以后每次就几百毫秒。
    完全可以程序执行那个查询,预热,数据就加载到filesystem cahce,程序执行的时候是10s,以后用户真的来看的时候就才几百毫秒。

  6. 避免使用script脚本
    一般是避免使用es script的,实际生产中更是少用,性能不高,尽量不要使用。

  7. 使用固定范围的日期查询
    尽量不要使用now这种内置函数来执行日期查询,因为默认now是到毫秒级的,是无法缓存结果,尽量使用一个阶段范围,比如now/m,就是到分钟级。那么如果一分钟内,都执行这个查询,是可以取用查询缓存的。

性能调优之GC优化

ElasticSearch本质上是个Java程序,所以配置JVM垃圾回收器本身也是一个很有意义的工作。使用JVM的Xms和Xmx参数来提供指定内存大小,本质上提供的是JVM的堆空间大小,当JVM的堆空间不足的时候就会触发致命的OutOfMemoryException。这意味着要么内存不足,要么出现了内存泄露。处理GC问题,首先要确定问题的源头,一般有两种方案:

  1. 开启ElasticSearch上的GC日志
  2. 使用jstat命令
  3. 生成内存Dump
    关于第一条,在ES的配置文件elasticsearch.yml中有相关的属性可以配置,关于每个属性的用途这里当然说不完。
    第二条,jstat命令可以帮助查看JVM堆中各个区的使用情况和GC的耗时情况。
    第三条,最后就是将JVM的堆空间转储到文件中去,实质上是对JVM堆空间的一个快照。
    想了解更多关于JVM本身GC调优方法请参考:http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
    另外,通过修改ES节点的启动参数,也可以调整GC的方式,但是实质上和上述方法是等同的。

性能调优之路由优化

ES中所谓的路由和IP网络不同,是一个类似于Tag的东西。在创建文档的时候,可以通过字段为文档增加一个路由属性的Tag。ES内在机制决定了拥有相同路由属性的文档,一定会被分配到同一个分片上,无论是主分片还是副本。那么,在查询的过程中,一旦指定了感兴趣的路由属性,ES就可以直接到相应的分片所在的机器上进行搜索,而避免了复杂的分布式协同的一些工作,从而提升了ES的性能。于此同时,假设机器1上存有路由属性A的文档,机器2上存有路由属性为B的文档,那么在查询的时候一旦指定目标路由属性为A,即使机器2故障瘫痪,对机器1构不成很大影响,所以这么做对灾况下的查询也提出了解决方案。所谓的路由,本质上是一个分桶(Bucketing)操作。当然,查询中也可以指定多个路由属性,机制大同小异。

性能调优之分片优化

选择合适的分片数和副本数。ES的分片分为两种,主分片(Primary Shard)和副本(Replicas)。默认情况下,ES会为每个索引创建5个分片,即使是在单机环境下,这种冗余被称作过度分配(OverAllocation),目前看来这么做完全没有必要,仅在散布文档到分片和处理查询的过程中就增加了更多的复杂性,好在ES的优秀性能掩盖了这一点。假设一个索引由一个分片构成,那么当索引的大小超过单个节点的容量的时候,ES不能将索引分割成多份,因此必须在创建索引的时候就指定好需要的分片数量。此时所能做的就是创建一个新的索引,并在初始设定之中指定这个索引拥有更多的分片。反之如果过度分配,就增大了Lucene在合并分片查询结果时的复杂度,从而增大了耗时,所以我们得到了以下结论:
应该使用最少的分片!
主分片,副本和节点最大数之间数量存在以下关系:
节点数<=主分片数*(副本数+1)

控制分片分配行为。以上是在创建每个索引的时候需要考虑的优化方法,然而在索引已创建好的前提下,是否就是没有办法从分片的角度提高了性能了呢?当然不是,首先能做的是调整分片分配器的类型,具体是在elasticsearch.yml中设置cluster.routing.allocation.type属性,共有两种分片器even_shard,balanced(默认)。even_shard是尽量保证每个节点都具有相同数量的分片,balanced是基于可控制的权重进行分配,相对于前一个分配器,它更暴漏了一些参数而引入调整分配过程的能力。

每次ES的分片调整都是在ES上的数据分布发生了变化的时候进行的,最有代表性的就是有新的数据节点加入了集群的时候。当然调整分片的时机并不是由某个阈值触发的,ES内置十一个裁决者来决定是否触发分片调整,这里暂不赘述。另外,这些分配部署策略都是可以在运行时更新的。

相关文章:

Elasticsearch性能调优全攻略:从日志分析到集群优化

#作者&#xff1a;猎人 文章目录 前言搜索慢查询日志索引慢写入日志性能调优之基本优化建议性能调优之索引写入性能优化提升es集群写入性能方法&#xff1a;性能调优之集群读性能优化性能调优之搜索性能优化性能调优之GC优化性能调优之路由优化性能调优之分片优化 前言 es里面…...

Electron 主进程中使用Worker来创建不同间隔的定时器实现过程

背景 目前主进程使用 timer.setInterval 来做间隔任务执行&#xff0c;但是总有用户反馈养号卡主不执行了&#xff0c;或者某个操作不执行了&#xff0c;为了排除主进程的运行造成 setInterval 阻塞可能&#xff0c;将 setInterval 单独处理&#xff0c;可以排除主进程对定时器…...

用户安全架构设计

一、主动踢出&#xff0c;被动踢出 二、密码设计策略&#xff1a;密码复杂度&#xff0c;密码安全检查&#xff0c;密码失效设计&#xff0c;账号锁定设计&#xff0c;密码存储和传输加密 三、密码找回策略&#xff1a;密保问题&#xff0c;下行短信验证码&#xff0c;上行短信…...

2025年黑客扫段攻击激增:如何构建智能防御体系保障业务安全?

引言 2025年&#xff0c;随着全球物联网设备突破500亿台&#xff0c;黑客利用自动化工具发起的扫段攻击&#xff08;IP段扫描漏洞利用&#xff09;已成为企业业务安全的最大威胁之一。单次攻击可覆盖数万个IP&#xff0c;精准定位未修复漏洞&#xff0c;导致数据泄露、服务瘫痪…...

基于大模型预测胃穿孔预测与围手术期管理系统技术方案

目录 1. 系统架构模块2. 关键算法实现2.1 术前预测模型(Transformer多模态融合)2.2 术中实时分析(在线学习LSTM)3. 模块流程图(Mermaid)3.1 数据预处理系统3.2 术前预测系统3.3 术中实时分析系统4. 技术验证模块4.1 模型可解释性验证4.2 边缘计算部署架构1. 系统架构模块…...

Java转Go日记(三十六):简单的分布式

1.1.1. 简单的分布式server 目前分布式系统已经很流行了&#xff0c;一些开源框架也被广泛应用&#xff0c;如dubbo、Motan等。对于一个分布式服务&#xff0c;最基本的一项功能就是服务的注册和发现&#xff0c;而利用zk的EPHEMERAL节点则可以很方便的实现该功能。EPHEMERAL节…...

操作系统-进程与线程

操作系统 操作系统用来保护系统资源和提高稳定性的重要机制 文章目录 用户态和内核态为什么要区分状态&#xff1f; 进程管理进程&#xff0c;线程进程/线程切换进程的5种状态进程通信线程通讯进程调度算法 用户态和内核态 用户态 应用程序运行时所在的模式&#xff0c;权限受限…...

人体肢体渲染-一步几个脚印从头设计数字生命——仙盟创梦IDE

人体肢体动作数据集-太极拳 渲染代码 # 初始化Pygame pygame.init()# 设置窗口尺寸 WINDOW_WIDTH 800 WINDOW_HEIGHT 600 window pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption("动作回放")# 设置帧率 FPS 30 clock pyg…...

如何安全配置好CDN用于防止DDoS与Web攻击 ?

保护网站免受DDoS和Web攻击是至关重要的&#xff0c;CDN&#xff08;内容分发网络&#xff09;可以作为一种有效的防御工具。以下是一些安全配置CDN以防止DDoS和Web攻击的最佳实践&#xff1a; 1. 选择可靠的CDN提供商 安全功能&#xff1a; 选择拥有强大安全功能的CDN提供商…...

01-数据结构概述和时间空间复杂度

数据结构概述和时间空间复杂度 1. 什么是数据结构 数据结构&#xff08;Data Structure&#xff09;是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。 2. 什么是算法 算法&#xff08;Algorithm&#xff09;就是定义良好的计算…...

【ArcGIS技巧】根据地块、界址点图层生成界址线

"农经权二轮延包我已经写的差不多了&#xff0c;需要的一些生成四至、分割地块的功能也分享了替代的插件。前面刚分享完界址点的生成&#xff0c;今天分享界址线的生成&#xff0c;有需要的自取&#xff0c;至此&#xff0c;基本可以用这些功能完成出成果工作。" 1、…...

PC:使用WinSCP密钥文件连接sftp服务器

1. 打开winscp工具&#xff0c;点击“标签页”->“新标签页” 2. 点击“高级"->“高级” 3. 点击"验证"->“选择密钥文件” 选择ppk文件&#xff0c;如果没有ppk文件选择pem文件&#xff0c;会自动生成ppk文件 点击确定 4. 输入要连接到的sftp服务器的…...

RedHat7 如何更换yum镜像源

RedHat7如何更换yum镜像源&#xff1f; # 删除系统自带 yum rpm -qa|grep -e yum -e python-urlgrabber |xargs rpm -e --nodeps# 下载yum与wget的rpm软件包 curl -O http://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-3.4.3-168.el7.centos.noarch.rpm curl -O ht…...

k8s 1.10.26 一次containerd失败引发kubectl不可用问题

k8s 1.10.26 一次containerd失败引发kubectl不可用问题 开机k8s 1.10.26时&#xff0c;报以下错误 [rootmaster ~]# kubectl get no E0515 08:03:00.914894 7993 memcache.go:265] couldnt get current server API group list: Get "https://192.168.80.50:6443/api?…...

Qt信号槽机制与UI设计完全指南:从基础原理到实战应用

目录 前言一、信号槽1.1 传参1.2 Qt信号与槽的对应关系1.2.1一对多关系1.2.2 多对一关系 二、Designer三、Layout 布局3.1 基础用法3.2 打破布局3.3 贴合窗口3.4 伸展器&#xff08;Spacer&#xff09;3.5 嵌套布局 四、ui指针五、QWidget六、QLabel 标签使用指南总结 前言 本…...

微信小程序van-dialog确认验证失败时阻止对话框的关闭

使用官方(Vant Weapp - 轻量、可靠的小程序 UI 组件库)的before-close&#xff1a; wxml&#xff1a; <van-dialog use-slot title"名称" show"{{ show }}" show-cancel-button bind:cancel"onClose" bind:confirm"getBackInfo"…...

嵌入式学习--江科大51单片机day7

我们在听课的过程中&#xff0c;可能对老师讲的有疑问&#xff0c;或者有些自己的理解&#xff0c;我们可以去问豆包&#xff0c;包括在写博客的时候我也是&#xff0c;不断去问豆包保证思考的正确性。&#xff08;有人感觉豆包很low啊&#xff0c;其实这些基础性的东西豆包一般…...

spark和hadoop之间的区别和联系

Spark和Hadoop的对比 1. 架构层面 Hadoop&#xff1a; HDFS&#xff08;分布式文件系统&#xff09;&#xff1a;Hadoop的核心组件之一&#xff0c;用于存储大规模数据。它将数据分散存储在多个节点上&#xff0c;通过冗余存储&#xff08;默认三副本&#xff09;来保证数据…...

antd mobile 点击 TabBar 切换页面

switchRoute 函数&#xff0c;navigate 点击的 path import { Button, TabBar } from "antd-mobile"; import { useEffect } from "react"; import { Outlet, useNavigate } from "react-router-dom"; import { useDispatch } from "react…...

20250515让飞凌的OK3588-C的核心板在Linux R4下适配以太网RTL8211F-CG为4线百兆时的接线图

20250515让飞凌的OK3588-C的核心板在Linux R4下适配以太网RTL8211F-CG为4线百兆时的接线图 2025/5/15 20:19 缘起&#xff1a;以前做的网线找不到了&#xff0c;那就再来一条吧。 引脚定义要从头来过&#xff1f;还好找到了一条。 开干&#xff01; 万用表一对/点&#xff0c;几…...

大语言模型 07 - 从0开始训练GPT 0.25B参数量 - MiniMind 实机训练 预训练 监督微调

写在前面 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是目前最广泛应用的大语言模型架构之一&#xff0c;其强大的自然语言理解与生成能力背后&#xff0c;是一个庞大而精细的训练流程。本文将从宏观到微观&#xff0c;系统讲解GPT的训练过程&#xff0c;…...

【学习心得】WSL2安装Ubuntu22.04

为了使用Docker desktop&#xff0c;所以我的win10需要安装一下wsl并且下载一个Ubuntu。默认Windows10/11是自带wsl的&#xff0c;你在进行下面操作的时候可以升级一下wsl --update 1、管理员身份打开cmd&#xff0c;输入命令查询所有可以下载的Linux版本 # 查看有哪些 Linux 发…...

人工智能、深度学习、机器学习的联系与区别

定义 人工智能&#xff08;AI - Artificial Intelligence&#xff09; &#xff1a;是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。它旨在让计算机能够像人类一样思考、学习和决策&#xff0c;涉及到诸如计算机视觉、自然语言处理…...

基于互联网和LabVIEW的多通道数据采集系统仿真设计

标题:基于互联网和LabVIEW的多通道数据采集系统仿真设计 内容:1.摘要 在当今科技飞速发展的背景下&#xff0c;多通道数据采集在众多领域有着广泛需求。本研究的目的是设计一个基于互联网和LabVIEW的多通道数据采集系统仿真方案。采用互联网技术实现数据的远程传输与共享&…...

【Android】Android 实现一个依赖注入的注解

Android 实现一个依赖注入的注解 &#x1f3af; 目标功能 自定义注解 Inject创建一个 Injector 类&#xff0c;用来扫描并注入对象支持 Activity 或其他类中的字段注入 &#x1f9e9; 步骤一&#xff1a;定义注解 import java.lang.annotation.ElementType; import java.lan…...

【Ansible基础】Ansible 核心组件深度解析:控制节点、受管节点、Inventory与Playbook

目录​​​​​​​ 1 Ansible架构概述 2 控制节点&#xff08;Control Node&#xff09;详解 2.1 控制节点定义与功能 2.2 控制节点配置文件 3 受管节点&#xff08;Managed Node&#xff09;详解 3.1 受管节点特点 3.2 受管节点准备工作 3.3 连接方式对比 4 Invento…...

数据库--处理模型(Processing Model)(二)

执行查询的方法有很多,接下来将介绍以更高效和更有效率的方式执行分析工作负载(在OLAP系统中)的不同技术,包括以下内容: 执行并行性(Execution Parallelism)执行引擎(Execution Engines)执行操作符输出(Execution Operator Output)中间数据表示(Intermediate Data …...

机器学习 day03

文章目录 前言一、特征降维1.特征选择2.主成分分析&#xff08;PCA&#xff09; 二、KNN算法三、模型的保存与加载 前言 通过今天的学习&#xff0c;我掌握了机器学习中的特征降维的概念以及用法&#xff0c;KNN算法的基本原理及用法&#xff0c;模型的保存和加载 一、特征降维…...

鸿蒙OSUniApp 制作简洁高效的标签云组件#三方框架 #Uniapp

UniApp 制作简洁高效的标签云组件 在移动端应用中&#xff0c;标签云&#xff08;Tag Cloud&#xff09;是一种常见的UI组件&#xff0c;它以视觉化的方式展示关键词或分类&#xff0c;帮助用户快速浏览和选择感兴趣的内容。本文将详细讲解如何在UniApp框架中实现一个简洁高效的…...

【测试】用例篇

目录 1、如何编写测试用例&#xff1a; 1.1、设计测试用例时&#xff1a;正向思维逆向思维发散思维 2.2、万能公式 2、设计测试用例的方法 2.1、基于需求设计方法 1&#xff09;等价类: 2&#xff09;边界类 3&#xff09;场景法 4&#xff09;正交表法 5&#xff09;…...

力扣-46.全排列

题目描述 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 class Solution {List<List<Integer>> res new ArrayList<>();List<Integer> path new ArrayList<>();void backtracking(i…...

【氮化镓】HfO2钝化优化GaN 器件性能

2025年,南洋理工大学的Pradip Dalapati等人在《Applied Surface Science》期刊发表了题为《Role of ex-situ HfO2 passivation to improve device performance and suppress X-ray-induced degradation characteristics of in-situ Si3N4/AlN/GaN MIS-HEMTs》的文章。该研究基…...

STL?list!!!

一、引言 之前我们一起完成了STL库中的vector&#xff0c;本期我们将一起完成list这一容器&#xff0c;在本期学习中&#xff0c;我们会更加加深对于模板的认识&#xff0c;让我们更加能感受到模板的魅力&#xff01; 二、list的介绍与相关接口 list是STL库中提供的一个链表容…...

2025.05.14华为机考笔试题-第一题-100分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 01. 优先级任务调度系统 问题描述 LYA公司的开发团队正在设计一个智能任务调度系统。该系统需要根据任务优先级动态调整执行顺序,以提高团队工作效率。系统需要支持以下三种操作:…...

紫外相机工作原理及可应用范围

紫外相机是一种利用紫外线&#xff08;UV&#xff09;波段进行成像的设备&#xff0c;紫外线可用于机器视觉应用中&#xff0c;以检测使用可见光无法检测到的特征&#xff0c;工业上使用最常见的紫外波长是365nm和395nm。紫外相机通常用于高分辨率视频显微镜、电晕检测、半导体…...

海外短剧H5/App开源系统搭建指南:多语言+国际支付+极速部署

在全球短视频与短剧内容消费热潮下&#xff0c;搭建一个支持多语言、集成国际支付且能快速部署的海外短剧平台&#xff0c;已成为内容创作者和运营者的核心需求。本文将结合行业前沿技术与开源方案&#xff0c;提供一套完整的系统搭建指南&#xff0c;助您高效实现全球化布局 …...

AWS EC2 微服务 金丝雀发布(Canary Release)方案

为什么需要实现金丝雀发布? 在当前项目的工程实践中, 已经有了充分的单元测试, 预发布环境测试, 但是还是会在线上环境出现非预期的情况, 导致线上事故, 因此, 为了提升服务质量, 需要线上能够有一个预验证的机制. 如何实现金丝雀发布? 使用AWS code deploy方案 AWS code…...

2025年5月华为H12-821新增题库带解析

IS-IS核心知识 四台路由器运行IS-IS且已经建立邻接关系&#xff0c;区域号和路由器的等级如图中标记&#xff0c;下列说法中正确的有? R2和R3都会产生ATT置位的Level-1的LSPR1没有R4产生的LSP&#xff0c;因此R1只通过缺省路由和R4通信R2和R3都会产生ATT置位的Leve1-2的LSPR2和…...

从单体架构到微服务:架构演进之路

引言&#xff1a;当“大货车”遇上“集装箱运输” 在软件开发领域&#xff0c;单体架构曾像一辆载满货物的大货车&#xff0c;将所有功能打包在一个应用中。但随着业务复杂度飙升&#xff0c;这辆“大货车”逐渐陷入泥潭&#xff1a;启动慢如蜗牛、故障波及全局、升级如履薄冰……...

从 Excel 到 Data.olllo:数据分析师的提效之路

背景&#xff1a;Excel 的能力边界 对许多数据分析师而言&#xff0c;Excel 是入门数据处理的第一工具。然而&#xff0c;随着业务数据量的增长&#xff0c;Excel 的一些固有限制逐渐显现&#xff1a; 操作容易出错&#xff0c;难以审计&#xff1b; 打开或操作百万行数据时&…...

Uniapp开发鸿蒙购物项目教程之样式选择器

大家好&#xff0c;今天依然为大家带来鸿蒙跨平台开发教程的分享&#xff0c;我们本系列的教程最终要做一个购物应用&#xff0c;通过这个项目为大家分享uniapp开发鸿蒙应用从配置开发环境到应用打包上架的完成过程。 昨天的文章实现了应用首页的轮播图&#xff0c;其中涉及到…...

AI全域智能监控系统重构商业清洁管理范式——从被动响应到主动预防的监控效能革命

一、四维立体监控网络技术架构 1. 人员行为监控 - 融合人脸识别、骨骼追踪与RFID工牌技术&#xff0c;身份识别准确率99.97% - 支持15米超距夜间红外监控&#xff08;精度0.01lux&#xff09; 2. 作业过程监控 - UWB厘米级定位技术&#xff08;误差&#xff1c;0.3米&…...

协作赋能-1-制造业生产流程重构

制造业生产流程重构——从“信息孤岛”到“全链协同” 在制造业的数字化转型浪潮中&#xff0c;一个看似矛盾的现象正在蔓延&#xff1a;企业部署了ERP、MES、PLM等管理系统&#xff0c;却仍未摆脱“纸质工单满天飞、跨部门扯皮不断”的困境。以汽车制造业为例&#xff0c;其…...

游戏行业DDoS攻击类型及防御分析

游戏行业作为DDoS攻击的高发领域&#xff0c;攻击类型复杂多样&#xff0c;结合多个来源的信息&#xff0c;以下是其主要攻击类型及特征分析&#xff1a; 1. 传统流量型DDoS攻击 UDP洪水攻击&#xff1a;通过大量UDP报文淹没服务器端口&#xff0c;消耗带宽资源&#xff0c;导…...

嵌入式学习的第二十一天-数据结构-双向链表

一、双向链表 1.定义 双向链表是在单链表的每个结点中&#xff0c;再设置一个指向其钱去节点的指针域。 typedef struct DulNode {ElemType date;struct DulNode *pri;//直接前驱指针sturct DulNode *next&#xff1b;//直接后继指针 }DulNode,*DuLinkList;2.双向链表的创建 …...

Python爬虫第21节- 基础图形验证码识别实战

目录 前言 一、学习目标 二、环境准备 2.1 安装依赖 2.2 验证安装 三、获取验证码图片 3.1 常见获取方式 3.2 图片格式要求 四、基础识别流程 4.1 基础流程 4.2 常见问题及解决方案 五、 图像预处理提升识别率 5.1 灰度化 5.2 二值化 5.3 自定义阈值二值化 5.4…...

【React全栈进阶】从组件设计到性能优化实战指南

目录 &#x1f31f; 前言&#x1f3d7;️ 技术背景与价值&#x1fa79; 当前技术痛点&#x1f6e0;️ 解决方案概述&#x1f465; 目标读者说明 &#x1f9e0; 一、技术原理剖析&#x1f4ca; 核心概念图解&#x1f4a1; 核心作用讲解&#x1f527; 关键技术模块说明⚖️ 技术选…...

基于EFISH-SCB-RK3576/SAIL-RK3576的消防机器人控制器技术方案‌

&#xff08;国产化替代J1900的应急救援智能化解决方案&#xff09; 一、硬件架构设计‌ ‌极端环境防护系统‌ ‌防爆耐高温设计‌&#xff1a; 采用陶瓷纤维复合装甲&#xff08;耐温1200℃持续1小时&#xff09;&#xff0c;通过GB 26784-2023消防设备防爆认证IP68防护等级…...

插件双更新:LeetCode 刷题支持正式上线,JetBrains IDE 插件持续升级!

为了让更多开发者在真实开发与算法练习中体验 MoonBit 的高效表达与编译性能&#xff0c;MoonBit 语言现已实现对 JetBrains 开发环境与 LeetCode 答题平台的全面支持&#xff01; 无论你是习惯用 IDE 编写项目的开发者&#xff0c;还是希望通过 LeetCode 刷题提升算法能力的程…...

编译OpenSSL时报错,Can‘t locate IPC/Cmd.pm in @INC perl环境

Unix / Linux / macOS $ ./Configure $ make $ make test1、make Can‘t locate IPC/Cmd.pm in INC [ Downloads ] - /source/index.html https://www.openssl.org/source/ yum -y install perl-IPC-Cmd 2.make test Can’t locate Test/More.pm in INC perl环境 yum -…...