iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >如何进行Elasticsearch调优实践
  • 761
分享到

如何进行Elasticsearch调优实践

2023-06-05 02:06:17 761人浏览 八月长安
摘要

今天给大家介绍一下如何进行elasticsearch调优实践。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。背景Elasticsearch(ES)作为NOSQL

今天给大家介绍一下如何进行elasticsearch调优实践。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。

背景

Elasticsearch(ES)作为NOSQL+搜索引擎的有机结合体,不仅有近实时的查询能力,还具有强大的聚合分析能力。因此在全文检索、日志分析、监控系统、数据分析等领域ES均有广泛应用。而完整的Elastic Stack体系(Elasticsearch、Logstash、Kibana、Beats),更是提供了数据采集、清洗、存储、可视化的整套解决方案。 

本文基于ES 5.6.4,从性能和稳定性两方面,从linux参数调优、ES节点配置和ES使用方式三个角度入手,介绍ES调优的基本方案。当然,ES的调优绝不能一概而论,需要根据实际业务场景做适当的取舍和调整,文中的疏漏之处也随时欢迎批评指正。

性能调优

一 Linux参数调优

关闭交换分区,防止内存置换降低性能。 将/etc/fstab 文件中包含swap的行注释掉

sed -i '/swap/s/^/#/' /etc/fstabswapoff -a

磁盘挂载选项

  • noatime:禁止记录访问时间戳,提高文件系统读写性能

  • data=writeback: 不记录data journal,提高文件系统写入性能

  • barrier=0:barrier保证journal先于data刷到磁盘,上面关闭了journal,这里的barrier也就没必要开启了

  • nobh:关闭buffer_head,防止内核打断大块数据的io操作

mount -o noatime,data=writeback,barrier=0,nobh /dev/sda /es_data

对于SSD磁盘,采用电梯调度算法,因为SSD提供了更智能的请求调度算法,不需要内核去做多余的调整 (仅供参考)

echo noop > /sys/block/sda/queue/scheduler

二 ES节点配置

conf/elasticsearch.yml文件:

 1. 适当增大写入buffer和bulk队列长度,提高写入性能和稳定性
indices.memory.index_buffer_size: 15%thread_pool.bulk.queue_size: 1024

计算disk使用量时,不考虑正在搬迁的shard

在规模比较大的集群中,可以防止新建shard时扫描所有shard的元数据,提升shard分配速度。

cluster.routing.allocation.disk.include_relocations: false

三 ES使用方式

控制字段的存储选项

ES底层使用Lucene存储数据,主要包括行存(StoreFiled)、列存(DocValues)和倒排索引(InvertIndex)三部分。 大多数使用场景中,没有必要同时存储这三个部分,可以通过下面的参数来做适当调整:

  • StoreFiled: 行存,其中占比最大的是source字段,它控制doc原始数据的存储。在写入数据时,ES把doc原始数据的整个JSON结构体当做一个string,存储为source字段。查询时,可以通过source字段拿到当初写入时的整个json结构体。 所以,如果没有取出整个原始json结构体的需求,可以通过下面的命令,在mapping中关闭source字段或者只在source中存储部分字段,数据查询时仍可通过ES的docvaluefields获取所有字段的值。

    注意:关闭source后, update, updatebyquery, reindex等接口将无法正常使用,所以有update等需求的index不能关闭source。

# 关闭 _sourcePUT my_index {  "mappings": {    "my_type": {      "_source": {        "enabled": false      }    }  }}# _source只存储部分字段,通过includes指定要存储的字段或者通过excludes滤除不需要的字段PUT my_index{  "mappings": {    "_doc": {      "_source": {        "includes": [          "*.count",          "meta.*"        ],        "excludes": [          "meta.description",          "meta.other.*"        ]      }    }  }}
  • docvalues:控制列存。

    ES主要使用列存来支持sorting, aggregations和scripts功能,对于没有上述需求的字段,可以通过下面的命令关闭docvalues,降低存储成本。

PUT my_index{  "mappings": {    "my_type": {      "properties": {        "session_id": {           "type": "keyWord",          "doc_values": false        }      }    }  }}
  • index:控制倒排索引。

    ES默认对于所有字段都开启了倒排索引,用于查询。对于没有查询需求的字段,可以通过下面的命令关闭倒排索引。

