apernet / hysteria

Hysteria is a powerful, lightning fast and censorship resistant proxy.
https://v2.hysteria.network/
MIT License
15.16k stars 1.69k forks source link

tproxy模式下, 某些游戏更新情景易发生oom-killer #1211

Open CCCAUCHY opened 1 month ago

CCCAUCHY commented 1 month ago

描述问题 PS5上某些手游的游戏内更新易造成oom(共传输流量不足500MB), PS5系统更新或游戏下载/更新暂未发生oom(共传输流量10GB以上)

如何复现 不稳定复现

日志 image

Sun Sep 29 21:31:15 2024 daemon.notice netifd: Network device 'lan2' link is up
Sun Sep 29 21:31:15 2024 kern.info kernel: [600227.026401] nss-dp 3a001200.dp2 lan2: PHY Link up speed: 1000
Sun Sep 29 21:31:15 2024 kern.info kernel: [600227.026738] br-lan: port 2(lan2) entered blocking state
Sun Sep 29 21:31:15 2024 kern.info kernel: [600227.026753] br-lan: port 2(lan2) entered forwarding state
Sun Sep 29 21:32:13 2024 kern.warn kernel: [600285.233979] hysteria-linux- invoked oom-killer: gfp_mask=0x140dca(GFP_HIGHUSER_MOVABLE|__GFP_COMP|__GFP_ZERO), order=0, oom_score_adj=0
Sun Sep 29 21:32:13 2024 kern.warn kernel: [600285.234012] CPU: 3 PID: 19401 Comm: hysteria-linux- Tainted: G        W          6.1.100 #0
Sun Sep 29 21:32:13 2024 kern.warn kernel: [600285.234022] Hardware name: CMIOT AX18 (DT)

设备和操作系统 zn-m2, ipq6000, Linux KWrt 6.1.100

haruue commented 1 month ago

查了下 zn-m2 这个设备的参数, 总内存才 256MB, 这种设备上其实用个一百多 MB 就 oom 了, 并没有什么很好的办法。 可以试试把 Hysteria 跑在局域网里别的内存足够大的设备上, 再从这台 OpenWrt 用 socks5 协议连过去。 对于 PS5 这种允许手动配置 IP 和网关的需求, 也可以考虑旁路由的方案。 所需的内存和传输的数据量关系不大, 和应用程序同时打开的连接数关系比较大。

CCCAUCHY commented 1 month ago

查了下 zn-m2 这个设备的参数, 总内存才 256MB, 这种设备上其实用个一百多 MB 就 oom 了, 并没有什么很好的办法。 可以试试把 Hysteria 跑在局域网里别的内存足够大的设备上, 再从这台 OpenWrt 用 socks5 协议连过去。 对于 PS5 这种允许手动配置 IP 和网关的需求, 也可以考虑旁路由的方案。 所需的内存和传输的数据量关系不大, 和应用程序同时打开的连接数关系比较大。

可以限制连接数吗?

giveup commented 1 month ago

256内存设备的oom问题几乎无解。 ps5系统更新,可能使用的是直连策略,内存占用问题不明显(猜测可能是使用了Zero-Copy之类的技术) 游戏更新可能使用的是代理策略。建议调整域名规则,只让必要的域名才走代理。

CCCAUCHY commented 1 month ago

256内存设备的oom问题几乎无解。 ps5系统更新,可能使用的是直连策略,内存占用问题不明显(猜测可能是使用了Zero-Copy之类的技术) 游戏更新可能使用的是代理策略。建议调整域名规则,只让必要的域名才走代理。

没这个可能, 除了局域网地址都是全部代理的

mkevinstever commented 1 month ago

會在高負載的情形下OOM,對於hysteria來說,目前沒有合適的解決方案。

因為RAM使用量的管理依賴於 upstream 的 quic-go 項目。只要它做不好,基於它們開發的應用程式都會有問題。

