почему скорость отправки aiohttp запросов медленнее на одной машине? - PullRequest
0 голосов
/ 22 октября 2018

Моя цель - отправить как можно больше запросов за очень короткий промежуток времени в python (например, 10000 запросов за 5 секунд).

Я использую asyncio и aiohttp иЯ запускаю точно такой же код на 2 машинах.один мой локальный компьютер, а другой мой VPS.Но результат двух машин различен:

Проблема в том, что количество запросов в секунду в моем VPS намного меньше, чем я ожидаю.Хотя скорость VPS в Интернете намного выше, чем в моем домашнем интернет-соединении, скорость отправки запросов по VPS не намного превышает 300 в секунду, но на моем локальном компьютере я легко могу создать 2000 запросов в секунду.Что может быть причиной такой низкой скорости в VPS?Это из-за программного или аппаратного обеспечения?как я могу узнать, что является узким местом на сервере?

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

  1. локальный

    • ОС: macOS High Sierra
    • Процессор: 2,9 ГГц Intel Core i7
    • Память: 16 ГБ, 2133 МГц, LPDDR3
  2. VPS

    • ОС: Ubuntu 16.04 LTS (Xenial Xerus)
    • Процессор: Intel (R) Xeon (R) Процессор X5550 @ 2,67 ГГц (4 ядра)
    • Память: 12 ГБ

Python 3.6.4 используетсякак для локального, так и для сервера.

Структура кода, который я использую как для локального, так и для сервера, приведена ниже:

import asyncio
import aiohttp

async def send_one():

    async with sem:
        try:

            async with session.post(url=some_target_url,json=tmp_data,headers=headers) as resp:
                # do some logging, result of request is not important to me
                pass

        except Exception as e:
            print("Exception happened when sending request: "+str(e))

async def send_many():
    tasks = []
    sem = asyncio.Semaphore(limit_open_requests) # this number is high enough like 10000

    delta_time= 1/number_of_requests_per_second # number of requests is 1000 for example

    timeout = aiohttp.ClientTimeout(total=30) # unit is seconds 

    connector = aiohttp.TCPConnector(limit=0)
    async with aiohttp.ClientSession(connector=connector,timeout=timeout) as session:
        while True:

            if some condition on timing:
                break
            #>>>>>>>
            #>>>>>>> I log here the count and time of requests to measure the rate of sending them
            #>>>>>>>

            coro=send_one()
            task = asyncio.ensure_future(coro)

            tasks.append(task)
            await asyncio.sleep(delta_time)

        if len(tasks)!=0:
            await asyncio.wait(tasks)
        print('finished')

async_tasks = []
async_tasks.append( send_many() )
loop.run_until_complete(asyncio.wait(async_tasks))

- отметьте, что я не отправляюзапросы с локальных на vps.Я отправляю с локального и vps на третий сервер (например, "http://google.com")

использовал aiohttp.TCPConnector (limit = 0), чтобы установить число запросов для aiohttp неограниченным.

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

установка await asyncio.sleep(delta_time) на await asyncio.sleep(0) не имеет большого значения. она просто немного улучшаетсячто далеко от того, что я могу достичь локально. (например, 400 запросов в секунду на VPS VS 2000 запросов в секунду на локальной машине)

...