Как диагностировать OOM dotnet приложения в контейнере?
Имееться dotnet сервис в контенейре собранном на базе
mcr.microsoft.com/dotnet/aspnet:6.0
Сервис запущен в k8s и регулярно падает с OOM, причем не просто падает а взрываеться с 30% использования памяти сразу в ООМ какие бы лимиты ему не выставить
2. Обычно такому взрыву предшествуют какие-то логи - запустите dotnet в режиме diag: dotnet run --diagnostics. Контейнеры, даже мертвые оставляют какие-то логи
Локальный запуск не даст результатов
Сервис один из множества, "взрывы" происходят только на проде, в тестовых окружениях не воспроизводиться
Как часть прода есть возможность запускать только в виде контейнера и кластере
Логи тоже не дали информации
Я реализовал схему добавив модифицированный preoomkiller + livenessProbe + preStop hoock
Выделил овер большие лимиты в надежде что хватит пережить взрыв и через preStop снять dotnet dump
И лог перед взрывом выглядел вот так
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:11
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:12
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:13
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:14
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:15
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:16
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:17
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:18
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:19
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:20
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:20
Out of memory.
2022-02-11 04:57:21
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:22
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:23
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:24
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:25
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:26
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:27
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:28
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:29
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.3 GB, Percent mem used: 21.0%
2022-02-11 04:57:30
PreOOMKiller: Mem limit: 16.0 GB, Current rss: 3.9 MB, Percent mem used: 0.0%
10 секунд до взрыва вообще ничего в лог dotnet сервис не пишет, хотя логирование избыточное
1. сделайте нагрузочное тестирование вашего сервиса в локальном контейнере - бомбардируйте его запросами, смотрите что будет.... да, для запросов надо сторонний http app или свой написать.
2. заходите на ноду где работал контейнер и доставайте логи без помощи кубернетеса, напрямую из ОС - возможно это просто баг в приложении
Посмотрите код, обычно такие моменты можно найти и связаны с получанием (с базы, с других сервисов и т.п.) или обработкой данных (внутренние кэши или расчёты).