v2ray / v2ray-core

A platform for building proxies to bypass network restrictions.
https://www.v2ray.com/
MIT License
45.43k stars 8.95k forks source link

客户端内存泄漏?(3.22 h2 + vmess + http&socks5 on client) #1126

Closed bash99 closed 5 years ago

bash99 commented 6 years ago

1) 你正在使用哪个版本的 V2Ray?(如果服务器和客户端使用了不同版本,请注明) 3.22 2) 你的使用场景是什么?比如使用 Chrome 通过 Socks/VMess 代理观看 YouTube 视频。 内部访问外网(主要是google搜索及github,stockoverflow等);用haproxy均衡,用haproxy的tcpcheck检查代理是否正常(15秒一次) 3) 你看到的不正常的现象是什么?(请描述具体现象,比如访问超时,TLS 证书错误等) 客户端内存达到 1G 13447 root 20 0 1409324 1.325g 9780 S 0.3 2.1 115:22.41 v2ray
10119 root 20 0 3037052 1.122g 11908 S 0.7 1.8 219:31.52 kvm
7699 root 20 0 1141880 1.012g 9088 S 0.0 1.6 27:48.75 v2ray
28197 root 20 0 1084544 0.993g 9340 S 0.0 1.6 24:11.77 v2ray
7703 root 20 0 1047808 965164 9312 S 0.0 1.5 27:15.62 v2ray
4) 你期待看到的正确表现是怎样的? 客户端占用不多,因为haproxy的statics report显示单个v2ray的最大session不超过8.

5) 请附上你的配置(提交 Issue 前请隐藏服务器端IP地址)。 服务器端配置:

因为链接正常,服务器内存使用正常,忽略
客户端配置:
{
  "log": {
    "loglevel": "warning"
  },
  "inbound": {
    "port": 31773,
    "listen": "0.0.0.0",
    "protocol": "http",
    "settings": {
      "auth": "noauth"
    }
  },
  "outbound": {
    "protocol": "vmess",
    "tag": "cow",
    "settings": {
      "vnext": [
        {
          "address": "my-server",
          "port": 443,
          "users": [
            {
              "id": "my-uuid",
              "alterId": 64
            }
          ]
        }
      ]
    },
    "mux": {
      "enabled": false
    },
    "streamSettings": {
      "network": "h2",
      "security": "tls",
      "kcpSettings": null,
      "httpSettings": {
        "host": [
            "my-server"
        ],
        "path": "/my.path"
      },
      "tcpSettings": null,
      "tlsSettings": {
      }
    }
  },
  "outboundDetour": [
    {
      "protocol": "freedom",
      "settings": {},
      "tag": "direct"
    }
  ],
  "dns": {
    "servers": [
      "9.9.9.9", // Quad-9 public dns
      "180.76.76.76", // Baidu public dns
      "localhost"
    ]
  },
  "routing": {
    "strategy": "rules",
    "settings": {
      "domainStrategy": "IPIfNonMatch",
      "rules": [
        {
          "type": "field",
          "port": "1-52",
          "outboundTag": "direct"
        },
        {
          "type": "field",
          "port": "54-79",
          "outboundTag": "direct"
        },
        {
          "type": "field",
          "port": "81-442",
          "outboundTag": "direct"
        },
        {
          "type": "field",
          "port": "444-51519",
          "outboundTag": "direct"
        },
        {
          "type": "field",
          "port": "51541-65535",
          "outboundTag": "direct"
        },
        {
          "type": "chinasites",
          "outboundTag": "direct"
        },
        {
          "type": "field",
          "ip": [
            "0.0.0.0/8",
            "10.0.0.0/8",
            "100.64.0.0/10",
            "127.0.0.0/8",
            "169.254.0.0/16",
            "172.16.0.0/12",
            "192.0.0.0/24",
            "192.0.2.0/24",
            "192.168.0.0/16",
            "198.18.0.0/15",
            "198.51.100.0/24",
            "203.0.113.0/24",
            "::1/128",
            "fc00::/7",
            "fe80::/10"
          ],
          "outboundTag": "direct"
        },
        {
          "type": "chinaip",
          "outboundTag": "direct"
        }
      ]
    }
  }
}

6) 请附上出错时软件输出的错误日志。在 Linux 中,日志通常在 /var/log/v2ray/error.log 文件中。

服务器端错误日志:
没错误
客户端错误日志:
2018/05/08 19:10:12 127.0.0.1:54177 accepted http://google.com/generate_204  
2018/05/08 19:10:13 [Warning] [2020019026] App|Proxyman|Inbound: connection ends > Proxy|HTTP: connection ends > Proxy|HTTP: failed to write response > write tcp 127.0.0.1:31786->127.0.0.1:54177: write: connection reset by peer

7) 请附上访问日志。在 Linux 中,日志通常在 /var/log/v2ray/access.log 文件中。

没错误

8) 其它相关的配置文件(如 Nginx)和相关日志。 haproxy tcpcheck part

