Рост памяти прекращается, когда я прекращаю входящие запросы 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.ClientSession, либо
что-то, содержащее ссылки на транспортные буферы aiohttp.
Что я пробовал
- Проверено что aexit вызывается при завершении работы.
- Подтверждено, что get_resource() повторно использует один и тот же ресурс и не инициализирует его повторно для каждого запроса.
- Нет другого использования aiohttp в базе кода (только через aioboto3).
Кто-нибудь сталкивался с утечками памяти при aioboto3 или aiohttp после обновления до Python 3.13?
Может ли это быть связано с управлением внутренними сеансами в более новой версии aiohttp, входящей в состав aioboto3 15.1.0, или с чем-то, что изменилось в асинхронной обработке памяти Python?
Будем признательны за любые советы о том, как отслеживать или уменьшать рост памяти aiohttp с помощью aioboto3.
Мобильная версия