PUT my_index{  "mappings": {    "my_type": {      "properties": {        "session_id": {           "type": "keyword",          "index": false        }      }    }  }}
  • all:ES的一个特殊的字段,ES把用户写入json的所有字段值拼接成一个字符串后,做分词,然后保存倒排索引,用于支持整个json的全文检索。

    这种需求适用的场景较少,可以通过下面的命令将all字段关闭,节约存储成本和cpu开销。(ES 6.0+以上的版本不再支持_all字段,不需要设置)

PUT /my_index{  "mapping": {    "my_type": {      "_all": {        "enabled": false         }    }  }}
  • fieldnames:该字段用于exists查询,来确认某个doc里面有无一个字段存在。若没有这种需求,可以将其关闭。

PUT /my_index{  "mapping": {    "my_type": {      "_field_names": {        "enabled": false         }    }  }}

开启最佳压缩

对于打开了上述_source字段的index,可以通过下面的命令来把lucene适用的压缩算法替换成 DEFLATE,提高数据压缩率。

PUT /my_index/_settings{    "index.codec": "best_compression"}

bulk批量写入

写入数据时尽量使用下面的bulk接口批量写入,提高写入效率。每个bulk请求的doc数量设定区间推荐为1k~1w,具体可根据业务场景选取一个适当的数量。

POST _bulk{ "index" : { "_index" : "test", "_type" : "type1" } }{ "field1" : "value1" }{ "index" : { "_index" : "test", "_type" : "type1" } }{ "field1" : "value2" }

调整translog同步策略

默认情况下,translog的持久化策略是,对于每个写入请求都做一次flush,刷新translog数据到磁盘上。这种频繁的磁盘IO操作是严重影响写入性能的,如果可以接受一定概率的数据丢失(这种硬件故障的概率很小),可以通过下面的命令调整 translog 持久化策略为异步周期性执行,并适当调整translog的刷盘周期。

PUT my_index{  "settings": {    "index": {      "translog": {        "sync_interval": "5s",        "durability": "async"      }    }  }}

调整refresh_interval

写入Lucene的数据,并不是实时可搜索的,ES必须通过refresh的过程把内存中的数据转换成Lucene的完整segment后,才可以被搜索。默认情况下,ES每一秒会refresh一次,产生一个新的segment,这样会导致产生的segment较多,从而segment merge较为频繁,系统开销较大。如果对数据的实时可见性要求较低,可以通过下面的命令提高refresh的时间间隔,降低系统开销。

PUT my_index{  "settings": {    "index": {        "refresh_interval" : "30s"    }  }}

merge并发控制

ES的一个index由多个shard组成,而一个shard其实就是一个Lucene的index,它又由多个segment组成,且Lucene会不断地把一些小的segment合并成一个大的segment,这个过程被称为merge。默认值是Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2)),当节点配置的cpu核数较高时,merge占用的资源可能会偏高,影响集群的性能,可以通过下面的命令调整某个index的merge过程的并发度:

PUT /my_index/_settings{    "index.merge.scheduler.max_thread_count": 2}

写入数据不指定_id,让ES自动产生

当用户显示指定id写入数据时,ES会先发起查询来确定index中是否已经有相同id的doc存在,若有则先删除原有doc再写入新doc。这样每次写入时,ES都会耗费一定的资源做查询。如果用户写入数据时不指定doc,ES则通过内部算法产生一个随机的id,并且保证id的唯一性,这样就可以跳过前面查询id的步骤,提高写入效率。 所以,在不需要通过id字段去重、update的使用场景中,写入不指定id可以提升写入速率。基础架构数据库团队的测试结果显示,无id的数据写入性能可能比有_id的高出近一倍,实际损耗和具体测试场景相关。

# 写入时指定_idPOST _bulk{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }{ "field1" : "value1" }# 写入时不指定_idPOST _bulk{ "index" : { "_index" : "test", "_type" : "type1" } }{ "field1" : "value1" }

使用routing

对于数据量较大的index,一般会配置多个shard来分摊压力。这种场景下,一个查询会同时搜索所有的shard,然后再将各个shard的结果合并后,返回给用户。对于高并发的小查询场景,每个分片通常仅抓取极少量数据,此时查询过程中的调度开销远大于实际读取数据的开销,且查询速度取决于最慢的一个分片。开启routing功能后,ES会将routing相同的数据写入到同一个分片中(也可以是多个,由index.routingpartitionsize参数控制)。如果查询时指定routing,那么ES只会查询routing指向的那个分片,可显著降低调度开销,提升查询效率。 routing的使用方式如下:

