У нас есть сервис изображений, написанный на Golang.
- Поддерживается работа с изображением, например, размытие при изменении размера.
- RPS составляет около 400.
- Pod Config: 16 ГБ ОЗУ и 8 ядер
- Мы развернули приложение и наблюдали в течение дня, оно показало высокую загрузку ядра
- Мы ввели балласт (https://blog.twitch.tv/en/2019/04/10/go-memory-ballast-how-i-learnt-to-stop-worrying-and-love-the-heap-26c2462549a2/) объемом 4 ГБ и пул Syn c (* 1016) *) для устранения основных проблем
- Затем мы начали наблюдать высокое использование памяти.
- Следовательно, мы сократили Балласт до 1 ГБ, но использование памяти все еще остается высоким
- Согласно к этой статье https://www.bwplotka.dev/2019/golang-memory-monitoring/ Goland версии 1.12+ сообщил о высоком RSS Согласно статье "Это не означает, что им требуется больше памяти, это просто оптимизация для случаев, когда нет другого давления памяти. "
- Чтобы убедиться, что мы выполнили небольшое ПО C на локальном компьютере для проверки выше, и это сработало.
- Локальная настройка - память контейнера - 500 МБ
- Память будет постоянно увеличиваться, если бы она может оставаться там на 450 МБ, пока давление не увеличится. Как только давление увеличится, объем памяти уменьшится с go до 4 МБ.
- Но этот кластер PO C не сработал на кластере Kubernetes, и модули начали падать и перезапускаться, когда объем памяти достигал ~ 16 ГБ ОЗУ на высоких RPS например, 400.
Может кто-нибудь подсказать, как мы можем содержать эту проблему с памятью и почему этот кластер PO C не сработал в кластере.
Дайте мне знать, если потребуется более подробная информация ..