-
Notifications
You must be signed in to change notification settings - Fork 4.1k
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
希望能够优化一下内存占用 #68
Comments
这应该是默认 jsonem 导致的,你试试 v2ray-core v4.32.0+ 不过之前的相关报告大多来自华为的 arm64,amd64 上还是第一次听说 Linux x64 上,我们的测试结果是启动占 20MB |
看看 v2ray-core v4.29.x |
@RPRX 其实直接回复 BOT 好像也能回复 |
4.29.0没有问题,跟4.22.1表现一样。 |
看看 v2ray-core v4.31.3,这是默认 jsonem 前的最后一个版本 |
4.31.3也没有问题。 |
@RPRX 如果amd64架构也会出现的话,会不会是和jsonem加载某些设置有关. |
看起来默认 jsonem 前调用 v2ctl 是总体瞬时占内存但很快释放,默认 jsonem 后就要等 GC,等下传一个手动调用 GC 的版本 |
我也有一个内存占用的问题一直没看到有人说以为只有我遇到 |
Lines 81 to 82 in decb012
于是我发现,现在的代码中加载配置后已经主动触发 GC 了 |
@SekiBetu 比较奇怪的事情就是这部分内存最终会被释放,也不是内存泄漏。切片是一种可能,但配置文件占不了那么多内存。 |
@RPRX 明天我调试一下 Xray 看看吧 |
@RPRX 应该是读取配置文件的问题。我在红米ac2100(CPU:MT7621, RAM:128MB)上如果用xray读取json配置文件启动,一会就out of memory被killed了,如果把json配置文件转成pb格式,启动时消耗的内存明显要小不少并可以成功启动,所以应该是在parse json文件的时候占用的内存较大。 |
加了行 Xray-windows-64.zip |
在这行后加的,原因是 |
这边进行了一些测试,发现问题不在 JSON,在 geofile 上,详情如下: 我在 Windows 上用简单的配置运行 Xray,观察到它只占了不到 5MB 的内存(群友也是这样),与你的情况完全不同。结合之前一直有的疑惑“加载个 JSON 为什么占那么多内存?”,遂想到 jsonem 还有加载转换 geofile 的功能,于是简单改了改配置以使用它们,可以看到此时 Xray 刚启动时会占较多的内存,并逐渐减到 10MB 多,与你的情况大致相符。 若使用我刚刚上传的 而对于接受不了瞬时内存占用的设备,比如一些硬路由,建议使用传统方式:先转 pb。我会在下个版本的 release note 中详细说明。 |
@RPRX 破案了.... |
@RPRX 确实,如果不配置routing,内存使用较小,如果routing里加载了geofile的话在parse的阶段就out of memory了。感谢debug。 |
@vangork 试试刚刚上传的测试版本,直接加载 json 和 .dat 还会不会被 kill |
此版本没有问题了。 |
@RPRX ,试了,依旧会被kill,估计是128MB RAM不够用。 在运行xray之前,路由有76MB的空闲RAM。 成功运行xray加载pb格式的配置文件并平稳运行后,内存剩余24MB,可见xray占用52MB左右RAM。 刷的openwrt官方的snapshot版本没有swap分区。 |
@vangork 好的,看来这种设备上需要先转 pb 了 |
不过我还是很疑惑为什么转换JSON和GEOFILE需要申请这么多内存...... |
@timi-owo 只是加载转换 geofile 的问题,与 JSON 无关 |
可能是吧,问题应该就在于 GC 后没有立即 FREE 掉还给 OS 导致部分内存有限的设备容易 OOM 猜测是 Go 内存管理里的一种内存池机制,不过好在可以 刚试图看了一下 geofile 结构和相关路由模块的代码,发现有点读不懂哈哈,等我学会了 Go 再来贡献代码吧。 我觉得 geofile 有改进空间,或许可以不用 protobuf,但牵扯到的相关模块也要改。 还要考虑日渐增长的数据量和 routing 处理性能,以及历史数据的升级,改动量应该不小,还是个 breaking change。 目前大佬们的重心还是在协议和传输这一块,毕竟这个才是 Project V / Project X 的灵魂。 真的很感谢这个伟大的项目,除了用来翻墙还有很多实用的地方,简直神器。 |
由于 geoip.dat 比较大,所以我特意去看了下加载它的代码(也不至于占上百 MB 吧?),果然发现了问题: Xray-core/infra/conf/router.go Lines 329 to 346 in 2e942e0
Xray-core/infra/conf/router.go Lines 150 to 171 in 2e942e0
对于路由规则内的每一个 不用怀疑, 所以,我决定重写这部分代码。 |
请问对服务端也有效吗? |
@RPRX 感谢,可以使用。 |
@vangork 有观察到瞬时内存占多少吗 |
@RPRX, 当前版本 PS: From: https://ewx.livejournal.com/579283.html |
@SekiBetu 你试试这个版本 #68 (comment) |
我又拿第四个版本过来测了一遍 我的想法是,取最高值,因为采样率是一秒一次,很可能后两次没有采到最高峰,采到了上升期或者下降期的70mb的数值 |
@SekiBetu 结论不正确,我的猜想是你用到了几乎所有规则(比如除 CN 外),所以没有明显区别,这取决于具体的配置文件 |
我用的规则配置是geoip:cn、private和geosite:cn、private是direct,然后geosite:category-ads-all是block |
@SekiBetu 试试下面的版本,因为不太科学(或许是 CN 占很大一部分?) |
新的最终版:默认关闭的缓存机制 + 预解析 pb 结构 #68 (comment) 只 Unmarshal 需要的部分 + 多次主动 GC + FreeOSMemory 这个版本应该最省内存了,望得到广泛测试。如果没有问题,等下提交代码。 Xray-android-arm64-v8a.zip |
mips32le 占用内存 16M左右,比之前好多了 |
@RPRX 完美 |
GitHub 上和 Project X 群反馈均很理想,代码已提交 45f44c4 , #68 (comment) 的文件均 Reproducible 这大幅降低了启动时的瞬时内存占用,并小幅降低了启动后的最终内存占用。 感谢此 issue 及各位的多次测试,现在解决了默认内部加载配置带来的问题,预解析 pb 结构更是让更多的设备可以直接加载配置。 |
测试结果完美,结案,撒花. |
期待发版!我的小内存arm开发板,正遇到这个问题. |
64M RAM WORK |
想问问以前的版本也可以吗? |
24047 1 proxy S 4803m 994% 0% xray -c /root/xray.json 这个问题有完全解决了吗?x64路由跑了13天, 占用近5G。 xray versionXray 1.5.3 (Xray, Penetrates Everything.) OpenWrt (go1.17.6 linux/amd64) |
docker 里一样 out of memory killed process xxxx (xray) total-vm:6627100KB,anon-rss:253404KB |
x64一样, /tmp/etc/passwall/bin/xray run -c /tmp/etc/passwall/TCP_SOCKS.json消耗了全部的memory,4GB,内存占用肉眼可见增加 |
如题,从古老的v2ray 4.22.1版本升级过来的,几乎同样配置的情况下,
之前的版本开机占用≈10m,现在的版本开机占用>60m,一段时间后才能勉强恢复正常(<20m)。
windows-amd64平台,作为客户端,服务器上(linux-amd64)也有内存占用过大的问题。
The text was updated successfully, but these errors were encountered: