Linux中,每一個進程默認打開的最大文件句柄數是1000,對於服務器進程來講,顯然過小,經過修改/etc/security/limits.conf來增大打開最大句柄數node
* - nofile 65535
max_map_count定義了進程能擁有的最多內存區域linux
sysctl -w vm.max_map_count=262144
修改/etc/elasticsearch/elasticsearch.ymlbootstrap
bootstrap.mlockall: true
修改/etc/security/limits.conf, 在limits.conf中添加以下內容緩存
* soft memlock unlimited * hard memlock unlimited
memlock 最大鎖定內存地址空間, 要使limits.conf文件配置生效,必需要確保pam_limits.so文件被加入到啓動文件中。bash
確保/etc/pam.d/login文件中有以下內容服務器
session required /lib/security/pam_limits.so
驗證是否生效session
curl localhost:9200/_nodes/stats/process?pretty
vm.dirty_background_ratio 這個參數指定了當文件系統緩存髒頁數量達到系統內存百分之多少時(如5%)就會觸發pdflush/flush/kdmflush等後臺回寫進程運行,將必定緩存的髒頁異步地刷入外存;app
vm.dirty_ratio負載均衡
該參數則指定了當文件系統緩存髒頁數量達到系統內存百分之多少時(如10%),系統不得不開始處理緩存髒頁(由於此時髒頁數量已經比較多,爲了不數據丟失須要將必定髒頁刷入外存);在此過程當中不少應用進程可能會由於系統轉而處理文件IO而阻塞。curl
把該參數適當調小,原理通(1)相似。若是cached的髒數據所佔比例(這裏是佔MemTotal的比例)超過這個設置,系統會中止全部的應用層的IO寫操做,等待刷完數據後恢復IO。因此萬一觸發了系統的這個操做,對於用戶來講影響很是大的。
sysctl -w vm.dirty_ratio=10 sysctl -w vm.dirty_background_ratio=5
爲了將設置永久保存,將上述配置項寫入/etc/sysctl.conf文件中
vm.dirty_ratio = 10 vm.dirty_background_ratio = 5
swap空間是一塊磁盤空間,操做系統使用這塊空間保存從內存中換出的操做系統不經常使用page數據,這樣能夠分配出更多的內存作page cache。這樣一般會提高系統的吞吐量和IO性能,但一樣會產生不少問題。頁面頻繁換入換出會產生IO讀寫、操做系統中斷,這些都很影響系統的性能。這個值越大操做系統就會更加積極的使用swap空間。
調節swappniess方法以下
sudo sh -c 'echo "0">/proc/sys/vm/swappiness'
若是集羣中使用的是SSD磁盤,那麼能夠將默認的io sched由cfq設置爲noop
sudo sh -c 'echo "noop">/sys/block/sda/queue/scheduler'
在/etc/sysconfig/elasticsearch中設置最大堆內存,該值不該超過32G
ES_HEAP_SIZE=32g ES_JAVA_OPTS="-Xms32g" MAX_LOCKED_MEMORY=unlimited MAX_OPEN_FILES=65535
以建立demo_logs模板爲例,說明能夠調優的參數及其數值設定緣由。
PUT _template/demo_logs { "order": 6, "template": "demo-*", "settings": { "index.merge.policy.segments_per_tier": "25", "index.mapping._source.compress": "true", "index.mapping._all.enabled": "false", "index.warmer.enabled": "false", "index.merge.policy.min_merge_size": "10mb", "index.refresh_interval": "60s", "index.number_of_shards": "7", "index.translog.durability": "async", "index.store.type": "mmapfs", "index.merge.policy.floor_segment": "100mb", "index.merge.scheduler.max_thread_count": "1", "index.translog.translog.flush_threshold_size": "1g", "index.merge.policy.merge_factor": "15", "index.translog.translog.flush_threshold_period": "100m", "index.translog.sync_interval": "5s", "index.number_of_replicas": "1", "index.indices.store.throttle.max_bytes_per_sec": "50mb", "index.routing.allocation.total_shards_per_node": "2", "index.translog.flush_threshold_ops": "1000000" }, "mappings": { "_default_": { "dynamic_templates": [ { "string_template": { "mapping": { "index": "not_analyzed", "ignore_above": "10915", "type": "string" }, "match_mapping_type": "string" } }, { "level_fields": { "mapping": { "index": "no", "type": "string" }, "match": "Level*Exception*" } } ] } } "aliases": {} }
爲了讓建立的es index在每臺datanode上均勻分佈,同一個datanode上同一個index的shard數目不該超過3個。
計算公式: (number_of_shard * (1+number_of_replicas)) < 3*number_of_datanodes
每臺機器上分配的shard數目
"index.routing.allocation.total_shards_per_node": "2",
默認的刷新時間間隔是1s,對於寫入量很大的場景,這樣的配置會致使寫入吞吐量很低,適當提升刷新間隔,能夠提高寫入量,代價就是讓新寫入的數據在60s以後能夠被搜索,新數據可見的及時性有所降低。
"index.refresh_interval": "60s"
下降數據flush到磁盤的頻率。若是對數據丟失有必定的容忍,能夠打開async模式。
"index.translog.flush_threshold_ops": "1000000", "index.translog.durability": "async",
"index.merge.policy.floor_segment": "100mb", "index.merge.scheduler.max_thread_count": "1", "index.merge.policy.min_merge_size": "10mb"
對於不參與搜索的字段(fields), 將其index方法設置爲no, 若是對分詞沒有需求,對參與搜索的字段,其index方法設置爲not_analyzed
多使用dynamic_template
{ "persistent": { "cluster": { "routing": { "allocation": { "enable": "new_primaries", "cluster_concurrent_rebalance": "8", "allow_rebalance": "indices_primaries_active", "node_concurrent_recoveries": "8" } } }, "indices": { "breaker": { "fielddata": { "limit": "30%" }, "request": { "limit": "30%" } }, "recovery": { "concurrent_streams": "10", "max_bytes_per_sec": "200mb" } } }, "transient": { "indices": { "store": { "throttle": { "type": "merge", "max_bytes_per_sec": "50mb" } }, "recovery": { "concurrent_streams": "8" } }, "threadpool": { "bulk": { "type": "fixed" "queue_size": "1000", "size": "30" }, "index": { "type": "fixed", "queue_size": "1200", "size": "30" } }, "cluster": { "routing": { "allocation": { "enable": "all", "cluster_concurrent_rebalance": "8", "node_concurrent_recoveries": "15" } } } } }
避免shard的頻繁rebalance,將allocation的類型設置爲new_primaries, 將默認並行rebalance由2設置爲更大的一些的值
避免每次更新mapping, 針對2.x如下的版本
"indices.cluster.send_refresh_mapping": false
調整threadpool, size不要超過core數目,不然線程之間的context switching會消耗掉大量的cpu時間,致使load太高。 若是沒有把握,那就不要去調整。
爲避免fields data佔用大量的jvm內存,能夠經過按期清理的方式來釋放緩存的數據。釋放的內容包括field data, filter cache, query cache
curl -XPOST "localhost:9200/_cache/clear"
寫入量穩定在30K/s