於此相對應的是shadowsocks以及真實VPN的RAM管理都做的非常好,那是因為protocol部分在這些項目不依賴於其他地方。

以下是一個對比結果:

server: Ram: 2GB Cpu: 1CORE Disk: 20GB Network: 1000Mbps System environment: debian linux, kernel is 6.11.2-cloud Install method: directly install on host.

user load: 1 user
2048 connections
200mbps

hysteria: 一直不停地OOM CPU 20%~100%

ocserv: RAM使用量 32MB CPU 48%

openvpn: RAM使用率108MB CPU 70%

shadowsocks: RAM使用率 144MB CPU 20%~100%

haruue commented 1 month ago

@mkevinstever

於此相對應的是shadowsocks以及真實VPN的RAM管理都做的非常好,那是因為protocol部分在這些項目不依賴於其他地方。

Hysteria 是这样的。 L3 VPN 只需要把 IP 包加密解密之后无脑地转发出去就可以, Hysteria 要考虑的事情就很多了。

在用「真实的 VPN」的情况下, 比如 OpenVPN, 它只需要负责把所接收到包加密/解密之后, 转发出去, 然后这个包的内存就可以释放掉了, 至于接收端有没有真得收到这个包, 它不用管。

但是对于 Hysteria 而言, 它至少是需要为所承载的每个连接准备一个 buffer 用来存储一些数据, 只有当接收端确认收到了这些数据之后, 它才能把这些数据丢弃(释放内存), 否则, 它要保留这些数据用于重传。 其实即使是对于原版 Shadowsocks 这类不支持连接复用, 承载的每个连接都对应一个底层 TCP 连接的协议也是这样的, 只不过这个 buffer 从用户态转移到了内核里的 TCP 栈而已。

因此对于配置很差的设备, 用 L3 VPN 去连接配置足够的中转机(本地局域网里的机器也行), 在中转机上运行 Hysteria 来加速, 通常来说是一个解决方案。

mkevinstever commented 1 month ago

如果把我的測試結果寫成一個「段子」(中國大陸用詞),那麼來說就是這樣的:

Linux Host: 主人說要用我作為代理伺服器,我有32GB RAM可以分給你們,你們都能做何事?

OpenVPN: 我能負擔1000個使用者(每個使用者500條連線的情形下)哦,別看我小,身板可夠強!

shadowsocks: 想當年我可是健壯的很!即便是現在,我也能負擔1000個使用者呢!開啟UDP轉發的情況下,我也能負擔 750個人趴趴走。

ocserv: 你們都弱爆了!我每個使用者僅佔用17MB RAM,相對於你們,我能裝下的是海量!1926个人!這時每人還能跑100Mbps哦!

hysteria: 我...... 我只能負擔16個人全速使用.......

giveup commented 1 month ago

因此对于配置很差的设备, 用 L3 VPN 去连接配置足够的中转机(本地局域网里的机器也行), 在中转机上运行 Hysteria 来加速, 通常来说是一个解决方案。

我有过一些不严谨的测试,v2ray+ws+cdn VS hysteria2。hysteria2明显占用更多内存。当时我自己的理解是hysteria可能协议更复杂,需要更多的内存开销。客户端都是Mihomo。请问这种猜想是否正确呢?

CCCAUCHY commented 2 weeks ago

查了下 zn-m2 这个设备的参数, 总内存才 256MB, 这种设备上其实用个一百多 MB 就 oom 了, 并没有什么很好的办法。 可以试试把 Hysteria 跑在局域网里别的内存足够大的设备上, 再从这台 OpenWrt 用 socks5 协议连过去。 对于 PS5 这种允许手动配置 IP 和网关的需求, 也可以考虑旁路由的方案。 所需的内存和传输的数据量关系不大, 和应用程序同时打开的连接数关系比较大。

用其他性能更好的tun2socks或tproxy2socks软件代替hy2的tproxy入站能改善这个问题吗?