Description
Long story short
Fairly standard websocket server/client setup, but with session, results in 100% CPU usage.
- Generic websocket server
- Generic websocket client, but with a session that does a
getrequest (to the same endpoint) before a new request to start a websocket - In a few minutes, CPU usage increases to 100%
Note that removing the get request seems to avoid the problem.
Expected behaviour
Low CPU usage when idle
Actual behaviour
Worker process suddenly goes to 100% CPU usage, confirmed with htop.
Steps to reproduce
Server
import asyncio
import aiohttp
from aiohttp import web
async def worker_websocket(request):
ws = aiohttp.web.WebSocketResponse()
await ws.prepare(request)
async for msg in ws:
pass
return ws
app = aiohttp.web.Application()
app.router.add_get('/worker-websocket',worker_websocket)
web.run_app( app, port=int(8080))
worker
import aiohttp
from aiohttp import web
import asyncio
async def websocket_client(loop):
url = 'http://localhost:8080/worker-websocket'
session = aiohttp.ClientSession(loop=loop)
# removing this prevents the problem!
async with session.get(url) as resp:
pass
async with session.ws_connect(url=url) as ws:
async for msg in ws:
pass
loop = asyncio.get_event_loop()
client = websocket_client(loop)
loop.run_until_complete(client)
Run server + worker and wait a few minutes. Eventually the server process will eat one core. Remove the session.get and it does not happen.
Your environment
I've reproduced this, so far, on:
- MacOS 10.12 (Sierra) + Python 3.6.1 with aiohttp 2.1.0
- Ubuntu server 16.04 LTS + Python 3.5.2 with aiohttp 2.1.0
Using strace, all I can see is highly frequent epoll_wait calls returning 0. My attempts with pyrasite and gdb-python3 yielded nothing useful.
I'm still yet to try ipdb and try to look through the source.
The only thing I can find that is even remotely similar is https://groups.google.com/forum/#!topic/libuv/opFk74lww7k .
Otherwise my experience with aiohttp has been fantastic. Thanks for a great library.