Elasticsearch内存那些事儿

elasticsearch 一次性查询数据量过大 jvm内存快速占用满 导致集群无响应 近期因为生产上es集群出现了内存快速占用满、频繁gc、集群无响应的现象,查看集群日志和满查询日志,发现都是因为频繁gc集群无响应后出现的报错、gc高频的警告以及平时不慢的查询报文出现在慢查询日志里。 看kibana的监控,发现内存几乎是在几秒内就占用满,并且满了以后,由于可用内存不足就开始频繁的full gc,cpu居高不下,集群此时基本在无法响应的状态,有遇到这种情况,只能重启才能解决,无法自己恢复,内存虽然已经占用满,但是集群日志中没有OOM的异常,而且出现的概率比较随机。 由于之前没有遇到过这个问题, 阅读详情

 

Elasticsearch 内存分配设置详解。

前言

「该给 ES 分配多少内存?」
「为什么是给 ES 分配服务器的一半内存?」
「为什么内存使用率不断升高,没有释放?」
「为何经常有某个 field 的数据量超出内存限制的异常?」
「为何感觉上没多少数据,也会经常 Out Of Memory?」

相信每个ES使用者或者运维人员都遇到过这些问题,也踩过不少坑。

这里根据我个人的学习和日常工作的使用心得,谈一谈 Elasticsearch 的内存那些事儿。

一、Elasticsearch为什么吃内存

  • ES 是 JAVA 应用
  • 底层存储引擎是基于 Lucene 的

1. 是JAVA应用,就离不开JVM和GC

对 JVM GC 这里不做深入探讨,我们只要知道:应用层面生成大量长生命周期的对象,是给 heap 造成压力的主要原因。

例如读取一大片数据在内存中进行排序,或者在 heap 内部建 cache 缓存大量数据。如果 GC 释放的空间有限,而应用层面持续大量申请新对象,GC 频度就开始上升,同时会消耗掉很多CPU时间。严重时可能恶性循环,导致整个集群停工。因此在使用 ES 的过程中,要知道哪些设置和操作容易造成以上问题,有针对性的予以规避。

2. Lucene的倒排索引是先在内存里生成

Lucene 的倒排索引(Inverted Index)是先在内存里生成,然后定期以段文件(segment file)的形式刷到磁盘的。

每个段实际就是一个完整的倒排索引,并且一旦写到磁盘上就不会做修改。API 层面的文档更新和删除实际上是增量写入的一种特殊文档,会保存在新的段里。不变的段文件易于被操作系统 cache,热数据几乎等效于内存访问。

二、Elasticsearch的内存消耗

1. 预留一半内存给Lucene使用

我们经常在网上看见别人说「预留一半内存给Lucene使用」。很多人不理解这句话,一开始我也不理解。

举个实际场景,假设你有一个 64 G 内存的机器,按照正常思维思考,肯定是把 64 G 内存都给 Elasticsearch 比较好,但现实却不是这样。

毋庸置疑,内存对于 Elasticsearch 来说绝对是重要的,但还有一个内存消耗大户 —— Lucene。

Lucene 的设计目的是把底层 OS 里的数据缓存到内存中。Lucene 的段是分别存储到单个文件中的,这些文件都是不会变化的,所以很利于缓存,同时操作系统也会把这些段文件缓存起来,以便更快的访问。
Lucene 的性能取决于和 OS 的交互,如果你把所有的内存都分配给 Elasticsearch,不留一点给 Lucene,那你的全文检索性能会很差的。

所以,不难理解为何官方建议 heap size 不要超过系统可用内存的一半,因为 heap 以外的内存并不会被浪费,Lucene 会很开心的利用他们来 cache 被用读取过的段文件。

2. 不要超过32G

这里有另外一个原因不分配大内存给 Elasticsearch,事实上 jvm 在内存小于 32 G 的时候会采用一个内存对象指针压缩技术。

在 Java 中,所有的对象都分配在堆上,然后有一个指针引用它。指向这些对象的指针大小通常是 CPU 的字长的大小,不是 32 bit 就是 64 bit,这取决于你的处理器,指针指向了你的值的精确位置。