listen v2ray_http
    bind 127.0.0.1:3001
    mode tcp
    option tcp-check
    tcp-check send GET\ http://google.com/generate_204\ HTTP/1.0\r\n
    tcp-check send Host:\ google.com\r\n
    tcp-check send User-Agent:\ curl/7.52.1\r\n
    tcp-check send Accept:\ */*\r\n
    tcp-check send \r\n
    tcp-check expect rstring ^HTTP/1.[1|0]\ 204
    balance leastconn
    timeout server 600000
    timeout client 600000
    timeout check 9000
    timeout connect 3000

9) 如果 V2Ray 无法启动,请附上 --test 输出。 正常

10) 如果 V2Ray 服务运行不正常,请附上 journal 日志。 正常

bash99 commented 6 years ago

此外,刚刚更新到3.24版本,准备观察一下。

ghost commented 6 years ago

一直会缓慢泄漏,3.24也没有解决 跟 #1096 应该是一个问题

"policy": { "levels": { "0": { "uplinkOnly": 0, "downlinkOnly": 0, "bufferSize": 0, "connIdle": 30 } }

即便都各种策略都配上了,还是会缓慢泄漏

bash99 commented 6 years ago

另外一个发现,我尝试把某个h2+vmess换成mkcp+vmess,泄漏速度大大加快了

    "streamSettings": {
      "network": "kcp",
      "kcpSettings": {
        "uplinkCapacity": 1,
        "downlinkCapacity": 100,
        "readBufferSize": 2,
        "mtu": 1350,
        "header": {
          "type": "wechat-video",
          "request": null,
          "response": null
        },
        "tti": 100,
        "congestion": true,
        "writeBufferSize": 2
      },
      "wsSettings": null,
      "tcpSettings": null,
      "tlsSettings": {},
      "security": ""
    },
DarienRaymond commented 6 years ago

请计算一下内存的增长率,方法如下:

  1. 把服务器静置十分钟,即没有任何客户端连接;
  2. 登上服务器记录V2Ray的内存占用;
  3. 正常使用半天到一天时间;
  4. 重复 1 和 2 再记录一下V2Ray的内存占用;

当然如果有工具记录线性的内存数据就更好了。

bash99 commented 6 years ago

@DarienRaymond ps aux | grep v2ray的输出 75520K 一天之后 129792K 下次计算可能要等到下周一了

ghost commented 6 years ago

换到3.18,2小时确实没有明显泄漏了,我再观察下

ghost commented 6 years ago

基本可以断定3.18没有内存泄漏问题,相同的配置(#1124)和使用环境,8小时过去之后,内存占用基本没有什么变化,3.24会不断上涨

24小时后更新:3.18无内存泄漏问题,内存占用稳定

bash99 commented 6 years ago

到了周一 325244K @DarienRaymond 采用mkcp协议的某个进程上升得特别快 677516K

DarienRaymond commented 6 years ago

请试用一下 3.24.1

huhongbo commented 6 years ago

@DarienRaymond 我用master代码做了测试,我的配置是websocket , 所以得到下面的是内存存在问题 flat flat% sum% cum cum% 9751.41kB 25.52% 25.52% 9751.41kB 25.52% type..RA+Kt61U 8108.31kB 21.22% 46.75% 8108.31kB 21.22% crypto/x509.(Certificate).buildChains 3623.22kB 9.48% 56.23% 3623.22kB 9.48% runtime.persistentalloc1 3416.06kB 8.94% 65.17% 3416.06kB 8.94% crypto/tls.(clientHandshakeState).doFullHandshake 2971.49kB 7.78% 72.95% 2971.49kB 7.78% encoding/asn1.parseUTCTime 1936.64kB 5.07% 78.02% 1936.64kB 5.07% v2ray.com/core/common/protocol/tls/cert.init 1751.28kB 4.58% 82.60% 9170.46kB 24.00% crypto/x509.buildExtensions 1490.75kB 3.90% 86.51% 35439.25kB 92.76% crypto/tls.(serverHandshakeState).sendFinished 931.44kB 2.44% 88.94% 931.44kB 2.44% crypto/tls.(serverHandshakeState).sendSessionTicket 921.80kB 2.41% 91.36% 9439.44kB 24.71% crypto/x509.parseSANExtension.func1

image

ghost commented 6 years ago

3.24.1 内存泄漏问题有缓解(增长速度变慢),但没有彻底解决,还是会增长(3.18稳定在一个区间内不增长)

lededev commented 6 years ago

可否实现一个C语言的版本,小闪存的路由器没法装得下GO程序,而且C语言程序的内存泄漏至少是可检测可修复的。

bash99 commented 6 years ago

@DarienRaymond 如同@moetakaoruko 所说,问题缓解但仍然存在

root 22626 0.1 0.2 168960 135740 ? Sl 6月05 2:25 ./v2ray -config config_gw3.json root 22631 0.3 0.3 270688 252396 ? Sl 6月05 8:56 ./v2ray -config config_2016.json

eycorsican commented 6 years ago

如果会自己编译 v2ray-core,而且能重现内存泄漏、goroutine 泄漏问题的话,可以试一下用下面这个分支,这个分支版本定时把一些有助于调试排查的信息写入运行目录中的 profile.log:

https://github.com/eycorsican/v2ray-core/tree/pprof

还可以使用以下方式运行,打印出更多的调试信息:

GODEBUG=gctrace=1 ./v2ray -config config.json
huhongbo commented 6 years ago

@eycorsican 编译会,但对go profile不会分析,内存泄漏是一定的,但我找不出来,在没有使用v2ray只是后台运行在那里,基本没有流量的情况下,运行五个小时左右 起始 gc 1 @2.449s 0%: 0.091+2.4+0.25 ms clock, 0.36+0.48/2.2/2.4+1.0 ms cpu, 4->4->1 MB, 5 MB goal, 4 P 到 gc 151 @13487.489s 0%: 0.016+33+0.71 ms clock, 0.067+4.2/33/52+2.8 ms cpu, 78->80->38 MB, 80 MB goal, 4 P profile.log的gorouting看不太懂 https://gist.github.com/huhongbo/08dcec7fbef83601a359c3bc005bb2da

eycorsican commented 6 years ago

@huhongbo 你发的 profile.log 是文件头的片段还是文件尾的片段?我没看出什么问题,如果方便的话你可以再试下用下面这个 policy 配置,运行到你认为出现内存泄漏后,把代理静置几分钟,最好撤掉系统代理设置,保证没有连接再进 Core,然后再把 profile.log 的信息发一下。

"policy": {
"levels": {
"0": {
"uplinkOnly": 0,
"downlinkOnly": 0,
"bufferSize": 0,
"connIdle": 30
}
}
huhongbo commented 6 years ago

上面那个profile.log是尾,另外把buffer关了好像内存没问题,至少不显著,继续关注,但buffer内存是不回收的? https://gist.github.com/huhongbo/f557ada8c62179b839c43d624bd2fbbe @eycorsican

ghost commented 6 years ago

@huhongbo 观测时间不够吧,buffer我设了0还是会泄漏的

huhongbo commented 6 years ago

我看了下还是会增长的,曲线又掉头向下... ^_^,前面那条平的曲线就是3.18版本的 image

huhongbo commented 6 years ago

放了一晚上之后 gc 468 @48142.710s 0%: 0.050+161+0.40 ms clock, 0.20+0.74/161/454+1.6 ms cpu, 284->284->280 MB, 561 MB goal, 4 P image

chanfried commented 6 years ago

我使用官方的docker,V3.27,也有内存泄露的样子,使用一天后,内存上升到将近300M。

cattyhouse commented 6 years ago

v2ray.ray.buffer.size 或 V2RAY_RAY_BUFFER_SIZE 设置为 1

/usr/bin/env V2RAY_RAY_BUFFER_SIZE=1 /usr/bin/v2ray -config .........

https://www.v2ray.com/chapter_02/env.html

ghost commented 6 years ago

@cattyhouse 设成1和0并不能解决问题,3.18运行数月毫无问题,还是等待作者解决吧

cattyhouse commented 6 years ago

不要设成0,仔细看我给的url

On Wed, Jul 25, 2018 at 18:48 萌田薫子 notifications@github.com wrote:

@cattyhouse https://github.com/cattyhouse 设成1和0并不能解决问题,3.18运行数月毫无问题,还是等待作者解决吧

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/v2ray/v2ray-core/issues/1126#issuecomment-407713707, or mute the thread https://github.com/notifications/unsubscribe-auth/ADNZyAWuPcQZ2eUg3gy0jp0aqSKStv2yks5uKEzlgaJpZM4US7i8 .

--

Regards Justin He

ghost commented 6 years ago

@cattyhouse 如果设成1有用,这个issue早关了。。 而且新版早就支持配置文件设成0,代表关闭缓存

cattyhouse commented 6 years ago

sorry my mistake.

ghost commented 6 years ago

@hzlmy2002 请不要误导其他用户,我说的是配置文件设为0,不是环境变量 https://www.v2ray.com/chapter_02/policy.html bufferSize (V2Ray 3.24+): 每个连接的内部缓存大小。单位为 kB。默认值为10240。当值为0时,内部缓存被禁用。

chanfried commented 6 years ago

V3.34 的docker,内存泄露问题应该解决了,我这里跑了12个小时了,内存一直正常。以前1天左右docker就要重启一次的,不然内存占用太多了。 @DarienRaymond 谢谢啦!

ghost commented 6 years ago

3.34我这里试了一天,目测没有问题了 👍

ShuoHuang commented 6 years ago

3.34我这里试了一天,目测没有问题了 👍

你好,3.34运行确定没有内存泄漏的问题吗?我用最新的3.50.1,内存会一直增长,请问有什么好的解决办法吗?比如修改配置项或者其他方式

ghost commented 6 years ago

3.34我这里试了一天,目测没有问题了 👍

你好,3.34运行确定没有内存泄漏的问题吗?我用最新的3.50.1,内存会一直增长,请问有什么好的解决办法吗?比如修改配置项或者其他方式

自己试吧,我现在一直用3.35,没再升级

kslr commented 5 years ago

v4.4优化了内存使用