Дросселирование процессора 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?