mihomo icon indicating copy to clipboard operation
mihomo copied to clipboard

[Bug] 使用hysteria/hysteria2协议会导致内存泄漏

Open huxim opened this issue 1 year ago • 4 comments

验证步骤

  • [X] 我已经阅读了 文档,了解所有我编写的配置文件项的含义,而不是大量堆砌看似有用的选项或默认值。
  • [X] 我仔细看过 文档 并未解决问题
  • [X] 我已在 Issue Tracker 中寻找过我要提出的问题,并且没有找到
  • [X] 我是中文用户,而非其他语言用户
  • [x] 我已经使用最新的 Alpha 分支版本测试过,问题依旧存在
  • [X] 我提供了可以在本地重现该问题的服务器、客户端配置文件与流程,而不是一个脱敏的复杂客户端配置文件。
  • [X] 我提供了可用于重现我报告的错误的最简配置,而不是依赖远程服务器或者堆砌大量对于复现无用的配置等。
  • [X] 我提供了完整的日志,而不是出于对自身智力的自信而仅提供了部分认为有用的部分。
  • [X] 我直接使用 Mihomo 命令行程序重现了错误,而不是使用其他工具或脚本。

操作系统

Windows

系统版本

Windows10 22H2 19045.5011 (Linux下似乎也有同样的问题)

Mihomo 版本

1.18.10

配置文件

# 机场订阅,名称不能重复
proxy-providers:
  
# 用于下载订阅时指定UA
global-ua: clash.meta
    
# 全局配置
port: 7893
socks-port: 7891
redir-port: 7892
mixed-port: 7890
tproxy-port: 7894
log-level: debug
ipv6: false
allow-lan: true
unified-delay: true
tcp-concurrent: true
  
geodata-mode: false
geodata-loader: standard
geo-auto-update: true
geo-update-interval: 48
geox-url:
  geoip: "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.dat"
  geosite: "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.dat"
  mmdb: "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/country.mmdb"
  asn: "https://github.com/xishang0128/geoip/releases/download/latest/GeoLite2-ASN.mmdb"
  
# 控制面板
external-controller: 0.0.0.0:9090
secret: ""
#external-ui: ui
#external-ui-url: "https://ghp.ci/https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip"

# 匹配进程 always/strict/off
find-process-mode: off
global-client-fingerprint: chrome
keep-alive-idle: 600
keep-alive-interval: 30

# 策略组选择和fakeip缓存
profile:
  store-selected: true
  store-fake-ip: true
  
# 流量嗅探
sniffer:
  enable: false
  sniff:
    HTTP:
      ports: [80, 8080-8880]
      override-destination: true
    TLS:
      ports: [443, 8443]
    QUIC:
      ports: [443, 8443]
  force-domain:
    - +.v2ex.com
  skip-domain:
    - "Mijia Cloud"
    - "dlg.io.mi.com"
    - "+.push.apple.com"
    - "+.apple.com"
    
# 代理模式
tun:
  enable: false
  stack: mixed
  mtu: 9000
  dns-hijack:
    - "any:53"
    - "tcp://any:53"
  auto-route: true
  auto-redirect: true
  auto-detect-interface: true
  
# DNS模块
dns:
  enable: false
  listen: 0.0.0.0:1053
  ipv6: false
  respect-rules: true
  # 模式切换 redir-host / fake-ip
  enhanced-mode: fake-ip
  fake-ip-range: 28.0.0.1/8
  # 模式切换 whitelist/blacklist 
  # 黑名单模式表示如果匹配成功则不返回 Fake-IP, 白名单模式时只有匹配成功才返回 Fake-IP
  fake-ip-filter-mode: blacklist
  fake-ip-filter:
    - "+.lan"
    - "+.local"
    - geosite:private
    - geosite:cn
  default-nameserver:
    - 223.5.5.5
    - 119.29.29.29
  proxy-server-nameserver:
    - 223.5.5.5
    - 119.29.29.29
  nameserver:
    - 223.5.5.5
    - 119.29.29.29
  nameserver-policy:
    "rule-set:private_domain,cn_domain":
    - 223.5.5.5
    - 119.29.29.29
    "rule-set:geolocation-!cn":
      - "https://dns.cloudflare.com/dns-query"
      - "https://dns.google/dns-query"
 
   
proxies:
- name: "🟢 直连"
  type: direct
  udp: true
 
# 锚点
pr: &pr {type: select, proxies: [🚀 节点选择, ♻️ 香港自动, ♻️ 日本自动, ♻️ 美国自动, ♻️ 自动选择, 🌐 全部节点, 🟢 直连]}
# 策略组
proxy-groups:
  - {name: 🚀 节点选择, type: select, proxies: [♻️ 自动选择, ♻️ 香港自动, ♻️ 日本自动, ♻️ 美国自动, 🌐 全部节点, 🟢 直连]}
  - {name: 🤖 ChatGPT,!!merge <<: *pr}
  - {name: 🎵 TikTok,!!merge <<: *pr}
  - {name: 📲 Telegram,!!merge <<: *pr}
  - {name: 🎥 NETFLIX,!!merge <<: *pr}
  - {name: ✈️ Speedtest,!!merge <<: *pr}
  - {name: 💶 PayPal,!!merge <<: *pr}
  - {name: 🍎 Apple, type: select, proxies: [🟢 直连, 🚀 节点选择]}
  - {name: 🎯 全球直连, type: select, proxies: [🟢 直连, 🚀 节点选择]}
  - {name: 🐟 漏网之鱼,!!merge <<: *pr}
  - {name: ♻️ 香港自动, type: url-test, include-all: true, tolerance: 100, interval: 60, filter: "(?=.*(港|HK|(?i)Hong))^((?!(台|日|韩|新|深|美|限速)).)*$"}
  - {name: ♻️ 日本自动, type: url-test, include-all: true, tolerance: 100, interval: 60, filter: "(?=.*(日|JP|(?i)Japan))^((?!(港|台|韩|新|美|限速)).)*$" }
  - {name: ♻️ 美国自动, type: url-test, include-all: true, tolerance: 100, interval: 60, filter: "(?=.*(美|US|(?i)States|America))^((?!(港|台|日|韩|新|限速)).)*$"}
  - {name: ♻️ 自动选择, type: url-test, include-all: true, tolerance: 100, interval: 60, filter: "^((?!(直连|限速)).)*$"}
  - {name: 🌐 全部节点, type: select, include-all: true}