# 写入PUT my_index/my_type/1?routing=user1{  "title": "This is a document"}# 查询GET my_index/_search?routing=user1,user2 {  "query": {    "match": {      "title": "document"    }  }}

为string类型的字段选取合适的存储方式

  • 存为text类型的字段(string字段默认类型为text): 做分词后存储倒排索引,支持全文检索,可以通过下面几个参数优化其存储方式:

    • nORMs:用于在搜索时计算该doc的_score(代表这条数据与搜索条件的相关度),如果不需要评分,可以将其关闭。

    • indexoptions:控制倒排索引中包括哪些信息(docs、freqs、positions、offsets)。对于不太注重score/highlighting的使用场景,可以设为 docs来降低内存/磁盘资源消耗。

    • fields: 用于添加子字段。对于有sort和聚合查询需求的场景,可以添加一个keyword子字段以支持这两种功能。

PUT my_index{  "mappings": {    "my_type": {      "properties": {        "title": {           "type": "text",          "norms": false,          "index_options": "docs",          "fields": {            "raw": {               "type":  "keyword"            }          }        }      }    }  }}
  • 存为keyword类型的字段: 不做分词,不支持全文检索。text分词消耗CPU资源,冗余存储keyword子字段占用存储空间。如果没有全文索引需求,只是要通过整个字段做搜索,可以设置该字段的类型为keyword,提升写入速率,降低存储成本。 设置字段类型的方法有两种:一是创建一个具体的index时,指定字段的类型;二是通过创建template,控制某一类index的字段类型。

# 1. 通过mapping指定 tags 字段为keyword类型PUT my_index{  "mappings": {    "my_type": {      "properties": {        "tags": {          "type":  "keyword"        }      }    }  }}# 2. 通过template,指定my_index*类的index,其所有string字段默认为keyword类型PUT _template/my_template{    "order": 0,    "template": "my_index*",    "mappings": {      "_default_": {        "dynamic_templates": [          {            "strings": {              "match_mapping_type": "string",              "mapping": {                "type": "keyword",                "ignore_above": 256              }            }          }        ]      }    },    "aliases": {}  }

查询时,使用query-bool-filter组合取代普通query

默认情况下,ES通过一定的算法计算返回的每条数据与查询语句的相关度,并通过score字段来表征。但对于非全文索引的使用场景,用户并不care查询结果与查询条件的相关度,只是想精确的查找目标数据。此时,可以通过query-bool-filter组合来让ES不计算score,并且尽可能的缓存filter的结果集,供后续包含相同filter的查询使用,提高查询效率。

# 普通查询POST my_index/_search{  "query": {    "term" : { "user" : "Kimchy" }   }}# query-bool-filter 加速查询POST my_index/_search{  "query": {    "bool": {      "filter": {        "term": { "user": "Kimchy" }      }    }  }}

index按日期滚动,便于管理

写入ES的数据最好通过某种方式做分割,存入不同的index。常见的做法是将数据按模块/功能分类,写入不同的index,然后按照时间去滚动生成index。这样做的好处是各种数据分开管理不会混淆,也易于提高查询效率。同时index按时间滚动,数据过期时删除整个index,要比一条条删除数据或deletebyquery效率高很多,因为删除整个index是直接删除底层文件,而deletebyquery是查询-标记-删除。

举例说明,假如有[modulea,moduleb]两个模块产生的数据,那么index规划可以是这样的:一类index名称是modulea + {日期},另一类index名称是module_b+ {日期}。对于名字中的日期,可以在写入数据时自己指定精确的日期,也可以通过ES的ingest pipeline中的index-name-processor实现(会有写入性能损耗)。

# module_a 类index- 创建index:PUT module_a@2018_01_01{    "settings" : {        "index" : {            "number_of_shards" : 3,             "number_of_replicas" : 2         }    }}PUT module_a@2018_01_02{    "settings" : {        "index" : {            "number_of_shards" : 3,             "number_of_replicas" : 2         }    }}...- 查询数据:GET module_a@*/_search#  module_b 类index- 创建index:PUT module_b@2018_01_01{    "settings" : {        "index" : {            "number_of_shards" : 3,             "number_of_replicas" : 2         }    }}PUT module_b@2018_01_02{    "settings" : {        "index" : {            "number_of_shards" : 3,             "number_of_replicas" : 2         }    }}...- 查询数据:GET module_b@*/_search