对于 32 位系统,你的内存最大可使用 4 G。对于 64 系统可以使用更大的内存。但是 64 位的指针意味着更大的浪费,因为你的指针本身大了。浪费内存不算,更糟糕的是,更大的指针在主内存和缓存器(例如 LLC,L1 等)之间移动数据的时候,会占用更多的带宽。

Java 使用一个叫内存指针压缩的技术来解决这个问题。它的指针不再表示对象在内存中的精确位置,而是表示偏移量。这意味着 32 位的指针可以引用 40 亿个对象,而不是 40 亿个字节。最终,也就是说堆内存长到 32 G 的物理内存,也可以用 32 bit 的指针表示。

一旦你越过那个神奇的 30 - 32 G 的边界,指针就会切回普通对象的指针,每个对象的指针都变长了,就会使用更多的 CPU 内存带宽,也就是说你实际上失去了更多的内存。事实上当内存到达 40 - 50 GB 的时候,有效内存才相当于使用内存对象指针压缩技术时候的 32 G 内存。

这段描述的意思就是说:即便你有足够的内存,也尽量不要超过 32 G,因为它浪费了内存,降低了 CPU 的性能,还要让 GC 应对大内存。

3. JVM参数

从官方建议,Heap 分配不要超过系统可用内存的一半,并且不要超过 32 GB 。那么 JVM 参数呢?对于初级用户来说,并不需要做特别调整,仍然遵从官方的建议,将 Xms 和 Xmx 设置成和 heap 一样大小,避免动态分配 heap size 就好了。虽然有针对性的调整 JVM 参数可以带来些许 GC 效率的提升,当有一些「坏」用例的时候,这些调整并不会有什么魔法效果帮你减轻 heap 压力,甚至可能让问题更糟糕。

确保 Xms 和 Xmx 的大小是相同的,其目的是为了能够在 java 垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源,可以减轻伸缩堆大小带来的压力。

4. ES的几个内存消耗大户

通过查阅资料,了解到有几个 ES 的内存消耗大户,就是他们把 ES 的 heap 瓜分掉的:

  • segment memory
  • filter cache
  • field data cache
  • bulk queue
  • indexing buffer
  • state buffer
  • 超大搜索聚合结果集的 fetch
  • 对高 cardinality 字段做 terms aggregation

下面对它们分别做解读:

Segment Memory

Segment 不是file 吗?segment memory 又是什么?

前面提到过,一个 segment 是一个完备的 lucene 倒排索引,而倒排索引是通过词典(Term Dictionary)到文档列表(Postings List)的映射关系,快速做查询的。

由于词典的 size 会很大,全部装载到 heap 里不现实,因此 Lucene 为词典做了一层前缀索引(Term Index),这个索引在 Lucene4.0 以后采用的数据结构是 FST(Finite State Transducer)。这种数据结构占用空间很小,Lucene 打开索引的时候将其全量装载到内存中,加快磁盘上词典查询速度的同时减少随机磁盘访问次数。

说了这么多,要传达的一个意思就是,ES 的 data node 存储数据并非只是耗费磁盘空间的,为了加速数据的访问,每个 segment 都有会一些索引数据驻留在 heap 里。

因此 segment 越多,瓜分掉的 heap 也越多,并且这部分 heap 是无法被 GC 掉的!理解这点对于监控和管理集群容量很重要,当一个 node 的 segment memory 占用过多的时候,就需要考虑删除、归档数据,或者扩容了。

怎么知道 segment memory 占用情况呢?CAT API 可以给出答案。


 

bash

# 查看一个索引所有segment的memory占用情况,重点看size.segment这一列 GET /_cat/segments/cc-xxxx-2018-03-20?v&h=shard,segment,size,size.segment # 查看一个node上所有segment占用的memory总和 GET /_cat/nodes?v&h=name,port,sm

那么有哪些途径减少 data node上 的 segment memory 占用呢? 总结起来有三种方法:

  • 删除不用的索引
  • 关闭索引
    文件仍然存在于磁盘,只是释放掉内存,需要的时候可以重新打开。
  • 段合并
    定期对不再更新的索引做 force merge api(ES2.0 及更早版本叫做 optimize)。也就是强制段合并,可以节省大量的 segment memory。

