Непонятная ошибка нехватки памяти с Logstash - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть Logsta sh 7.6.2 docker, который останавливается из-за утечки памяти. Похоже, что после каждого выполнения конвейера Logsta sh не освобождает память. Что я должен сделать, чтобы определить источник проблемы? Как я могу решить это?

Любая помощь - это welcom ^^.

Вот ошибка, которую я вижу в журналах. Это всего лишь 5 первых строк трассировки. Я загрузил остальные в файл в моем github туда .

logstash    | [2020-04-08T18:15:42,960][INFO ][logstash.outputs.file    ][rawweb] Closing file /output/web_data.json
 logstash    | [2020-04-08T18:15:43,353][ERROR][org.logstash.Logstash    ] java.lang.OutOfMemoryError: Java heap space
 logstash    | [2020-04-08T18:15:43,367][ERROR][org.logstash.execution.WorkerLoop][rawclient] Exception in pipelineworker, the pipeline stopped processing new events, please check your filter configuration and restart Logstash.
 logstash    | org.jruby.exceptions.NoMethodError: (NoMethodError) undefined method `pop' for nil:NilClass
 logstash    |   at usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.awesome_print_minus_1_dot_7_dot_0.lib.awesome_print.inspector.awesome(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/awesome_print-1.7.0/lib/awesome_print/inspector.rb:117) ~[?:?]

Здесь docker -compose.yml Я использовал для настройки моего Logsta sh Docker

version: '2.4'    
services:
      logstash:
        image: docker.elastic.co/logstash/logstash:7.6.2
        container_name: logstash
        environment:
          LS_JAVA_OPTS: "-Xmx7g -Xms4g"
          REQUEST_FREQUENCY: 600 #seconds
        volumes:
          - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro
          - ./logstash/pipelines.yml:/usr/share/logstash/config/pipelines.yml
          - ./logstash/pipeline:/usr/share/logstash/pipeline:ro
          - ./logstash/tests:/testscripts:ro
          - /root/logstash_output/:/output/
        ports:
          - "9600:9600"
        mem_limit: 7000M
        mem_reservation: 100M

Мои pipelines.yml file

- pipeline.id: rawclient
  path.config: "/usr/share/logstash/pipeline/logclient.conf"
  pipeline.batch.size: 10000000

 - pipeline.id: rawweb
   path.config: "/usr/share/logstash/pipeline/logweb.conf"
   pipeline.batch.size: 10000000

Один из моих .conf файлов. По сути, он выполняет сценарий . sh, содержащий запрос скручивания. Результатом этого запроса является ввод конвейера. Обработки сделаны. Затем результаты сохраняются в файле. Два конвейера делают то же самое, единственное отличие - это запрос curl.

input {
  exec {
    command => "bash /testscripts/logclient_1.sh"
    codec => "json"
    interval => "600"
  }
}

filter {
    mutate {
        rename => ["connection/start_time", "start_time" ]
        rename => ["connection/end_time", "end_time" ]
        rename => ["connection/duration", "duration" ]
        rename => ["connection/destination_ip_address", "destination_ip_address" ]
        rename => ["connection/status", "status" ]
        rename => ["device/last_ip_address", "last_ip_address" ]
        rename => ["user/sid", "sid" ]
        # rename => ["binary/application_category", "application_category" ]
        rename => ["binary/application_name", "application_name" ]
        rename => ["binary/executable_name", "executable_name" ]
        remove_field => ["@timestamp"]
        remove_field => ["@version"]
        add_field => { "connection_type" => "client" }
    }
}
output {
  file {
   path => "/output/client_data.json"
   codec => "json"
 }
  stdout {
   codec => rubydebug
 }
}

My logsta sh .yml file

http.host: "0.0.0.0"
xpack.monitoring.enabled: false
Thanks for all the help :slightly_smiling_face:

1 Ответ

2 голосов
/ 09 апреля 2020

Размер партии вашего трубопровода огромный . Вот что документация (https://www.elastic.co/guide/en/logstash/current/logstash-settings-file.html) говорит об этом параметре:

Максимальное количество событий, которые отдельный рабочий поток будет собирать из входных данных перед попыткой выполнить его фильтры и выходные данные. , Большие размеры пакетов, как правило, более эффективны, но за счет увеличения накладных расходов памяти. Возможно, вам потребуется увеличить пространство кучи JVM в файле конфигурации jvm.options.

Это означает, что отдельный работник будет собирать 10 миллионов событий до запуска обрабатывать их. Очевидно, что эти 10 миллионов событий должны быть сохранены в памяти. Кроме того, у вас есть дополнительный конвейер с тем же размером пакета в 10 миллионов событий. Это огромно, учитывая, что у вас есть только 7 ГБ оперативной памяти, выделенной Logsta sh. Также обратите внимание, что по умолчанию 125 событий .

Я бы предложил уменьшить размеры пакетов ваших конвейеров, чтобы исправить исключения OutOfMemoryExceptions.

...