rules:
  - RULE-SET,private_domain,🟢 直连
  - RULE-SET,apple_domain,🍎 Apple
  - RULE-SET,proxylite,🚀 节点选择
  - RULE-SET,ai,🤖 ChatGPT
  - RULE-SET,tiktok_domain,🎵 TikTok
  - RULE-SET,speedtest_domain,✈️ Speedtest
  - RULE-SET,telegram_domain,📲 Telegram
  - RULE-SET,netflix_domain,🎥 NETFLIX
  - RULE-SET,paypal_domain,💶 PayPal
  - RULE-SET,geolocation-!cn,🚀 节点选择
  - RULE-SET,cn_domain,🎯 全球直连
  - RULE-SET,netflix_ip,🎥 NETFLIX,no-resolve
  - RULE-SET,telegram_ip,📲 Telegram,no-resolve
  - RULE-SET,cn_ip,🎯 全球直连
  - MATCH,🐟 漏网之鱼
rule-anchor:
  ip: &ip {type: http, interval: 86400, behavior: ipcidr, format: mrs}
  domain: &domain {type: http, interval: 86400, behavior: domain, format: mrs}
  qcy: &qcy {type: http, interval: 86400, behavior: domain, format: text}
  class: &class {type: http, interval: 86400, behavior: classical, format: text}
rule-providers: 
  private_domain: {!!merge <<: *domain, url: "https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/meta/geo/geosite/private.mrs"}
  proxylite: {!!merge <<: *class, url: "https://raw.githubusercontent.com/qichiyuhub/rule/refs/heads/master/ProxyLite.list"}
  ai: {!!merge <<: *class, url: "https://raw.githubusercontent.com/qichiyuhub/rule/refs/heads/master/AI.list"}
  telegram_domain: {!!merge <<: *domain, url: "https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/meta/geo/geosite/telegram.mrs"}
  netflix_domain: {!!merge <<: *domain, url: "https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/meta/geo/geosite/netflix.mrs"}
  paypal_domain: {!!merge <<: *domain, url: "https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/meta/geo/geosite/paypal.mrs"}
  apple_domain: {!!merge <<: *domain, url: "https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/meta/geo/geosite/apple-cn.mrs"}
  speedtest_domain: {!!merge <<: *domain, url: "https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/meta/geo/geosite/ookla-speedtest.mrs"}
  tiktok_domain: {!!merge <<: *domain, url: "https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/meta/geo/geosite/tiktok.mrs"}
  gfw_domain: {!!merge <<: *domain, url: "https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/meta/geo/geosite/gfw.mrs"}
  geolocation-!cn: {!!merge <<: *domain, url: "https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/meta/geo/geosite/geolocation-!cn.mrs"}
  cn_domain: {!!merge <<: *domain, url: "https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/meta/geo/geosite/cn.mrs"}
  
  cn_ip: {!!merge <<: *ip, url: "https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/meta/geo/geoip/cn.mrs"}
  telegram_ip: {!!merge <<: *ip, url: "https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/meta/geo/geoip/telegram.mrs"}
  netflix_ip: {!!merge <<: *ip, url: "https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/meta/geo/geoip/netflix.mrs"}

描述

其他协议正常, 但使用hysteria/hysteria2协议会导致内存泄漏 image

日志及heap.zip

重现方式

使用hysteria/hysteria2协议, 持续运行几个小时, 观察内存占用

日志

日志见附件

huxim avatar Nov 10 '24 09:11 huxim

我的是有个机场100多个hy2的节点,只要加进来,立马内存占用飙升。直接把我linux的内存加SWAP撑爆了

shenyanshu avatar Nov 23 '24 13:11 shenyanshu

我的是有个机场100多个hy2的节点,只要加进来,立马内存占用飙升。直接把我linux的内存加SWAP撑爆了

我暂时是用脚本定时重启

huxim avatar Nov 23 '24 13:11 huxim

急需clash verge rev项目能加入自动检测和恢复功能.

如果webview漏了超过500M, 就自动重启gui 如果核心mihomo漏了超过500M,就自动重启核心.

lovitus avatar Dec 16 '24 10:12 lovitus

确实是,我发现直接调用内核 hy2的节点会导致内存一点一点涨,尽管我做了一些措施,比如将 Transport = nil 方便他GC,但是还是没用。

beck-8 avatar Mar 09 '25 06:03 beck-8