Request cache(5.x以前叫做Filter Cache)

Request cache 是用来缓存查询中参数 size=0 的请求,所以就不会缓存 hits 而是缓存 hits.total,aggregations 和 suggestions,需要注意的是这个缓存也是常驻 heap,在被 evict 掉之前,是无法被 GC 的。我的经验是默认的 10% heap 设置工作得够好了,如果实际使用中 heap 没什么压力的情况下,才考虑加大这个设置。

Field Data cache

在有大量排序、数据聚合的应用场景,可以说 field data cache 是性能和稳定性的杀手。

对搜索结果做排序或者聚合操作,需要将倒排索引里的数据进行解析,按列构造成 docid -> value 的形式才能够做后续快速计算。

对于数据量很大的索引,这个构造过程会非常耗费时间,因此 ES2.0 以前的版本会将构造好的数据缓存起来,提升性能。但是由于 heap 空间有限,当遇到用户对海量数据做计算的时候,就很容易导致 heap 吃紧,集群频繁 GC ,根本无法完成计算过程。

ES2.0以后,正式默认启用 Doc Values 特性(1.x 需要手动更改 mapping 开启),将 field data 在 indexing time 构建在磁盘上,经过一系列优化,可以达到比之前采用 field data cache 机制更好的性能。因此需要限制对 field data cache 的使用,最好是完全不用,可以极大释放 heap 压力。

需要注意的是,很多人已经升级到 ES2.0,或者 1.0 里已经设置 mapping 启用了 doc values,在 kibana 里仍然会遇到问题。

这里一个陷阱就在于 kibana 的 table panel 可以对所有字段排序。设想如果有一个字段是 analyzed 过的,而用户去点击对应字段的排序表头是什么后果?一来排序的结果并不是用户想要的,排序的对象实际是词典;二来 analyzed 过的字段无法利用 doc values,需要装载到 field data cache,数据量很大的情况下可能集群就在忙着 GC 或者根本出不来结果。

Bulk Queue

一般来说,Bulk queue 不会消耗很多的 heap,但是见过一些用户为了提高 bulk 的速度,客户端设置了很大的并发量,并且将 bulk Queue 设置到不可思议的大,比如好几千。

Bulk Queue 是做什么用的?当所有的 bulk thread 都在忙,无法响应新的 bulk request 的时候,将 request 在内存里排列起来,然后慢慢清掉。

这在应对短暂的请求爆发的时候有用,但是如果集群本身索引速度一直跟不上,设置的好几千的 queue 都满了会是什么状况呢?取决于一个 bulk 的数据量大小,乘上 queue 的大小,heap 很有可能就不够用,内存溢出了。

一般来说官方默认的 thread pool 设置已经能很好的工作了,建议不要随意去「调优」相关的设置,很多时候都是适得其反的效果。

Indexing Buffer

Indexing Buffer 是用来缓存新数据,当其满了或者 refresh/flush interval 到了,就会以 segment file 的形式写入到磁盘。

这个参数的默认值是 10% heap size。根据经验,这个默认值也能够很好的工作,应对很大的索引吞吐量。

但有些用户认为这个 buffer 越大吞吐量越高,因此见过有用户将其设置为 40% 的。到了极端的情况,写入速度很高的时候,40% 都被占用,导致 OOM。

Cluster State Buffer

ES 被设计成每个 node 都可以响应用户的 api 请求,因此每个 node 的内存里都包含有一份集群状态的拷贝。

这个 cluster state 包含诸如集群有多少个 node,多少个 index,每个 index 的 mapping 是什么?有少 shard,每个 shard 的分配情况等等 (ES 有各类 stats api 获取这类数据)。

在一个规模很大的集群,这个状态信息可能会非常大的,耗用的内存空间就不可忽视了。并且在 ES2.0 之前的版本,stat e的更新是由 master node 做完以后全量散播到其他结点的。频繁的状态更新就可以给 heap 带来很大的压力。在超大规模集群的情况下,可以考虑分集群并通过 tribe node 连接做到对用户 api 的透明,这样可以保证每个集群里的 state 信息不会膨胀得过大。

超大搜索聚合结果集的 fetch

