V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
autulin
V2EX  ›  Windows

win10 使用 SS+PAC 规则本身很耗费资源?还是 PAC 规则有问题?请大神帮忙看看

  •  
  •   autulin · 2016-11-26 20:19:01 +08:00 · 2453 次点击
    这是一个创建于 2679 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为了给笔记本省电,准备使用 Edge 浏览器+SS+PAC 代理规则来优雅的实现科学上网,同时由于要利用 IPV6 来节省校园网流量,于是根据使用的 ipv6 的 hosts 修改出了这份白名单 PAC 规则( https://raw.githubusercontent.com/autulin/update-ipv6-hosts-and-generate-proxy-whitelist/41197d5ddcd513991dd685f33a5f9064f9badd33/pac.txt ),但是在使用后发现, SS 使用 PAC 规则时,进程中的 svchosts.exe 进程资源占用会特别的大(内存占用 100MB-600MB 之间, CPU 偶尔 60%-90%之间跳动),这个在另外一台 win10 上也成功复现,所以来请教大神,是 win10 使用 SS+PAC 规则本身很耗费资源?还是我这个 PAC 规则有问题?不是很懂 PAC 的底层实现原理,不知道有什么解决办法吗?

    第 1 条附言  ·  2016-11-26 21:48:34 +08:00
    解释一下为什么规则里面很多二级域名吧:
    我这个 PAC 规则里面的网址都是用 py 自动从 hosts 里面提取出来的,涉及到的域名很多,手动用正则来描述这些域名的确可以节省规则条数,但是人工的工作量太大,也精简不了多少条,所以索性是目前现在这个样子。

    但是我在 Chrome 的 SwitchOmega 或者 Firefox 的 AutoProxy 插件之中用这同样的规则做了一套 AutoProxy 的规则( https://github.com/autulin/update-ipv6-hosts-and-generate-proxy-whitelist/raw/master/autoproxy-whitelist-for-byr.txt ),并没有什么性能上的问题。我想可能对于 PAC 规则来说,系统在执行上是作为 JavaScript 来看待的?效率还是比较低的。
    第 2 条附言  ·  2016-11-26 22:15:17 +08:00
    刚试了一下,使用 SS 自带的“从 GFWList 更新本地 PAC ”获取的 PAC ,也会出现同样的现象,只是资源占用少了一点而已
    第 3 条附言  ·  2016-12-07 15:17:39 +08:00
    今天无意间发现 @Daniel65536 大神的 mono_pac( https://github.com/blackgear/mono_pac)
    看完之后豁然开朗,学习了
    13 条回复    2016-11-27 03:37:13 +08:00
    xupefei
        1
    xupefei  
       2016-11-26 20:23:07 +08:00
    我大概看了看,你这个是 O(n) 复杂度吧?

    Edge 为什么不用 AdBlock 或 uBlock (暂未上架,需手工安装 https://github.com/nikrolls/uBlock-Edge )呢?
    vugusurk
        2
    vugusurk  
       2016-11-26 20:25:56 +08:00
    LZ 听说过正则吗
    autulin
        3
    autulin  
    OP
       2016-11-26 20:28:37 +08:00
    @xupefei AdBlock 和 uBlock 是屏蔽广告的吧,能实现 proxy 规则?


    @vugusurk 听过啊,所以在这里有啥妙用?请赐教
    autulin
        4
    autulin  
    OP
       2016-11-26 20:40:31 +08:00
    不知道为啥不能 append 主题,我解释一下为什么没有用正则表达式来涉及这些规则:
    我这个 PAC 规则里面的网址都是用 py 自动从 hosts 里面提取出来的,涉及到的域名很多,手动用正则来描述这些域名的确可以节省规则条数,但是人工的工作量太大,所以是目前现在这个样子。

    但是我在 Chrome 的 SwitchOmega 或者 Firefox 的 AutoProxy 插件之中用这同样的规则做了一套 AutoProxy 的规则( https://github.com/autulin/update-ipv6-hosts-and-generate-proxy-whitelist/raw/master/autoproxy-whitelist-for-byr.txt ),并没有什么性能上的问题。我想可能对于 PAC 规则来说,系统在执行上本身没有什么优化吧。
    @xupefei
    @vugusurk
    bellchu
        5
    bellchu  
       2016-11-26 20:52:05 +08:00 via iPad   ❤️ 1
    function FindProxyForURL(url, host) {

    // If the hostname matches, send direct.
    if ( shExpMatch(host, "(*.taobao.com|taobao.com)") ||
    shExpMatch(host, "(*.wechat.com|wechat.com)"))
    return "DIRECT";

    // If the requested website is hosted within the internal network, send direct.
    if (isPlainHostName(host) ||
    shExpMatch(host, "*.local") ||
    isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") ||
    isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") ||
    isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0") ||
    isInNet(dnsResolve(host), "111.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "123.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "180.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "220.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "103.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "205.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "140.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "110.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "202.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "211.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "117.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "42.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "103.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "125.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "61.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "203.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "123.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "140.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "219.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "119.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "182.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "192.100.0.0", "255.255.0.0") ||
    isInNet(dnsResolve(host), "14.0.0.0", "255.0.0.0"))
    return "DIRECT";


    // DEFAULT RULE: All other traffic, use below proxies, in fail-over order.
    return "PROXY 127.0.0.1:1080";

    }



    自己微调吧,虽然我不用 SS ,但这是标谁格式,肯定能用,这么短,可以避免一些麻烦。
    autulin
        6
    autulin  
    OP
       2016-11-26 21:01:15 +08:00
    @bellchu
    嗯,我找时间试试看这种形式性能会不会高一点,不过你可以看我需要的白名单域名那么多,感觉这里会还是会很长很长啊

    // If the hostname matches, send direct.
    if ( shExpMatch(host, "(*.taobao.com|taobao.com)") ||
    shExpMatch(host, "(*.wechat.com|wechat.com)"))
    return "DIRECT";
    bellchu
        7
    bellchu  
       2016-11-26 21:37:33 +08:00 via iPhone
    我这个 pac 基本靠 DNS 解析来,域名那块请忽略。
    @autulin
    Tink
        8
    Tink  
       2016-11-26 21:38:37 +08:00
    讲道理你这个还不如直接用主域名呢
    autulin
        9
    autulin  
    OP
       2016-11-26 21:49:55 +08:00
    @Tink 域名都是用 py 从 hosts 啪出来的,没做什么优化,不过就算用主域名,数量也不少吧?
    Tink
        10
    Tink  
       2016-11-26 21:57:25 +08:00
    @autulin 还行,并不大
    fhbyljj
        11
    fhbyljj  
       2016-11-26 22:23:55 +08:00 via Android
    @xupefei 这货也可以??
    favtony
        12
    favtony  
       2016-11-27 00:12:48 +08:00 via Android
    个人觉得可能是 win10 某个服务不支持 pac 导致出 bug 了一直占用 cpu...
    AASW2ss
        13
    AASW2ss  
       2016-11-27 03:37:13 +08:00
    @xupefei 感谢 edge 装了 ublock 终于清爽了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3036 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 14:39 · PVG 22:39 · LAX 07:39 · JFK 10:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.