按需控制index的分片数和副本数

分片(shard):一个ES的index由多个shard组成,每个shard承载index的一部分数据。

副本(replica):index也可以设定副本数(numberofreplicas),也就是同一个shard有多少个备份。对于查询压力较大的index,可以考虑提高副本数(numberofreplicas),通过多个副本均摊查询压力。

shard数量(numberofshards)设置过多或过低都会引发一些问题:shard数量过多,则批量写入/查询请求被分割为过多的子写入/查询,导致该index的写入、查询拒绝率上升;对于数据量较大的inex,当其shard数量过小时,无法充分利用节点资源,造成机器资源利用率不高 或 不均衡,影响写入/查询的效率。

对于每个index的shard数量,可以根据数据总量、写入压力、节点数量等综合考量后设定,然后根据数据增长状态定期检测下shard数量是否合理。基础架构部数据库团队的推荐方案是:

  • 对于数据量较小(100GB以下)的index,往往写入压力查询压力相对较低,一般设置3~5个shard,numberofreplicas设置为1即可(也就是一主一从,共两副本) 。

  • 对于数据量较大(100GB以上)的index:

    • 一般把单个shard的数据量控制在(20GB~50GB)

    • 让index压力分摊至多个节点:可通过index.routing.allocation.totalshardsper_node参数,强制限定一个节点上该index的shard数量,让shard尽量分配到不同节点上

    • 综合考虑整个index的shard数量,如果shard数量(不包括副本)超过50个,就很可能引发拒绝率上升的问题,此时可考虑把该index拆分为多个独立的index,分摊数据量,同时配合routing使用,降低每个查询需要访问的shard数量。

稳定性调优

一 Linux参数调优

  1. # 修改系统资源限制

  2. # 单用户可以打开的最大文件数量,可以设置为官方推荐的65536或更大些

  3. echo "* - nofile 655360" >>/etc/security/limits.conf

  4. # 单用户内存地址空间

  5. echo "* - as unlimited" >>/etc/security/limits.conf

  6. # 单用户线程

  7. echo "* - nproc 2056474" >>/etc/security/limits.conf

  8. # 单用户文件大小

  9. echo "* - fsize unlimited" >>/etc/security/limits.conf

  10. # 单用户定内存

  11. echo "* - memlock unlimited" >>/etc/security/limits.conf

  12. # 单进程可以使用的最大map内存区域数量

  13. echo "vm.max_map_count = 655300" >>/etc/sysctl.conf

  14. # tcp全连接队列参数设置, 这样设置的目的是防止节点数较多(比如超过100)的ES集群中,节点异常重启时全连接队列在启动瞬间打满,造成节点hang住,整个集群响应迟滞的情况

  15. echo "net.ipv4.tcp_abort_on_overflow = 1" >>/etc/sysctl.conf

  16. echo "net.core.somaxconn = 2048" >>/etc/sysctl.conf

  17. # 降低tcp alive time,防止无效链接占用链接数

  18. echo 300 >/proc/sys/net/ipv4/tcp_keepalive_time


二 ES节点配置

JVM.options

-Xms和-Xmx设置为相同的值,推荐设置为机器内存的一半左右,剩余一半留给系统cache使用。

  • jvm内存建议不要低于2G,否则有可能因为内存不足导致ES无法正常启动或OOM

  • jvm建议不要超过32G,否则jvm会禁用内存对象指针压缩技术,造成内存浪费

elasticsearch.yml

  • 设置内存熔断参数,防止写入或查询压力过高导致OOM,具体数值可根据使用场景调整。 indices.breaker.total.limit: 30% indices.breaker.request.limit: 6% indices.breaker.fielddata.limit: 3%

  • 调小查询使用的cache,避免cache占用过多的jvm内存,具体数值可根据使用场景调整。 indices.queries.cache.count: 500 indices.queries.cache.size: 5%

  • 单机多节点时,主从shard分配以ip为依据,分配到不同的机器上,避免单机挂掉导致数据丢失。 cluster.routing.allocation.awareness.attributes: ip node.attr.ip: 1.1.1.1

