** Description changed: [Impact] Applications using package python-tornado v5.1.1 or earlier are susceptible to an out of memory error related to websockets. [Other Info] Upstream commit(s): https://github.com/tornadoweb/tornado/pull/2351/commits/20becca336caae61cd24f7afba0e177c0a210c70 $ git remote -v origin https://github.com/tornadoweb/tornado.git (fetch) origin https://github.com/tornadoweb/tornado.git (push) $ git describe --contains 20becca3 v5.1.0b1~28^2~1 $ rmadison python3-tornardo => python3-tornado | 4.2.1-1ubuntu3 | xenial python3-tornado | 4.5.3-1 | bionic/universe => python3-tornado | 4.5.3-1ubuntu0.1 | bionic-updates/universe python3-tornado | 6.0.3+really5.1.1-3 | focal/universe python3-tornado | 6.0.4-2 | groovy/universe python3-tornado | 6.0.4-3 | hirsute/universe python3-tornado | 6.1.0-1 | hirsute-proposed/universe [Original Description] Tornado has no 'flow control' for websockets. A websocket will receive data as fast as it can, and store the data in a deque. If that data is not consumed as fast as it is written, then that deque will grow in size indefinitely, ultimately leading to a memory error and killing the process. Fix is to use a Queue. Read and get messages from the queue on the client side. Patch file [0] Commit history [1] GitHub [2] Issue [3] [0] https://patch-diff.githubusercontent.com/raw/tornadoweb/tornado/pull/2351.patch [1] https://github.com/tornadoweb/tornado/pull/2351/commits [2] https://github.com/tornadoweb/tornado [3] https://github.com/tornadoweb/tornado/issues/2341 [Test Case] # Before adding patch file # lxc container start lxc launch ubuntu:18.04 server lxc stop server # network setup lxc network attach lxcbr0 server eth0 eth0 lxc config device set server eth0 ipv4.address 10.0.0.3 lxc start server # lxc container start lxc launch ubuntu:18.04 client lxc stop client # network setup lxc network attach lxcbr0 client eth0 eth0 lxc config device set client eth0 ipv4.address 10.0.0.3 lxc start client # server.py setup apt-get update apt install ubuntu-dev-tools -y pull-lp-source python-tornado bionic sudo apt build-dep . # shrink server size lxc config set server limits.cpu 2 lxc config set server limits.memory 150MB lxc exec server bash - from the python-tornado-4.5.3/ - # edit + python3 setup.py build python3 setup.py install python3 demos/server.py # client.py setup # same as server use - ip a + `ip a` to find ip address for client container or exit and do `lxc list` + from python-tornado-4.5.3/ + # edit client.py websocket ip address + client = Client("ws://localhost:3000", 5) - client.py side - root@iptest:~/python-tornado-4.5.3# python3 demos/client.py + # Run client py code + root@client:~/python-tornado-4.5.3# python3 demos/client.py trying to connect connected Killed # run this command on both terminals sudo dmesg | grep -i python OOM error - [ 3250.067833] oom-kill:constraint=CONSTRAINT_MEMCG,nodemask=(null),cpuset=lxc.payload.iptest,mems_allowed=0,oom_memcg=/lxc.payload.iptest,task_memcg=/lxc.payload.iptest,task=python3,pid=44889,uid=1000000 + [ 3250.067833] oom-kill:constraint=CONSTRAINT_MEMCG,nodemask=(null),cpuset=lxc.payload.client,mems_allowed=0,oom_memcg=/lxc.payload.client,task_memcg=/lxc.payload.client,task=python3,pid=44889,uid=1000000 [ 3250.067838] Memory cgroup out of memory: Killed process 44889 (python3) total-vm:304616kB, anon-rss:235152kB, file-rss:0kB, shmem-rss:0kB, UID:1000000 pgtables:628kB oom_score_adj:0 [ 3250.075096] oom_reaper: reaped process 44889 (python3), now anon-rss:0kB, file-rss:0kB, shmem-rss:0k # After applying patch file, rebuild/rerun server.py and client.py - You no longer have OOM websocket errors in the logs. - # Run command to verify no new OOM errors were logged + You no longer have OOM websocket errors in the logs. + # Command to verify no new OOM errors were logged sudo dmesg | grep -i python
** Description changed: [Impact] Applications using package python-tornado v5.1.1 or earlier are susceptible to an out of memory error related to websockets. [Other Info] Upstream commit(s): https://github.com/tornadoweb/tornado/pull/2351/commits/20becca336caae61cd24f7afba0e177c0a210c70 $ git remote -v origin https://github.com/tornadoweb/tornado.git (fetch) origin https://github.com/tornadoweb/tornado.git (push) $ git describe --contains 20becca3 v5.1.0b1~28^2~1 $ rmadison python3-tornardo => python3-tornado | 4.2.1-1ubuntu3 | xenial python3-tornado | 4.5.3-1 | bionic/universe => python3-tornado | 4.5.3-1ubuntu0.1 | bionic-updates/universe python3-tornado | 6.0.3+really5.1.1-3 | focal/universe python3-tornado | 6.0.4-2 | groovy/universe python3-tornado | 6.0.4-3 | hirsute/universe python3-tornado | 6.1.0-1 | hirsute-proposed/universe [Original Description] Tornado has no 'flow control' for websockets. A websocket will receive data as fast as it can, and store the data in a deque. If that data is not consumed as fast as it is written, then that deque will grow in size indefinitely, ultimately leading to a memory error and killing the process. Fix is to use a Queue. Read and get messages from the queue on the client side. Patch file [0] Commit history [1] GitHub [2] Issue [3] [0] https://patch-diff.githubusercontent.com/raw/tornadoweb/tornado/pull/2351.patch [1] https://github.com/tornadoweb/tornado/pull/2351/commits [2] https://github.com/tornadoweb/tornado [3] https://github.com/tornadoweb/tornado/issues/2341 [Test Case] # Before adding patch file # lxc container start lxc launch ubuntu:18.04 server lxc stop server # network setup lxc network attach lxcbr0 server eth0 eth0 lxc config device set server eth0 ipv4.address 10.0.0.3 lxc start server # lxc container start lxc launch ubuntu:18.04 client lxc stop client # network setup lxc network attach lxcbr0 client eth0 eth0 lxc config device set client eth0 ipv4.address 10.0.0.3 lxc start client # server.py setup apt-get update apt install ubuntu-dev-tools -y pull-lp-source python-tornado bionic sudo apt build-dep . # shrink server size lxc config set server limits.cpu 2 lxc config set server limits.memory 150MB lxc exec server bash + # Copy and paste the attached server.py code + # Saved to python-tornado-4.5.3/demos/ + # Build and run server.py python3 setup.py build python3 setup.py install python3 demos/server.py # client.py setup - # same as server + # Copy and paste the attached client.py code + # Saved to python-tornado-4.5.3/demos/ use `ip a` to find ip address for client container or exit and do `lxc list` from python-tornado-4.5.3/ # edit client.py websocket ip address client = Client("ws://localhost:3000", 5) # Run client py code root@client:~/python-tornado-4.5.3# python3 demos/client.py trying to connect connected Killed # run this command on both terminals sudo dmesg | grep -i python OOM error [ 3250.067833] oom-kill:constraint=CONSTRAINT_MEMCG,nodemask=(null),cpuset=lxc.payload.client,mems_allowed=0,oom_memcg=/lxc.payload.client,task_memcg=/lxc.payload.client,task=python3,pid=44889,uid=1000000 [ 3250.067838] Memory cgroup out of memory: Killed process 44889 (python3) total-vm:304616kB, anon-rss:235152kB, file-rss:0kB, shmem-rss:0kB, UID:1000000 pgtables:628kB oom_score_adj:0 [ 3250.075096] oom_reaper: reaped process 44889 (python3), now anon-rss:0kB, file-rss:0kB, shmem-rss:0k # After applying patch file, rebuild/rerun server.py and client.py You no longer have OOM websocket errors in the logs. # Command to verify no new OOM errors were logged sudo dmesg | grep -i python -- You received this bug notification because you are a member of Ubuntu Bugs, which is subscribed to Ubuntu. https://bugs.launchpad.net/bugs/1903733 Title: Out of memory issue for websocket client To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+source/python-tornado/+bug/1903733/+subscriptions -- ubuntu-bugs mailing list ubuntu-bugs@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs