为什么在一台计算机上发送aiohttp请求的速度较慢?

时间:2018-10-22 07:45:41

标签: python performance asynchronous python-asyncio aiohttp

我的目标是要在很短的时间内用python发送尽可能多的请求(例如5秒钟内发送10000个请求)。

我正在使用asyncio和aiohttp,并且在两台计算机上运行完全相同的代码。一个是我的本地计算机,另一个是我的VPS。但是两台机器的结果是不同的:

问题是我的VPS中每秒的请求数量比我预期的要低得多。尽管VPS的互联网速度比我的家庭Internet连接快得多,但是在VPS上发送请求的速率并没有超过每秒300个,但是在我本地,我可以轻松地提高到每秒创建2000个请求。 VPS如此低的速度可能是什么原因?是因为软件还是硬件?我怎么知道服务器上的瓶颈?

我不在乎请求的结果。我只想在短时间内发送尽可能多的邮件,听起来vps创建协程的速度较慢。(我对请求进行计数的位置在下面的代码部分中显示。这些请求按原样计数创建的,而不是实际发送的时间)

  1. 本地

    • 操作系统:macOS High Sierra
    • CPU:2.9 GHz Intel Core i7
    • 内存:16 GB 2133 MHz LPDDR3
  2. VPS

    • 操作系统:Ubuntu 16.04 LTS(Xenial Xerus)
    • CPU:2.67GHz(4核)Intel(R)Xeon(R)CPU X5550
    • 内存:12 GB

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)并没有太大区别。它只是改善了一点,与我在本地无法实现的目标相去甚远。 (例如,在vps上每秒处理400个请求,在本地计算机上每秒处理2000个请求)

0 个答案:

没有答案