ES 是分布式搜索引擎,搜索和聚合计算除了在各个 data node 并行计算以外,还需要将结果返回给汇总节点进行汇总和排序后再返回。

无论是搜索,还是聚合,如果返回结果的 size 设置过大,都会给 heap 造成很大的压力,特别是数据汇聚节点。超大的 size 多数情况下都是用户用例不对,比如本来是想计算 cardinality,却用了 terms aggregation + size:0 这样的方式; 对大结果集做深度分页;一次性拉取全量数据等等。

对高 cardinality 字段做 terms aggregation

所谓高 cardinality,就是该字段的唯一值比较多。

比如 client ip,可能存在上千万甚至上亿的不同值。对这种类型的字段做 terms aggregation 时,需要在内存里生成海量的分桶,内存需求会非常高。如果内部再嵌套有其他聚合,情况会更糟糕。

在做日志聚合分析时,一个典型的可以引起性能问题的场景,就是对带有参数的 url 字段做 terms aggregation。对于访问量大的网站,带有参数的 url 字段 cardinality 可能会到数亿,做一次 terms aggregation 内存开销巨大,然而对带有参数的 url 字段做聚合通常没有什么意义。

对于这类问题,可以额外索引一个 url_stem 字段,这个字段索引剥离掉参数部分的 url。可以极大降低内存消耗,提高聚合速度。

5. 小结

  • 倒排词典的索引需要常驻内存,无法 GC,需要监控 data node 上segment memory 增长趋势。
  • 各类缓存,field cache, filter cache, indexing cache, bulk queue 等等,要设置合理的大小,并且要应该根据最坏的情况来看 heap 是否够用,也就是各类缓存全部占满的时候,还有 heap 空间可以分配给其他任务吗?避免采用 clear cache 等「自欺欺人」的方式来释放内存。
  • 避免返回大量结果集的搜索与聚合。确实需要大量拉取数据的场景,可以采用 scan & scroll api 来实现。
  • cluster stats 驻留内存并无法水平扩展,超大规模集群可以考虑分拆成多个集群通过 tribe node 连接。
  • 想知道 heap 够不够,必须结合实际应用场景,并对集群的 heap 使用情况做持续的监控。
  • 根据监控数据理解内存需求,合理配置各类 circuit breaker,将内存溢出风险降低到最低。

三、Elasticsearch节点的内存怎么分配

上面说过,32 GB 是 ES 一个内存设置限制,那如果你的机器有很大的内存怎么办呢?现在的机器内存普遍都大,一般都有 300 - 500 GB 内存的机器。

当然,如果有这种机器,那是极好的,接下来有两个方案:

  • 如果主要做全文检索,可以考虑给 Elasticsearch 32 G 内存,剩下的交给 Lucene 用作操作系统的文件系统缓存,所有的 segment 都缓存起来,会加快全文检索。
  • 如果需要更多的排序和聚合,那就需要更大的堆内存。可以考虑一台机器上创建两个或者更多的 ES 节点,而不要部署一个使用 32 + GB 内存的节点。仍然要坚持 50% 原则,假设你有个机器有 128 G 内存,你可以创建两个 node,使用 32 G 内存。也就是说 64 G 内存给 ES 的堆内存,剩下的 64 G 给 Lucene。

PS:如果选择第二种方案,需要配置 cluster.routing.allocation.same_shard.host: true。这会防止同一个 shard 的主副本存在同一个物理机上(因为如果存在一个机器上,副本的高可用性就没有了)。


ElasticSearch集群内存占用高?如何降低内存占用看这篇文章就够啦!(冻结索引)_es占用内存太大(1) 在上述代码中,我们首先创建了一个 SearchRequest 对象,然后使用 IndicesOptions.fromOptions() 方法创建了一个 IndicesOptions 对象,并将参数设置为 false。这样,搜索请求将遵循指定的索引选项,而不使用默认的 ignoreThrottled 参数值。要设置 ignoreThrottled 参数为 false,您可以使用 IndicesOptions.fromOptions() 方法并传递适当的参数。 阅读详情

相关推荐

清理Elasticsearch占用的内存和磁盘空间