三 ES使用方式

节点数较多的集群,增加专有master,提升集群稳定性

ES集群的元信息管理、index的增删操作、节点的加入剔除等集群管理的任务都是由master节点来负责的,master节点定期将最新的集群状态广播至各个节点。所以,master的稳定性对于集群整体的稳定性是至关重要的。当集群的节点数量较大时(比如超过30个节点),集群的管理工作会变得复杂很多。此时应该创建专有master节点,这些节点只负责集群管理,不存储数据,不承担数据读写压力;其他节点则仅负责数据读写,不负责集群管理的工作。

这样把集群管理和数据的写入/查询分离,互不影响,防止因读写压力过大造成集群整体不稳定。 将专有master节点和数据节点的分离,需要修改ES的配置文件,然后滚动重启各个节点。

# 专有master节点的配置文件(conf/elasticsearch.yml)增加如下属性:node.master: true node.data: false node.ingest: false # 数据节点的配置文件增加如下属性(与上面的属性相反):node.master: false node.data: true node.ingest: true

控制index、shard总数量

上面提到,ES的元信息由master节点管理,定期同步给各个节点,也就是每个节点都会存储一份。这个元信息主要存储在clusterstate中,如所有node元信息(indices、节点各种统计参数)、所有index/shard的元信息(mapping, location, size)、元数据ingest等。

ES在创建新分片时,要根据现有的分片分布情况指定分片分配策略,从而使各个节点上的分片数基本一致,此过程中就需要深入遍历clusterstate。当集群中的index/shard过多时,clusterstate结构会变得过于复杂,导致遍历clusterstate效率低下,集群响应迟滞。基础架构部数据库团队曾经在一个20个节点的集群里,创建了4w+个shard,导致新建一个index需要60s+才能完成。 当index/shard数量过多时,可以考虑从以下几方面改进:

  • 降低数据量较小的index的shard数量

  • 把一些有关联的index合并成一个index

  • 数据按某个维度做拆分,写入多个集群

Segment Memory优化

前面提到,ES底层采用Lucene做存储,而Lucene的一个index又由若干segment组成,每个segment都会建立自己的倒排索引用于数据查询。Lucene为了加速查询,为每个segment的倒排做了一层前缀索引,这个索引在Lucene4.0以后采用的数据结构是FST (Finite State Transducer)。Lucene加载segment的时候将其全量装载到内存中,加快查询速度。这部分内存被称为SegmentMemory, 常驻内存,占用heap,无法被GC

前面提到,为利用JVM的对象指针压缩技术来节约内存,通常建议JVM内存分配不要超过32G。当集群的数据量过大时,SegmentMemory会吃掉大量的堆内存,而JVM内存空间又有限,此时就需要想办法降低SegmentMemory的使用量了,常用方法有下面几个:

  • 定期删除不使用的index

  • 对于不常访问的index,可以通过close接口将其关闭,用到时再打开

  • 通过force_merge接口强制合并segment,降低segment数量

基础架构部数据库团队在此基础上,对FST部分进行了优化,释放高达40%的Segment Memory内存空间。

以上就是如何进行Elasticsearch调优实践的全部内容了,更多与如何进行Elasticsearch调优实践相关的内容可以搜索编程网之前的文章或者浏览下面的文章进行学习哈!相信小编会给大家增添更多知识,希望大家能够支持一下编程网!

--结束END--

本文标题: 如何进行Elasticsearch调优实践

