Моя цель - отправить как можно больше запросов за очень короткий промежуток времени в python (например, 10000 запросов за 5 секунд).
Я использую asyncio и aiohttp иЯ запускаю точно такой же код на 2 машинах.один мой локальный компьютер, а другой мой VPS.Но результат двух машин различен:
Проблема в том, что количество запросов в секунду в моем VPS намного меньше, чем я ожидаю.Хотя скорость VPS в Интернете намного выше, чем в моем домашнем интернет-соединении, скорость отправки запросов по VPS не намного превышает 300 в секунду, но на моем локальном компьютере я легко могу создать 2000 запросов в секунду.Что может быть причиной такой низкой скорости в VPS?Это из-за программного или аппаратного обеспечения?как я могу узнать, что является узким местом на сервере?
Мне плевать на результат запросов.Я просто хочу отправить как можно больше за короткий промежуток времени, и похоже, что при создании сопрограмм vps работает медленнее (место, в котором я считаю запросы, показано в разделе кода ниже. Запросы считаются такими, какие они есть).создано, а не при отправке)
локальный
- ОС: macOS High Sierra
- Процессор: 2,9 ГГц Intel Core i7
- Память: 16 ГБ, 2133 МГц, LPDDR3
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 запросов в секунду на локальной машине)