Дросселирование процессора Filebeat в kubernetes с помощью логирования в django

У меня есть простой Django API, обслуживаемый с помощью gunicorn на кластере Kubernetes. И после длительного времени работы стручок, кажется, дросселирует процессор.

Поэтому я попытался провести исследование, я использовал Lucost, чтобы завалить мой API запросами, чтобы посмотреть, как он справляется с непривычным количеством запросов.

Вот краткое описание обычной деятельности API:

  • 60 запросов в час
  • 10 строк журнала на запрос
  • 600 строк журнала в час

Таким образом, это не очень требовательный API. Внутри API проверяет тело и делает запрос к серверу CosmosDB для получения некоторых данных, а затем форматирует их, чтобы отправить обратно вызывающему. Запрос занимает менее 200 мс и требует очень мало памяти.

При выполнении роя с саранчой я вижу, что процессор снижается, а при использовании команды top в капсуле я вижу, что filebeat использует 40-60% процессора. В то время как при нормальной активности он остается на уровне 0,1-0,5% CPU.

Я kill -9 изменил PID файлообменника, сделал тот же рой, и все прошло гладко.

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

Вот как определен мой логгер в django:

"app_json_file": {
    "level": "INFO",
    "class": "logging.handlers.TimedRotatingFileHandler",
    "filename": APP_LOG_FILE,
    "when": "D",
    "interval": 7,
    "backupCount": 3,
    "formatter": "app_json_formatter",
}

Я попытался изменить стратегию, сделав ротацию более частой, чтобы уменьшить размер файлов, это немного помогло, но в последнем файлообменнике нагрузка на процессор возрастает.

Вот ресурсы для k8s pod:

  • запрос процессора: 250m
  • лимит процессора: 500m
  • запрос памяти: 125Mi
  • лимит памяти: 250Mi

Я не могу включить Horizontal Pod Autoscaling (HPA), поскольку в кластере K8S эта опция не включена.

Вот файл конфигурации filebeat:

#================================ Logging =====================================

logging:
  level: error
  json: true
  to_files: true
  to_syslog: false

  files:
    path: ${path.logs}
    keepfiles: 2
    permissions: 0600
  metrics:
    enabled: false
    period: 30s

#================================ Inputs =====================================

filebeat.inputs:
  - type: filestream
    enabled: true
    id: "access-log"
    paths:
      - ${LOG_DIR}/${ACCESS_LOG_FILE_NAME}

Я не нашел способа ограничить использование процессора filebeat непосредственно из конфигурации. Поэтому я не знаю, как справиться с ситуацией, когда при увеличении количества логов filebeat съедает весь процессор и заставляет API задыхаться, не умирая, и делая Time Outs для всех запросов.

Как я могу ограничить использование процессора filebeat при больших нагрузках, может быть очередь в filebat?

Вернуться на верх