本文链接: https://www.lsjlt.com/news/240844.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何进行Elasticsearch调优实践
    今天给大家介绍一下如何进行Elasticsearch调优实践。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。背景Elasticsearch(ES)作为NOSQL...
    99+
    2023-06-05
  • 如何调优Elasticsearch
    这篇文章主要讲解了“如何调优Elasticsearch”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何调优Elasticsearch”吧!1.数据量每天都有数量相当庞大的新闻和微博产生;在...
    99+
    2023-06-02
  • 如何进行SequoiaDB + JanusGraph的实践
    如何进行SequoiaDB + JanusGraph的实践,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。JanusGraph 实...
    99+
    2024-04-02
  • MariaDB中如何进行性能优化调优
    MariaDB 是 MySQL 的一个分支,因此在进行性能优化调优时,可以遵循类似的步骤。以下是一些常见的性能优化调优方法: 使...
    99+
    2024-04-02
  • 如何进行Elasticsearch集群运维
    本篇文章给大家分享的是有关如何进行Elasticsearch集群运维,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Meltwater每天要处理...
    99+
    2024-04-02
  • 使用SpringBoot如何实现对ElasticSearch进行整合
    这篇文章给大家介绍使用SpringBoot如何实现对ElasticSearch进行整合,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、实体设计:Tutorial.javapublic class Tutorial i...
    99+
    2023-05-31
    springboot elasticsearch
  • Keras中如何进行超参数调优
    在Keras中进行超参数调优有以下几种常用方法: 网格搜索(Grid Search):通过指定参数范围,对所有组合进行搜索,并选...
    99+
    2024-04-02
  • 如何进行数据库性能调优
    如何进行数据库性能调优,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言微软工程师的一个工程师曾经对性能调优有一个非常形象的比喻:剥洋葱 ...
    99+
    2024-04-02
  • 面试官:如何进行 JVM 调优(附真实案例)
    前言 面试官:在工作中做过 JVM 调优吗?讲讲做过哪些 JVM 调优? 我一个QPS不到10的项目,上次问我缓存穿透缓存雪崩,这次问我 JVM 调优,我是真滴难。 不过大家别慌,热心的我给大家找来了几个满分回答,大家选择合适的使用。 回...
    99+
    2023-08-31
    java 面试 经验分享 程序人生
  • 如何在MySQL中进行性能优化和调优
    有几种方法可以在MySQL中进行性能优化和调优: 使用合适的索引: 索引可以加快查询的速度。确保在经常使用的列上创建索引,并避免...
    99+
    2024-04-09
    MySQL
  • Cacti系统如何进行性能优化和调优
    Cacti 是一个用于监控网络设备和服务器性能的图形化工具,为了提高其性能和效率,可以进行以下优化和调优操作: 数据库优化:Ca...
    99+
    2024-03-15
    Cacti
  • 如何进行Spring Boot项目优化和JVM调优
    这篇文章给大家介绍如何进行Spring Boot项目优化和JVM调优,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。项目调优作为一名工程师,项目调优这事,是必须得熟练掌握的事情。在 Spring Boot 项目中,调优主...
    99+
    2023-06-16
  • 在AmazonAurora中如何进行性能调优和优化
    Amazon Aurora是一种关系型数据库服务,旨在提供高性能、高可靠性和可扩展性。要进行性能调优和优化,可以按照以下步骤进行: ...
    99+
    2024-04-09
    AmazonAurora
  • 如何进行Android Hook技术的实践
    这篇文章将为大家详细讲解有关如何进行Android Hook技术的实践,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。概述在学习Android插件化的过程中有用到Hook相关技术,下文对Hoo...
    99+
    2023-06-04
  • 如何进行Zabbix 宏变量的实践
    本篇文章为大家展示了如何进行Zabbix 宏变量的实践,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、.宏介绍        宏是一种抽...
    99+
    2023-06-06
  • 如何进行etcd集群运维实践
    本篇文章为大家展示了如何进行etcd集群运维实践,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。etcd 是 Kubernetes 集群的数据核心,最严重的情况是,当...
    99+
    2024-04-02
  • 如何使用sqld360进行特定SQL调优
    这篇文章主要介绍了如何使用sqld360进行特定SQL调优,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。sqld360是一个开源数据收集软件...
    99+
    2024-04-02
  • 如何进行C++代码的性能调优?
    如何进行C++代码的性能调优C++作为一种高性能的编程语言,被广泛运用在许多性能要求较高的领域,如游戏开发、嵌入式系统等。然而,在编写C++程序时,我们常常会面临性能瓶颈的挑战。为了提高程序的运行效率和响应时间,我们需要进行代码的性能调优。...
    99+
    2023-11-02
    C++ 性能调优 代码调优
  • 如何利用elasticsearch插件进行开发
    如何利用elasticsearch插件进行开发?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。检索引擎Elasticsearch支持插件模式。有些时候你可能须要安...
    99+
    2023-05-31
    elasticsearch
  • 怎么进行SQL调优
    这篇文章主要介绍“怎么进行SQL调优”,在日常操作中,相信很多人在怎么进行SQL调优问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么进行SQL调优”的疑惑有所帮助!接下来,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作