Утечка памяти в aioboto3 (aiohttp) после обновления до Python 3.13Python

Программы на Python
Ответить
Anonymous
 Утечка памяти в aioboto3 (aiohttp) после обновления до Python 3.13

Сообщение Anonymous »

Я наблюдаю устойчивый рост объема памяти в моих контейнерах ECS после обновления версий Python и зависимостей.
Рост памяти прекращается, когда я прекращаю входящие запросы gRPC, но после этого объем памяти никогда не снижается, что указывает на наличие некоторых сохраненных ссылок или незакрытых сеансов aiohttp.
Настройка
У меня есть глобальный сеанс AWS и одноэлементный шаблон для создания ресурсов DynamoDB:

Код: Выделить всё

aws_session = aioboto3.Session()

class DynamoDBClient:
def __init__(self, dynamodb_config):
self.ddb_config = dynamodb_config
self.ddb_resource = None

async def get_resource(self):
if self.ddb_resource is None:
self.ddb_resource = await aws_session.resource(
'dynamodb',
config=self.ddb_config
).__aenter__()
return self.ddb_resource

async def close(self):
if self.ddb_resource:
await self.ddb_resource.__aexit__(None, None, None)
self.ddb_resource = None
Приложение всегда работает с одним и тем же объектом пула соединений, поэтому новое соединение не открывается для каждого запроса.
aexit вызывается корректно при завершении работы контейнера.
Версии
После обновления с Python 3.11 → 3.13 и увеличения зависимостей утечка начала проявляться:

Код: Выделить всё

aioboto3==15.1.0
aiologger==0.7.0
grpcio==1.75.1
protobuf==6.32.1
Наблюдаемое поведение
Используя трассировку, я сравнил снимки памяти и заметил повторяющийся рост в этом месте:

Код: Выделить всё

/usr/local/lib/python3.13/site-packages/aiohttp/client_proto.py:315:
size=78.7 MiB (+18.1 MiB), count=1,288,026 (+296,583), average=64 B
Похоже, что aiohttp (используемый внутри aioboto3) со временем накапливает небольшие объекты, предлагая либо:
незакрытые объекты aiohttp.ClientSession, либо
что-то, содержащее ссылки на транспортные буферы aiohttp.
Что я пробовал
  • Проверено что aexit вызывается при завершении работы.
  • Подтверждено, что get_resource() повторно использует один и тот же ресурс и не инициализирует его повторно для каждого запроса.
  • Нет другого использования aiohttp в базе кода (только через aioboto3).
Вопрос
Кто-нибудь сталкивался с утечками памяти при aioboto3 или aiohttp после обновления до Python 3.13?
Может ли это быть связано с управлением внутренними сеансами в более новой версии aiohttp, входящей в состав aioboto3 15.1.0, или с чем-то, что изменилось в асинхронной обработке памяти Python?
Будем признательны за любые советы о том, как отслеживать или уменьшать рост памяти aiohttp с помощью aioboto3.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»