Billyzou0741326 / bilibili-live-monitor-ts

bilibili - b站直播监控
https://billyzou0741326.github.io/bilibili-live-monitor-ts/
MIT License
28 stars 4 forks source link

[Windows]使用nodejs运行一段时间后会出现大量的Http request aborted和Http request errored错误 #20

Open Sonic853 opened 4 years ago

Sonic853 commented 4 years ago

BUG表现: 使用nodejs运行一段时间后会出现以下的报错内容: 大多数报错内容: Bilibili.getRoomsInArea - Http request aborted Bilibili.getRoomsInArea - Http request errored 以下报错为少量出现: RoomidHandler - Http request errored Bilibili.getLiveCount - Http request errored

在Windows Server 2016下运行一段时间会自动关闭远程桌面, 如果在Windows 10下运行一段时间会出现浏览器无法正常使用。

复现: 在Windows Server 2016安装nodejs 12.16.1, 使用git下载bilibili-live-monitor-ts后,按照README.md内容运行服务, 在Windows 10下配置BiliBiliHelper的配置文件后运行,连接到在Windows Server 2016下的bilibili-live-monitor-ts, 等待一段时间(大约10-30分钟左右 报错。

截图 Snipaste_2020-02-21_03-17-07 Snipaste_2020-02-21_03-17-42 Snipaste_2020-02-21_03-17-58

期待的表现 无报错。

运行环境: Windows Server 2016 云主机 2G运行内存,Windows 10 1909 32G运行内存

额外信息 未检查代码,初期预测可能是使用了太多的端口导致以上现象?运行了“netstat -ano”命令看看端口占用,发现用nodejs运行bilibili-live-monitor-ts后还真是建立了一大堆端口并保持在“ESTABLISHED”状态。。。

Billyzou0741326 commented 4 years ago

嗯 弹幕收集确实是需要建立大量tcp保持长线连接 前段时间观察过 windows连接数上1w之后就有很明显的影响了 但最后没得出什么结论 不了了之了

有条件的话换Linux跑吧...

PS windows有一系列registry设定,可能影响到底层socket的性能... 我没深究过 不过可以看下https://docs.microsoft.com/en-us/biztalk/technical-guides/settings-that-can-be-modified-to-improve-network-performance

Billyzou0741326 commented 4 years ago

未测试能否切实解决问题

  1. Win-R打开run界面
  2. 输入regedit打开Registry Editor
  3. 一路打开目录 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
  4. 右键 new -> DWORD (32-bit) Value
  5. 命名为 TcpTimedWaitDelay
  6. 右键 TcpTimedWaitDelay,选Modify
  7. Base那一栏选Decimal (10进制),输入框写30吧(数值区见下表)
  8. 设置完成

欢迎反馈测试结果(我这边静态房间数压了挺久了 低峰期拿不出16000来测)

TcpTimedWaitDelay Data Range

Windows Server 2012 and earlier: 30-300 (decimal) Windows 8 and earlier: 30-300 (decimal) Windows Server 2012 R2 and later: 2-300 (decimal) Windows 8.1 and later: 2-300 (decimal)

Billyzou0741326 commented 4 years ago

已测无效

Billyzou0741326 commented 4 years ago

另一个可能性是端口不够用于建立新的socket windows默认仅使用49152向上的端口建立连接 因此实际可用的只有16000个左右 详情

未测试能否切实解决问题

  1. 以管理员权限运行powershell或者cmd
  2. netsh int ipv4 show dynamicport tcp 查看可用起始端口及实际可用数量
  3. netsh int ipv4 set dynamicport tcp start=1025 num=64511 设置起始1025,由此向上64511

可以跟上面那个方法一起用 看看能不能解决吧

Sonic853 commented 4 years ago

另一个可能性是端口不够用于建立新的socket windows默认仅使用49152向上的端口建立连接 因此实际可用的只有16000个左右 详情

未测试能否切实解决问题

  1. 以管理员权限运行_powershell_或者cmd
  2. netsh int ipv4 show dynamicport tcp 查看可用起始端口及实际可用数量
  3. netsh int ipv4 set dynamicport tcp start=10000 num=55535 设置起始10000,由此向上55535

可以跟上面那个方法一起用 看看能不能解决吧

照着命令给Server敲完了,睡一觉起来再看看 先谢谢了(

Billyzou0741326 commented 4 years ago

晚安2333

Sonic853 commented 4 years ago

经过两天观察 不像之前频繁了,但是在高峰期(在下午到凌晨?)仍旧会出现这种情况,还是有时间买个小主机装Linux再运行吧(

Billyzou0741326 commented 4 years ago

诶 还是没法完全解决吗…

Sonic853 commented 4 years ago

诶 还是没法完全解决吗…

Windows的话暂时没法完全解决。

今天试着用虚拟机里的ArchLinux、安卓7.1.2的Termux、树莓派(Ubuntu Mate)运行,还没开始几分钟就报错,看上去还没Windows Server 2016稳定(没按照文档放开Linux的连接数限制 拿同学的云主机(Ubuntu)挂上去了,目前看上去没有问题(同学的云主机差个10天到期

Billyzou0741326 commented 4 years ago

Linux的nofile限制要上调的

Billyzou0741326 commented 4 years ago

修改完/etc/security/limits.conf后重新登录命令行 ulimit -n可以查看当前nofile的上限

Sonic853 commented 4 years ago

翻了翻文档才发现orz 我给linux加上去

Billyzou0741326 commented 4 years ago

不太确定Termux有没有limits.conf... 我没测试过2333