моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Оптимизация ELK может осуществляться по следующим аспектам:
Характеристики ES как хранилища журналов:
① Увеличение памяти сервера и памяти кучи JVM.
② Используйте несколько экземпляров для балансировки нагрузки.
③Используйте filebeat вместо logstash для сбора данных журнала.
- 为了保证不丢失数据,就要保护 translog 文件的安全:
- Elasticsearch 2.0 之后,每次写请求(如 index 、delete、update、bulk 等)完成时,都会触发fsync将 translog 中的 segment 刷到磁盘,然后才会返回 200 OK 的响应;或者: 默认每隔5s就将 translog 中的数据通过fsync强制刷新到磁盘。
- 该方式提高数据安全性的同时,降低了一点性能。
- ==> 频繁地执行 fsync 操作,可能会产生阻塞导致部分操作耗时较久。 如果允许部分数据丢失,可设置异步刷新 translog 来提高效率,还有降低 flush 的阀值, 优化如下:
- "index.translog.durability": "async",
- "index.translog.flush_threshold_size":"1024mb",
- "index.translog.sync_interval": "120s"
- 写入 Lucene 的数据,并不是实时可搜索的,ES 必须通过 refresh 的过程把内存中的数据转换成 Lucene 的完整 segment 后,才可以被搜索。
- 默认 1 秒后,写入的数据可以很快被查询到,但势必会产生大量的 segment,检索性能会受到影响。所以,加大时长可以降低系统开销。 对于日志搜索来说,实时性要求不是那么高,设置为 5 秒或者 10s;对于 SkyWalking,实时性要求更低一些,我们可以设置为 30s。
- 设置如下:
- "index.refresh_interval":"5s"
- index.merge.scheduler.max_thread_count 控制并发的 merge 线程数,如果存储是并发性能较好的 SSD,可以用系统默认的 max(1, min(4, availableProcessors / 2)),当节点配置的 cpu 核数较高时,merge 占用的资源可能会偏高,影响集群的性能,普通磁盘的话设为1,发生磁盘 IO 堵塞。设置 max_thread_count 后,会有 max_thread_count + 2 个线程同时进行磁盘操作,也就是设置为 1 允许 3 个线程。
- 设置如下:
- "index.merge.scheduler.max_thread_count":"1"
Вам нужно сначала закрыть индекс, затем выполнить его и, наконец, открыть после успеха.
curl -XPOST 'http://localhost:9200/_all/_close'
curl -XPUT -H "Content-Type:application/json" 'http://localhost:9200/_all/_settings?preserve_existing=true' -d '{"index.merge.scheduler.max_thread_count" : "1","index.refresh_interval" : "10s","index.translog.durability" : "async","index.translog.flush_threshold_size":"1024mb","index.translog.sync_interval" : "120s"}'
curl -XPOST 'http://localhost:9200/_all/_open'
Пул потоков записи переполнен, поэтому задачи отклоняются, а некоторые данные не могут быть записаны. После вышеуказанной оптимизации количество отказов значительно снизилось, но случаи отклонения заданий все еще есть. Поэтому нам также необходимо оптимизировать пул потоков записи.
Пул потоков записи использует пул потоков фиксированного типа, то есть количество основных потоков соответствует максимальному значению потока. По умолчанию количество потоков равно количеству ядер ЦП. Максимальное значение, которое можно установить, может быть только числом ядер ЦП плюс 1. Например, для 16-ядерного ЦП максимальное количество потоков, которое можно установить. быть установлено 17.
- # 线程数设置
- thread_pool:
- write:
- # 线程数默认等于cpu核数,即16
- size: 17
- # 因为任务多时存在任务拒绝的情况,所以加大队列大小,可以在间歇性任务量陡增的情况下,缓存任务在队列,等高峰过去逐步消费完。
- queue_size: 10000
Раздел подкачки подкачки: Когда физической памяти системы недостаточно, часть пространства физической памяти необходимо освободить для использования текущей запущенной программой. Освобожденное пространство может быть получено от некоторых программ, которые долгое время не работали. Освобожденное пространство временно сохраняется в Swap. Когда эти программы собираются запустить, сохраненные данные восстанавливаются из Swap в память. Таким образом, система всегда выполняет обмен, когда физической памяти недостаточно.
Раздел подкачки очень вреден для производительности и стабильности узла, поэтому его необходимо отключить. Это приводит к тому, что сбор мусора длится минуты, а не миллисекунды, и может привести к медленному реагированию узлов или даже к отключению от кластера.
1) Отключите Swap в системе Linux (временно действует)
- 执行命令 sudo swapoff -a
- 可以临时禁用 Swap 内存,但是操作系统重启后失效
2) Максимально сократить использование Swap в системах Linux (действительно навсегда)
- 执行下列命令
- echo "vm.swappiness = 1" >> /etc/sysctl.conf
- 正常情况下不会使用 Swap,除非紧急情况下才会 Swap。
3) Включите bootstrap.memory_lock.
- config/elasticsearch.yml 文件增加配置
- #锁定内存,不让 JVM 写入 Swap,避免降低 ES 的性能
- bootstrap.memory_lock: true
Размер индекса зависит от размера сегментов и сегментов. Если сегменты слишком малы, сегменты могут быть слишком маленькими, что может привести к увеличению накладных расходов. Если сегменты слишком велики, сегменты могут часто объединяться. что приводит к большому количеству операций ввода-вывода, влияющим на производительность записи.
Поскольку размер каждого из наших индексов меньше 15 ГБ, а значение по умолчанию — 5 шардов, в таком количестве нет необходимости, поэтому мы скорректировали его до 3.
"index.number_of_shards": "3"
Уменьшите количество сегментов копирования кластера. Слишком большое количество копий приведет к расширению внутренней записи ES. По умолчанию количество копий равно 1. Если узел, на котором расположен индекс, выходит из строя, другой компьютер с копией будет иметь данные резервной копии индекса, поэтому данные индекса можно будет использовать в обычном режиме. Но запись данных в копию влияет на производительность записи. Для данных журнала достаточно 1 копии. Для индексов с большими объемами данных вы можете установить количество копий равным 0, чтобы уменьшить влияние на производительность.
"index.number_of_replicas": "1"
① Увеличение памяти сервера и памяти кучи JVM.
② Используйте несколько экземпляров для балансировки нагрузки.
③Используйте filebeat вместо logstash для сбора данных журнала.
① Оптимизация индекса: оптимизируйте fsync и соответствующим образом увеличьте интервал очистки диска.
② Оптимизируйте конфигурацию пула потоков записи, чтобы уменьшить количество отклонений задач: измените файл конфигурации ES elasticsearch.yml и установите для потока записи количество ядер ЦП + 1.
③Заблокируйте память и запретите ES использовать подкачку: swapoff -a, закрыть подкачку.
④Соответствующим образом сократите количество фрагментов и копий индекса.