ELK中的Kibana连不上Elasticsearch了,提示Cannot connect to the Elasticsearch cluster,检查发现OutOfMemoryError,通过删除历史索引,达到清理Elasticsearch占用的内存和磁盘空间的目的

laolitou_1024的博客 5403

(一:原理4)ElasticSearch内存分配以及优化

ElasticSearch内存分配以及优化 1:服务器内存分配 内存消耗大户: 1:Elasticsearch 2:Lucene(全文搜索) 2:内存解释 2.1:Elasticsearch Elasticsearch默认安装后设置的堆内存是1GB,实际业务肯定不够,需要进行配置,不要超过32G 因为如果堆大小小于 32 GB,JVM 可以利用指针压缩,这可以大大降低内存的使用:每个指针 4 字...

weixin_43930865的博客 1万+

从Elasticsearch到Milvus:深入聊聊BM25在主流搜索引擎与向量数据库里的那些事儿

本文深入解析BM25算法在Elasticsearch和Milvus中的实现差异与优化策略,探讨传统搜索引擎与向量数据库的混合搜索架构设计。通过参数调优和实战案例,展示BM25在电商搜索和金融风控等场景中的性能提升效果,为技术选型提供实用指南。

weixin_30407613的博客 425

elasticsearch内存占用详细分析

内存占用 ES的JVM heap按使用场景分为可GC部分和常驻部分。 可GC部分内存会随着GC操作而被回收; 常驻部分不会被GC,通常使用LRU策略来进行淘汰; 内存占用情况如下图: common space 包括了indexing buffer和其他ES运行需要的class。indexing buffer由indices.memory.index_buffer_size参数控制, 默认最大占用10%,当full up后,该部分数据被刷入磁盘对应的Segments中。这部分空间是可以被回收

Angus 8289

虚拟机安装ElasticSearch遇到的那些事儿

一、 运行环境 操作系统:CentOS Linux 7 内核版本:Linux version:3.10.0-862.e17.x86_64 (输入 cat /proc/version可查看) 二、 学习ElasticSearch 1、 ES部署(无需安装) 下载ElasticSearch: 1) https://artifacts.elastic.co/downloads/ela...

qq_29443647的博客 1501

【Elasticsearch】Elasticsearch 性能优化合集

ElasticSearch部署架构和容量规划 让Elasticsearch飞起来!百亿级实时查询优化实战Elasticsearch:shard 分配感知

九师兄 830

ElasticSearch四:ES分布式怎么进行部署

es生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片? 这个问题,包括后面的redis什么的,谈到es、redis、mysql分库分表等等技术,面试必问!就是你生产环境咋部署的?说白了,这个问题没啥技术含量,就是看你有没有在真正的生产环境里干过这事儿! 有些同学可能是没在生产环境中干过的,没实际去拿线上机器部署过es集群,也没实际玩儿过,也没往es集群里面导...

qq_41864967的博客 1622

AutoSAR RTE调度机制揭秘:从定时器事件到Runnable执行的完整流程

本文深入解析了AutoSAR RTE(运行时环境)的核心调度机制,详细阐述了从定时器事件触发到Runnable(可运行实体)执行的完整流程。通过剖析Rte_Start()函数、OS任务与警报的交互,以及事件驱动循环,揭示了RTE如何作为幕后指挥家,高效、可靠地协调软件组件间的周期性任务执行,是打通AutoSAR应用开发的关键。

weixin_29169899的博客 229

拆解 “ES 已死“ 伪命题:Agentic RAG 时代搜索引擎的终极形态

综上所述,无论是传统 RAG 场景,还是代表未来趋势的 Agentic RAG 场景,Elasticsearch 凭借其丰富的功能、强大的处理能力以及完整的闭环体系,都将是技术选型时不容忽视的择优选项。那些宣扬 “ES已死” 的言论,纯粹就是瞎扯。其实开源社区真没必要天天想着怎么攻击别人,也别总想着用一些歪门邪道去误导用户。真想让这个行业进步,应该是一起把蛋糕做大,让更多的使用场景从传统的文本检索上进行迁移。

Elastic 中国社区官方博客 1992

ANPC三电平拓扑:两种调制方式解析

