ios qx 耗电量好大,是真是假

2021-09-30 11:21:18 +08:00
 ikn0wzxc

习惯性后台一直挂着,看了一下耗电量排名前三甲,后台使用时长很长,这个耗电量准确吗,有没有小伙伴现身说法一下?

17221 次点击
所在节点    iOS
33 条回复
vocaloidchina
2021-10-02 08:52:18 +08:00
个人感觉肯定会费电一点,你跑代理使用的协议还要加密解密啥的肯定会耗电
sephinh
2021-10-02 12:26:36 +08:00
啥时候支持 vless 啊
Cairetina
2021-10-02 13:18:06 +08:00
会大幅增加耗电,因为不论使用本地代理 loopback 还是 tun 网卡接管,数据包组装好后会在内核态到用户态绕一圈到代理软件再经过用户态到内核态送到物理网卡,期间会增加多次上下文切换和数据拷贝,之前无聊做过测试,最坏的情况会让 CPU 的负载翻倍不止,特别是对于 QX 这种完全使用 tun 网卡接管的方案,比本地代理 loopback 开销还要大很多
Cairetina
2021-10-02 13:26:38 +08:00
@Cairetina 这还只是纯直连,走代理的话还要额外算上加密解密和规则审计还有协议本身的开销,本地代理和 tun 并不适合低功耗高性能的场景,选择开启就意味着放弃正常的续航,这没办法
zhuangku556
2021-10-02 17:12:26 +08:00
这个问题我只在 iPad 上有感知,如果我不在路由端翻墙,那么 iPad 挂着小火箭或者圈 X,待机 3-4 天就空了。而如果不开的话,甚至待机半个月还有电。

iPhone 上没那么明显,本来就使用频率高,能耗高,反正至少每天一冲。
crownzzz
2021-10-04 08:21:41 +08:00
实测 13pro 待机情况下,qx 是 loon 耗电量的 3-4 倍…不知道什么情况
ikn0wzxc
2021-10-05 12:06:39 +08:00
@Cairetina 你这个分析的很有道理,CPU 负载确实会增加很多
qiaoqiao1235
2021-11-02 09:37:29 +08:00
参考了 surge 的说明文档,qx 应该用的是方法 2 ,需要对协议栈重组,会有额外的性能开销。

https://manual.nssurge.com/book/understanding-surge/cn/

在 macOS 和 iOS 下,要想使程序发出的网络连接被另一个程序所接管,而不是直接将数据发送到物理网卡,有以下三种方式:

配置代理:如果系统配置了代理服务器,那么程序在执行网络请求的时候,就不会直接连接目标服务器,而是产生一个发向代理服务器的连接。利用这个特性,可以在本地启动一个代理服务,并配置系统代理为 127.0.0.1 (即本机)的一个端口,这样就可以接管网络请求。
但是,这种方式要求程序自身支持代理机制,系统的代理设置只是告知程序应该使用代理,需要程序自己完成代理的后续逻辑。好在,对于绝大部分带用户界面的程序,由于开发时使用了系统的高层网络框架( Cocoa/Cocoa Touch ),开发者不需要进行任何额外的工作就可以支持代理。

而对于命令行程序,由于使用的是 POSIX 接口进行网络请求,该接口并没有对代理服务器提供内嵌支持,所以需要开发者自己完成对代理服务器的支持,这导致各种命令行程序对代理的支持情况和具体行为并不统一。同时由于大部分命令行程序并没有为 macOS 进行特殊处理,所以不会理会系统配置里的代理服务器设置。大部分命令行程序需要通过环境变量 https_proxy 和 http_proxy 去配置代理,还有一部分需要通过修改配置文件进行配置。

还有少量程序由于完全缺乏代理服务器的支持,无法通过这种方式去接管网络连接。

虚拟网卡( Virtual Network Interface ,简写为 VIF ):主流操作系统几乎都存在 TUN 和 TAP 两种虚拟网卡接口,原本是为了提供对 VPN 的支持。通过在系统中建立虚拟网卡并配置全局路由表,可以接管所有的网络请求。
这种方式对应程序来说是无感知的,所以并不需要程序主动提供支持,几乎所有程序都可以被这种方式接管网络请求。除非程序主动指定了物理网卡,绕过了默认的虚拟网卡。

Socket Filter:这是 macOS 的一项内核特性,可以通过注入一个 Kernel Extension ( kext )对所有 socket 调用进行 hook ,以此接管请求。
除系统自身的一些程序外,这种方式可以强制接管系统中所有程序的所有网络请求。如 Proxifier 和 Little Snitch 就使用了这种方式接管网络。

这三种方式各有优劣:

方法 1 性能最优,对系统侵入性最小,无奈有部分程序不支持。

方法 2 性能略低,因为截取到的流量是 IP 层的数据包,需要有一个 TCP 协议栈进行重组装,造成了额外的性能开销。

方式 3 最暴力,对系统侵入性高,Kernel Extension 有可能造成整个系统的不稳定,Apple 已确认在未来的 macOS 中将取消对 Socket Filter 的支持。
Cairetina
2021-11-12 16:18:57 +08:00
@qiaoqiao1235 方法一的性能最优其实是作为系统代理配置远程代理时是最优的,但 Surge 是本地代理,额外增加的一次内核态到用户态,用户态到内核态数据拷贝以及上下文切换还是绕不开,性能和引入的 CPU 负载同样是不理想的,相比方法 3 仅仅是使用 loopback 接口 MTU 相比 TUN 更大带来的一些性能优势而已,并不是大头,所以其实半斤八两
Cairetina
2021-11-12 16:20:23 +08:00
@Cairetina 方法 3 -> 方法 2
qiaoqiao1235
2021-11-12 16:24:35 +08:00
@Cairetina #29 感谢,学习了😁
Love4Taylor
2021-12-15 07:51:59 +08:00
@Cairetina network framework 呢,看 Surge 说明是用户态网络栈?
Cairetina
2021-12-15 18:28:45 +08:00
@Love4Taylor 只减少了 Surge 从 tun 接管流量后再发送到物理网卡中间的一次上下文切换和数据拷贝,但相比直接连接依然多一次 tun/loopback 到用户空间,而且经过测试负载没有明显下降

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/805362

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX