Увеличение частоты ошибок aiohttp с количеством подключений

Я пытаюсь получить код состояния из миллионов разных сайтов, я использую asyncio и aiohttp, я запускаю приведенный ниже код с другим количеством подключений (хотя тот же тайм-аут по запросу), но очень сильно отличается от результатов большее число следующих исключений.

'concurrent.futures._base.TimeoutError'

Код

import pandas as pd
import asyncio
import aiohttp

out = []
CONNECTIONS = 1000
TIMEOUT = 10

async def fetch(url, session, loop):
    try:
        async with session.get(url,timeout=TIMEOUT) as response:
            res = response.status
            out.append(res)
            return res
    except Exception as e:
        _exception = 'Error: '+str(type(e))
        out.append(_exception)
        return _exception

async def bound_fetch(sem, url, session, loop):
    async with sem:
        await fetch(url, session, loop)

async def run(urls, loop):
    tasks = []
    sem = asyncio.Semaphore(value=CONNECTIONS,loop=loop)
    _connector = aiohttp.TCPConnector(limit=CONNECTIONS, loop=loop)
    async with aiohttp.ClientSession(connector=_connector,loop=loop) as session:
        for url in urls:
            task = asyncio.ensure_future(bound_fetch(sem, url, session, loop))
            tasks.append(task)
        responses = await asyncio.gather(*tasks,return_exceptions=True)
        return responses

## BEGIN ##

tlds = open('data/sample_1k.txt').read().splitlines()
urls = ['http://{}'.format(x) for x in tlds[1:]]

loop = asyncio.get_event_loop()
future = asyncio.ensure_future(run(urls,loop))
ans = loop.run_until_complete(future)

print(str(pd.Series(out).value_counts()))

Результаты

СОЕДИНЕНИЯ = 1000

введите описание изображения здесь

СОЕДИНЕНИЯ = 100

введите описание изображения здесь

Это ошибка? Эти сайты реагируют с кодом состояния и запускаются последовательно или с более низкими соединениями, где нет ошибки таймаута, так почему это происходит? Другие исключения кажутся стабильными при изменении количества подключений. ClientOSErrors - это сайты, которые на самом деле тайм-аут или ответ, честно говоря, не знают, откуда происходят ошибки concurrent.futures._base.TimeoutError.

Ответ 1

Представьте, что вы открыли 1000 URL-адресов в браузере одновременно. Бьюсь об заклад, вы заметите, что многие из них не загружаются через 10 секунд. Это не ошибка, которая ограничивает ваши машинные ресурсы.

Дополнительные параллельные запросы, которые вы выполняете, → меньше пропускной способности сети для каждого, меньше времени процессора для каждого, меньше ОЗУ для каждого → более высокие шансы, что каждый запрос не будет готов до истечения времени ожидания.

Если вы видите, что существует много тайм-аутов с 1000 подключениями, уменьшите количество подключений (и может увеличить время ожидания). Основываясь на aiohttp документации, используя различные неудобства ClientSession, также может помочь:

Если вы не подключаетесь к большому, неизвестному числу разных серверов в течение всего срока службы вашего приложения, рекомендуется использовать один сеанс для срока службы вашего приложения

Ответ 2

У меня была такая же проблема, посмотрите подробности ClientOSError, и вы можете увидеть Too many open files, если вам нужно увеличить номер ОС файловых дескрипторов.

В любом случае вы получите больше информации, если вы распечатаете все исключения, а не только их типы.