-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
stream.hls: read and discard filtered sequences properly #4229
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
This fixes the phenomenon where during twitch stream prerolls, a lot of TCP connections are opened / closed rapidly, instead of the same one(s) being reused for sequential segments like during normal operation. The response data always needs to be read from the socket, otherwise the socket cannot be reused by other HTTP requests (hence the rapid closing/opening of connections during skipped segments)
13a578e
to
71214f7
Compare
Thanks. This looks good after taking a quick initial glimpse of the diff. I'll review this properly later when I have the time. Related: #4159, #4126 (comment) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Here are some test results from my machine. The master+preroll example (second one) shows that the current version on master does indeed create new TCP connections when filtering out HLS segments while not consuming the response content afterwards.
All tests have set --hls-segment-stream-data
set to true (via --twitch-low-latency
), which is what's causing the issue (like in the linked threads above). Filtering segments and not consuming the response content is just another issue which this PR solves.
According to python-requests / urllib3, connections which are fully consumed get released back to the connection pool:
- https://github.com/psf/requests/blob/v2.26.0/requests/models.py#L758-L759
- https://github.com/urllib3/urllib3/blob/1.26.7/src/urllib3/response.py#L555-L579
- https://github.com/urllib3/urllib3/blob/1.26.7/src/urllib3/response.py#L520-L530
- https://github.com/urllib3/urllib3/blob/1.26.7/src/urllib3/response.py#L425-L479
On master - without preroll ads
$ for n in {0..9}; do echo $n: $(date -Iseconds); ss -tp state all | awk 'NR==1 || /streamlink/' | column -t; echo; sleep 1; done
0: 2021-12-02T20:44:19+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 1209 192.168.178.99:38928 185.42.205.214:https users:(("streamlink",pid=178197,fd=7))
ESTAB 0 0 192.168.178.99:57982 192.108.239.254:https users:(("streamlink",pid=178197,fd=4))
ESTAB 0 0 192.168.178.99:55692 23.160.0.108:https users:(("streamlink",pid=178197,fd=5))
ESTAB 0 0 192.168.178.99:38926 185.42.205.214:https users:(("streamlink",pid=178197,fd=6))
ESTAB 0 0 192.168.178.99:50732 151.101.14.167:https users:(("streamlink",pid=178197,fd=3))
1: 2021-12-02T20:44:20+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:38928 185.42.205.214:https users:(("streamlink",pid=178197,fd=7))
ESTAB 0 0 192.168.178.99:57982 192.108.239.254:https users:(("streamlink",pid=178197,fd=4))
ESTAB 0 0 192.168.178.99:55692 23.160.0.108:https users:(("streamlink",pid=178197,fd=5))
ESTAB 0 0 192.168.178.99:38926 185.42.205.214:https users:(("streamlink",pid=178197,fd=6))
ESTAB 0 0 192.168.178.99:50732 151.101.14.167:https users:(("streamlink",pid=178197,fd=3))
2: 2021-12-02T20:44:21+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 1209 192.168.178.99:38928 185.42.205.214:https users:(("streamlink",pid=178197,fd=7))
ESTAB 0 0 192.168.178.99:57982 192.108.239.254:https users:(("streamlink",pid=178197,fd=4))
ESTAB 0 0 192.168.178.99:55692 23.160.0.108:https users:(("streamlink",pid=178197,fd=5))
ESTAB 0 0 192.168.178.99:38926 185.42.205.214:https users:(("streamlink",pid=178197,fd=6))
ESTAB 0 0 192.168.178.99:50732 151.101.14.167:https users:(("streamlink",pid=178197,fd=3))
3: 2021-12-02T20:44:22+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:38928 185.42.205.214:https users:(("streamlink",pid=178197,fd=7))
ESTAB 0 0 192.168.178.99:57982 192.108.239.254:https users:(("streamlink",pid=178197,fd=4))
ESTAB 0 0 192.168.178.99:55692 23.160.0.108:https users:(("streamlink",pid=178197,fd=5))
ESTAB 0 0 192.168.178.99:38926 185.42.205.214:https users:(("streamlink",pid=178197,fd=6))
ESTAB 0 0 192.168.178.99:50732 151.101.14.167:https users:(("streamlink",pid=178197,fd=3))
4: 2021-12-02T20:44:23+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 1209 192.168.178.99:38928 185.42.205.214:https users:(("streamlink",pid=178197,fd=7))
ESTAB 0 0 192.168.178.99:57982 192.108.239.254:https users:(("streamlink",pid=178197,fd=4))
ESTAB 0 0 192.168.178.99:55692 23.160.0.108:https users:(("streamlink",pid=178197,fd=5))
ESTAB 0 0 192.168.178.99:38926 185.42.205.214:https users:(("streamlink",pid=178197,fd=6))
ESTAB 0 0 192.168.178.99:50732 151.101.14.167:https users:(("streamlink",pid=178197,fd=3))
5: 2021-12-02T20:44:24+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:38928 185.42.205.214:https users:(("streamlink",pid=178197,fd=7))
ESTAB 0 0 192.168.178.99:57982 192.108.239.254:https users:(("streamlink",pid=178197,fd=4))
ESTAB 0 0 192.168.178.99:55692 23.160.0.108:https users:(("streamlink",pid=178197,fd=5))
ESTAB 0 0 192.168.178.99:38926 185.42.205.214:https users:(("streamlink",pid=178197,fd=6))
ESTAB 0 0 192.168.178.99:50732 151.101.14.167:https users:(("streamlink",pid=178197,fd=3))
6: 2021-12-02T20:44:25+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 1209 192.168.178.99:38928 185.42.205.214:https users:(("streamlink",pid=178197,fd=7))
ESTAB 0 0 192.168.178.99:57982 192.108.239.254:https users:(("streamlink",pid=178197,fd=4))
ESTAB 0 0 192.168.178.99:55692 23.160.0.108:https users:(("streamlink",pid=178197,fd=5))
ESTAB 0 0 192.168.178.99:38926 185.42.205.214:https users:(("streamlink",pid=178197,fd=6))
ESTAB 0 0 192.168.178.99:50732 151.101.14.167:https users:(("streamlink",pid=178197,fd=3))
7: 2021-12-02T20:44:26+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:38928 185.42.205.214:https users:(("streamlink",pid=178197,fd=7))
ESTAB 0 0 192.168.178.99:57982 192.108.239.254:https users:(("streamlink",pid=178197,fd=4))
ESTAB 0 0 192.168.178.99:55692 23.160.0.108:https users:(("streamlink",pid=178197,fd=5))
ESTAB 0 0 192.168.178.99:38926 185.42.205.214:https users:(("streamlink",pid=178197,fd=6))
ESTAB 0 0 192.168.178.99:50732 151.101.14.167:https users:(("streamlink",pid=178197,fd=3))
8: 2021-12-02T20:44:27+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 1209 192.168.178.99:38928 185.42.205.214:https users:(("streamlink",pid=178197,fd=7))
ESTAB 0 0 192.168.178.99:57982 192.108.239.254:https users:(("streamlink",pid=178197,fd=4))
ESTAB 0 0 192.168.178.99:55692 23.160.0.108:https users:(("streamlink",pid=178197,fd=5))
ESTAB 0 0 192.168.178.99:38926 185.42.205.214:https users:(("streamlink",pid=178197,fd=6))
ESTAB 0 0 192.168.178.99:50732 151.101.14.167:https users:(("streamlink",pid=178197,fd=3))
9: 2021-12-02T20:44:28+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:38928 185.42.205.214:https users:(("streamlink",pid=178197,fd=7))
ESTAB 0 0 192.168.178.99:57982 192.108.239.254:https users:(("streamlink",pid=178197,fd=4))
ESTAB 0 0 192.168.178.99:55692 23.160.0.108:https users:(("streamlink",pid=178197,fd=5))
ESTAB 0 0 192.168.178.99:38926 185.42.205.214:https users:(("streamlink",pid=178197,fd=6))
ESTAB 0 0 192.168.178.99:50732 151.101.14.167:https users:(("streamlink",pid=178197,fd=3))
On master - with preroll ads
$ for n in {0..9}; do echo $n: $(date -Iseconds); ss -tp state all | awk 'NR==1 || /streamlink/' | column -t; echo; sleep 1; done
0: 2021-12-02T20:46:13+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50812 23.160.0.254:https users:(("streamlink",pid=178576,fd=4))
ESTAB 0 0 192.168.178.99:50736 151.101.14.167:https users:(("streamlink",pid=178576,fd=3))
ESTAB 86352 0 192.168.178.99:52604 185.42.205.227:https users:(("streamlink",pid=178576,fd=7))
ESTAB 0 0 192.168.178.99:55696 23.160.0.108:https users:(("streamlink",pid=178576,fd=5))
1: 2021-12-02T20:46:14+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50812 23.160.0.254:https users:(("streamlink",pid=178576,fd=4))
ESTAB 0 0 192.168.178.99:50736 151.101.14.167:https users:(("streamlink",pid=178576,fd=3))
ESTAB 86352 0 192.168.178.99:52604 185.42.205.227:https users:(("streamlink",pid=178576,fd=7))
ESTAB 0 0 192.168.178.99:55696 23.160.0.108:https users:(("streamlink",pid=178576,fd=5))
2: 2021-12-02T20:46:15+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50812 23.160.0.254:https users:(("streamlink",pid=178576,fd=4))
ESTAB 86880 0 192.168.178.99:52608 185.42.205.227:https users:(("streamlink",pid=178576,fd=6))
ESTAB 0 0 192.168.178.99:50736 151.101.14.167:https users:(("streamlink",pid=178576,fd=3))
ESTAB 0 0 192.168.178.99:55696 23.160.0.108:https users:(("streamlink",pid=178576,fd=5))
3: 2021-12-02T20:46:16+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50812 23.160.0.254:https users:(("streamlink",pid=178576,fd=4))
ESTAB 87648 0 192.168.178.99:52608 185.42.205.227:https users:(("streamlink",pid=178576,fd=6))
ESTAB 0 0 192.168.178.99:50736 151.101.14.167:https users:(("streamlink",pid=178576,fd=3))
ESTAB 0 0 192.168.178.99:55696 23.160.0.108:https users:(("streamlink",pid=178576,fd=5))
4: 2021-12-02T20:46:17+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50812 23.160.0.254:https users:(("streamlink",pid=178576,fd=4))
ESTAB 0 0 192.168.178.99:50736 151.101.14.167:https users:(("streamlink",pid=178576,fd=3))
ESTAB 81117 0 192.168.178.99:52610 185.42.205.227:https users:(("streamlink",pid=178576,fd=7))
ESTAB 0 0 192.168.178.99:55696 23.160.0.108:https users:(("streamlink",pid=178576,fd=5))
5: 2021-12-02T20:46:18+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50812 23.160.0.254:https users:(("streamlink",pid=178576,fd=4))
ESTAB 0 0 192.168.178.99:50736 151.101.14.167:https users:(("streamlink",pid=178576,fd=3))
ESTAB 87805 0 192.168.178.99:52610 185.42.205.227:https users:(("streamlink",pid=178576,fd=7))
ESTAB 0 0 192.168.178.99:55696 23.160.0.108:https users:(("streamlink",pid=178576,fd=5))
6: 2021-12-02T20:46:19+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50812 23.160.0.254:https users:(("streamlink",pid=178576,fd=4))
ESTAB 78221 0 192.168.178.99:52612 185.42.205.227:https users:(("streamlink",pid=178576,fd=6))
ESTAB 0 0 192.168.178.99:50736 151.101.14.167:https users:(("streamlink",pid=178576,fd=3))
ESTAB 0 0 192.168.178.99:55696 23.160.0.108:https users:(("streamlink",pid=178576,fd=5))
7: 2021-12-02T20:46:20+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50812 23.160.0.254:https users:(("streamlink",pid=178576,fd=4))
ESTAB 87037 0 192.168.178.99:52612 185.42.205.227:https users:(("streamlink",pid=178576,fd=6))
ESTAB 0 0 192.168.178.99:50736 151.101.14.167:https users:(("streamlink",pid=178576,fd=3))
ESTAB 0 0 192.168.178.99:55696 23.160.0.108:https users:(("streamlink",pid=178576,fd=5))
8: 2021-12-02T20:46:21+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50812 23.160.0.254:https users:(("streamlink",pid=178576,fd=4))
ESTAB 87037 0 192.168.178.99:52612 185.42.205.227:https users:(("streamlink",pid=178576,fd=6))
ESTAB 0 0 192.168.178.99:50736 151.101.14.167:https users:(("streamlink",pid=178576,fd=3))
ESTAB 0 0 192.168.178.99:55696 23.160.0.108:https users:(("streamlink",pid=178576,fd=5))
9: 2021-12-02T20:46:22+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50812 23.160.0.254:https users:(("streamlink",pid=178576,fd=4))
ESTAB 0 0 192.168.178.99:50736 151.101.14.167:https users:(("streamlink",pid=178576,fd=3))
ESTAB 66608 0 192.168.178.99:52614 185.42.205.227:https users:(("streamlink",pid=178576,fd=7))
ESTAB 0 0 192.168.178.99:55696 23.160.0.108:https users:(("streamlink",pid=178576,fd=5))
This PR - with preroll ads
$ for n in {0..9}; do echo $n: $(date -Iseconds); ss -tp state all | awk 'NR==1 || /streamlink/' | column -t; echo; sleep 1; done
0: 2021-12-02T20:48:07+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50814 23.160.0.254:https users:(("streamlink",pid=179032,fd=4))
ESTAB 0 0 192.168.178.99:38930 185.42.205.214:https users:(("streamlink",pid=179032,fd=7))
ESTAB 0 0 192.168.178.99:50738 151.101.14.167:https users:(("streamlink",pid=179032,fd=3))
ESTAB 0 0 192.168.178.99:55698 23.160.0.108:https users:(("streamlink",pid=179032,fd=5))
ESTAB 0 0 192.168.178.99:38932 185.42.205.214:https users:(("streamlink",pid=179032,fd=6))
1: 2021-12-02T20:48:08+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50814 23.160.0.254:https users:(("streamlink",pid=179032,fd=4))
ESTAB 0 0 192.168.178.99:38930 185.42.205.214:https users:(("streamlink",pid=179032,fd=7))
ESTAB 0 0 192.168.178.99:50738 151.101.14.167:https users:(("streamlink",pid=179032,fd=3))
ESTAB 0 0 192.168.178.99:55698 23.160.0.108:https users:(("streamlink",pid=179032,fd=5))
ESTAB 0 0 192.168.178.99:38932 185.42.205.214:https users:(("streamlink",pid=179032,fd=6))
2: 2021-12-02T20:48:09+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50814 23.160.0.254:https users:(("streamlink",pid=179032,fd=4))
ESTAB 0 0 192.168.178.99:38930 185.42.205.214:https users:(("streamlink",pid=179032,fd=7))
ESTAB 0 0 192.168.178.99:50738 151.101.14.167:https users:(("streamlink",pid=179032,fd=3))
ESTAB 0 0 192.168.178.99:55698 23.160.0.108:https users:(("streamlink",pid=179032,fd=5))
ESTAB 0 0 192.168.178.99:38932 185.42.205.214:https users:(("streamlink",pid=179032,fd=6))
3: 2021-12-02T20:48:10+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50814 23.160.0.254:https users:(("streamlink",pid=179032,fd=4))
ESTAB 0 0 192.168.178.99:38930 185.42.205.214:https users:(("streamlink",pid=179032,fd=7))
ESTAB 0 0 192.168.178.99:50738 151.101.14.167:https users:(("streamlink",pid=179032,fd=3))
ESTAB 0 0 192.168.178.99:55698 23.160.0.108:https users:(("streamlink",pid=179032,fd=5))
ESTAB 0 0 192.168.178.99:38932 185.42.205.214:https users:(("streamlink",pid=179032,fd=6))
4: 2021-12-02T20:48:11+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50814 23.160.0.254:https users:(("streamlink",pid=179032,fd=4))
ESTAB 0 0 192.168.178.99:38930 185.42.205.214:https users:(("streamlink",pid=179032,fd=7))
ESTAB 0 0 192.168.178.99:50738 151.101.14.167:https users:(("streamlink",pid=179032,fd=3))
ESTAB 0 0 192.168.178.99:55698 23.160.0.108:https users:(("streamlink",pid=179032,fd=5))
ESTAB 0 0 192.168.178.99:38932 185.42.205.214:https users:(("streamlink",pid=179032,fd=6))
5: 2021-12-02T20:48:12+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50814 23.160.0.254:https users:(("streamlink",pid=179032,fd=4))
ESTAB 0 0 192.168.178.99:38930 185.42.205.214:https users:(("streamlink",pid=179032,fd=7))
ESTAB 0 0 192.168.178.99:50738 151.101.14.167:https users:(("streamlink",pid=179032,fd=3))
ESTAB 0 0 192.168.178.99:55698 23.160.0.108:https users:(("streamlink",pid=179032,fd=5))
ESTAB 0 0 192.168.178.99:38932 185.42.205.214:https users:(("streamlink",pid=179032,fd=6))
6: 2021-12-02T20:48:13+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50814 23.160.0.254:https users:(("streamlink",pid=179032,fd=4))
ESTAB 0 0 192.168.178.99:38930 185.42.205.214:https users:(("streamlink",pid=179032,fd=7))
ESTAB 0 0 192.168.178.99:50738 151.101.14.167:https users:(("streamlink",pid=179032,fd=3))
ESTAB 0 0 192.168.178.99:55698 23.160.0.108:https users:(("streamlink",pid=179032,fd=5))
ESTAB 0 0 192.168.178.99:38932 185.42.205.214:https users:(("streamlink",pid=179032,fd=6))
7: 2021-12-02T20:48:14+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50814 23.160.0.254:https users:(("streamlink",pid=179032,fd=4))
ESTAB 0 0 192.168.178.99:38930 185.42.205.214:https users:(("streamlink",pid=179032,fd=7))
ESTAB 0 0 192.168.178.99:50738 151.101.14.167:https users:(("streamlink",pid=179032,fd=3))
ESTAB 0 0 192.168.178.99:55698 23.160.0.108:https users:(("streamlink",pid=179032,fd=5))
ESTAB 0 0 192.168.178.99:38932 185.42.205.214:https users:(("streamlink",pid=179032,fd=6))
8: 2021-12-02T20:48:15+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50814 23.160.0.254:https users:(("streamlink",pid=179032,fd=4))
ESTAB 0 0 192.168.178.99:38930 185.42.205.214:https users:(("streamlink",pid=179032,fd=7))
ESTAB 0 0 192.168.178.99:50738 151.101.14.167:https users:(("streamlink",pid=179032,fd=3))
ESTAB 0 0 192.168.178.99:55698 23.160.0.108:https users:(("streamlink",pid=179032,fd=5))
ESTAB 0 0 192.168.178.99:38932 185.42.205.214:https users:(("streamlink",pid=179032,fd=6))
9: 2021-12-02T20:48:16+01:00
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.178.99:50814 23.160.0.254:https users:(("streamlink",pid=179032,fd=4))
ESTAB 0 0 192.168.178.99:38930 185.42.205.214:https users:(("streamlink",pid=179032,fd=7))
ESTAB 0 0 192.168.178.99:50738 151.101.14.167:https users:(("streamlink",pid=179032,fd=3))
ESTAB 0 0 192.168.178.99:55698 23.160.0.108:https users:(("streamlink",pid=179032,fd=5))
ESTAB 0 0 192.168.178.99:38932 185.42.205.214:https users:(("streamlink",pid=179032,fd=6))
based on streamlink#4229 This fixes the phenomenon where during twitch stream prerolls, a lot of TCP connections are opened / closed rapidly, instead of the same one(s) being reused for sequential segments like during normal operation. The response data always needs to be read from the socket, otherwise the socket cannot be reused by other HTTP requests (hence the rapid closing/opening of connections during skipped segments)
This fixes the phenomenon where during twitch stream prerolls,
a lot of TCP connections are opened / closed rapidly,
instead of the same one(s) being reused for sequential segments
like during normal operation.
The response data always needs to be read from the socket,
otherwise the socket cannot be reused by other HTTP requests
(hence the rapid closing/opening of connections during skipped segments)