Skip to content
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

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

Open
CCCAUCHY opened this issue Sep 30, 2024 · 9 comments
Open

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

CCCAUCHY opened this issue Sep 30, 2024 · 9 comments
Labels
bug Something isn't working

Comments

@CCCAUCHY
Copy link

描述问题
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

@CCCAUCHY CCCAUCHY added the bug Something isn't working label Sep 30, 2024
@haruue
Copy link
Collaborator

haruue commented Sep 30, 2024

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

@CCCAUCHY
Copy link
Author

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

可以限制连接数吗?

@giveup
Copy link

giveup commented Oct 2, 2024

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

@CCCAUCHY
Copy link
Author

CCCAUCHY commented Oct 3, 2024

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

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

@mkevinstever
Copy link

會在高負載的情形下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
Copy link
Collaborator

haruue commented Oct 24, 2024

@mkevinstever

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

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

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

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

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

@mkevinstever
Copy link

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

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

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

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

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

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

@giveup
Copy link

giveup commented Oct 25, 2024

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

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

@CCCAUCHY
Copy link
Author

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

4 participants