ANPC结构是基于“I”型NPC结构(下面讲NPC如不特殊说明,均指的是“I”型结构NPC)发展出来的一种改进型。我们在讲NPC结构的时候会谈到他的一个缺点就是损耗分布不均匀,会导致温升不均衡,进而限制模块的功率输出能力。而ANPC结构由于多了两个开关管以及相应的两个中性点换流回路(如下图),可以更加灵活任意的配置开关管可以使损耗没有那么的不均衡,从而能一定程度上提高模块的输出功率。ANPC拓扑结构图以及增加的环流回路。

IOTBOT的博客 9502

从硬件到软件:TSMaster报文过滤全链路配置指南(含同星设备适配)

本文详细介绍了TSMaster平台下CAN/LIN/FlexRay总线的报文过滤全链路配置指南,特别针对同星TC1016等硬件的兼容性进行实战演示。从硬件层预过滤到软件层可编程过滤,提供五维过滤体系构建方法,帮助工程师提升车载诊断与总线分析效率。重点解析混合总线过滤策略优化及诊断场景下的特殊过滤方案。

tensorflowjs6的博客 403

ElasticSearch那些事儿(四)

在使用过程中,陆陆续续踩了不少坑,每次觉得无法逾越时,心里都想放弃,一是因为这东西要完全掌握不是那么容易,需要花很多时间;二是如果继续使用曾经用过的zabbix,说不定可以很快满足眼前的需求,从而可以抽身做其他事情。但坚持下来,就一定能从坑里爬起来,从而对这个系统更加了解,并利用这头”猛兽”帮助我做更多事情。原因很简单,ElasticSearch除了是一个分布式数据库,还是一个扩展性和可用性都很强的近实时搜索引擎。 目前为止,踩过以下几个坑: 集群搭建不成功 未使用内网IP,导致恢复缓慢 未使用队列

Computer_hello的博客 279

华为昇腾Ascend C中级认证考试-tanh

注册昇腾社区账号后可以免费领券考试。

2600_96284887的博客 474

ElasticSearch那些事儿(一)

开源的Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选。它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。 最近在工作上使用到了Elasticsearch全文搜索引擎,打算系统学习一下,出一个系列相关的文章,欢迎大家一起讨论。 一、简介 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful Web接口。同时Elasticsearch是用Java开发的

Computer_hello的博客 562

无人机飞控技术最详细解读

已剪辑自: https://zhuanlan.zhihu.com/p/64519280[导读]被称作是“飞行器的大脑”的飞控到底是什么?以前,搞无人机的十个人有八个是航空、气动、机械出身,更多考虑的是如何让飞机稳定飞起来、飞得更快、飞得更高。如今,随着芯片、人工智能、大数据技术的发展,无人机开始了智能化、终端化、集群化的趋势,大批自动化、机械电子、信息工程、微电子的专业人材投入到了无人机研发大潮中,几年的时间让无人机从远离人们视野的军事应用飞入了寻常百姓家、让门外汉可以短暂的学习也能稳定可靠的飞行娱乐。不可

qq_41854911的博客 1万+

【深度学习】肺结节分割项目实战二:分割肺实质

在后续训练模型的时候如果直接使用原始的肺部CT图像,其中的非肺区域会对训练造成干扰,因此我们需要提取分割肺实质。这一部分参考了kaggle上的教程。 从这张CT图像中可以看出扫描器以外的部分为黑色,背景和肺内部颜色较深,非肺组织和骨头颜色较浅。我们的目的是将肺部分割出来。由于肺部区域和其他部分对比明显,我们可以设置一个合适的阈值对图像中的区域进行隔离。 import argparse import os import numpy as np from medpy.filter.smoothing imp

weixin_42182906的博客 7242

关于ES6的let、const那些事儿

Babel 转码器 Babel是广泛使用的一个ES6转换器,将ES6代码转换成ES5代码,从而实现在老版本的浏览器执行。 let和const命令 let所声明的变量只在let命令所在的代码块内是有效的。 { let a = 10; var b = 1; } a // 10 b // index.html:16 Uncaught ReferenceError: b is not defined 通过let给出了变量的作用域问题,在我们通常的for循环使用比较方便 var a = [

Indomite的博客 460

vue3(微信公众号H5网页):调用wx.config报错config:fail,invalid signature,在vue3 h5项目开发微信内置浏览器JS-SDK/JS-API提示签名失效/错误

微信公众号网页,vue3 H5网页,uniapp h5,wx.config 报错:config:fail,invalid signature?无效签名,微信JSSDK分享接口中wx.config 出现invalid signature问题的解决办法,微信公众号签名失效,wx.config中出现invalid signature的解决方法,H5页面调起微信的拍照与分享功能,导致的config:invalid signature这个错误的解决办法,微信网页调用分享功能出现config:fail,invalid

✅ 精选推荐文章 5056

Android内存那点事儿

好久没有写了,不是忘了,也不是懒,是因为迷茫了~~不知道该学什么,该写什么,该走什么样子的路,该做什么样子的人。我嘴笨,不知道怎么把自己会的讲给别人,我愿意分享,所以我就写出来,不管是对的,错的,希望大家能取其精华去其糟粕,不要因为我而误导诸位。废话不多说了~~ 你的应用内存泄漏了么? 要看是不是存在内存泄漏,首先我们要看到内存信息,如何看到内存信息呢?这里介绍一种方法,打开Eclipse

dream.zhou 1221

【网络与爬虫 44】Canvas指纹伪造技术:突破浏览器图形渲染检测的终极指南

Canvas和WebGL指纹是现代反爬虫系统中最难绕过的检测技术之一,它们通过分析浏览器图形渲染的细微差异来识别用户设备。本文将深入解析Canvas和WebGL指纹的工作原理,探讨其在反爬虫检测中的应用,并提供多种有效的伪造和绕过策略,帮助开发者理解并应对这些高级检测技术。

熵数实验室 1210

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Elasticsearch内存管理实战:从JVM堆到文件缓存的全面调优指南

内存管理是分布式搜索与数据分析系统的核心课题,其原理直接决定了系统的稳定性与查询性能。在Java生态中,JVM堆内存与垃圾回收机制是基础,而堆外内存、特别是操作系统文件系统缓存,则是高性能检索的关键。从技术价值看,高效的内存管理能显著降低延迟、提升吞吐量,并保障集群长期稳定运行。其应用场景广泛覆盖了日志分析、实时监控、全文检索等数据密集型领域。本文聚焦于Elasticsearch这一流行引擎,深入剖析其堆内内存(如索引缓冲、字段数据缓存)与堆外内存(尤其是文件系统缓存)的**内存使用机制**,并提供从JVM

weixin_33698043的博客 338

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ElasticSearch的jvm堆内存设置:真的是越大越好吗?

关于ElasticSearch的堆内存设置,目前大多数的建议是低于32GB,这是由于jvm中有个指针压缩的概念(compressed ordinary object pointers, compressed oops):

三苦庵笔记 2142

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

内存分配那些事儿

内存 程序的内存布局 现代的应用程序都运行在一个内存空间里,在32位系统里,这个内存空间拥有2的32次方(4GB)的寻址能力。这种内存模型又称为平坦的内存模型,整个内存是同一个统一的地址空间,用户可以使用一个32位的指针访问任意内存位置。如 int *p = (int*) 0x0018ff44 *p = 10; 这段代码展示了如何直接读写指定地址的内存数据。在4GB的内存空间中,一部分会挪给内核使用,应用程序无法直接访问这内存,这一部分叫做内核空间。windows系统一般会把高地址的2GB内存(或者配置为

qq_45679717的博客 249

【es6学习】let与const的那些事儿(二)

3 canst 命令 3.1 基本用法 const 声明 一个只读的常量。一 旦声明,常量的值就不能改变。 const PI = 3.1415 ; PI // 3.1415 PI = 3; // TypeError: Assignment to constant variable. 上面的代码表明改变常量的值会报错。 const 声明的常量不得改变值。这意味着, const 一旦声明常量,就必须立即初始化,不能留到以后赋值。 const foo; // SyntaxError : Missing

weixin_41884808的博客 216
上一篇: 关于 Elasticsearch 内存占用及分配
下一篇: Flink 容错机制与状态
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值