xiaorouji / openwrt-passwall

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[Bug]: 使用了访问控制功能后内存占用会不断增加

soar68 opened this issue · comments

描述您遇到的bug

我通过访问控制功能配置了4个不同的代理,开启该功能后,内存占用正常是在400M左右,然而现在内存占用每天都在持续增加,将近一个星期内存直接占用了1G

复现此Bug的步骤

none

您想要实现的目的

解决该问题

日志信息

none

截图

image

系统相关信息

Passwall版本:4.77-4(使用最近更新的好几个版本都有这个问题)
Opnewrt版本:23.05.2

其他信息

No response

可以查一下具体是哪个/些进程内存占用过多

我通过htop查看了每个进程的内存占用是正常的,但是内存占用却持续增加,没使用访问控制功能之前一切正常,并且随着内存占用的持续增加,passwall首页中的运行状态加载的会越来越慢

我通过htop查看了每个进程的内存占用是正常的,但是内存却持续增加,并且没使用访问控制功能之前一切正常

但是增加的内存占用总是有进程使用的,要么是原有进程占用增加,要么是多了新的进程。
ps | grep passwall | grep -v grep看看有几个passwall相关进程,然后可以按进程id具体查一查每个进程内存占用。

刚重启系统了,过几天看看吧,谢谢

那正好先查一次,把结果保存,等之后内存长了再查一次,和保存的结果做比对。

我通过htop查看了每个进程的内存占用是正常的,但是内存占用却持续增加,没使用访问控制功能之前一切正常,并且随着内存占用的持续增加,passwall首页中的运行状态加载的会越来越慢

passwall2内存占用比1更严重,尤其是经过pt下载后,访问控制配置nas了udp和tcp非常用端口都不走代理

刚开始运行的内存占用,如图:
image
image
image
3天后的内存占用,如图:
image
image
image

3天时间内存占用增加了将近400M

从你这图上也看不出什么,从ps 进程截图看,1个默认Xray进程,4组访问控制,每组各一个dnsmasq、dns2socks、Xray进程。
能看到的同一进程内存变化的只有4840这一Xray进程从32MB到47MB,涨了16MB,但是看5004的内存占用,应该后面xray平均内存占用在50MB左右,大概增长20MB左右,5个大概100MB,其他估计是不是dnsmasq增长的。如果还没重启的话,你可以把ps列出来的每个进程内存都记录一下,然后重启passwall,再记录一下刚启动时的初始内存。对比一下大概每个进程涨了多少。

不过这样来看,你这应该是正常的,刚启动的进程,还没处理过什么网络请求,内存还是空的,随着使用,肯定会慢慢增大,只是这个增大增到一定程度就停了就是正常的,如果随着使用一直无限制增长那就是有问题,可能内存泄漏之类的。你这个内存占用涨的多,还是你的配置,导致开启的进程数比较多,每个进程涨一点,加起来就多了。
可以继续观查是否继续无限制增长下去。涨到一定程度就不涨了,就是正常的。一直涨的话,就看是哪个程序,然后到相应repo去提内存有问题的issue。这个不管是哪种情况,都不是passwall可以解决的,因为占内存的并不是passwall本身。
只能自己尽量优化配置方式,可以用一个Xray进程解决的就不要开多个访问控制,实在避免不了要开多个进程的,节点协议如果可以换用其他内存占用少的程序就不用Xray。

使用访问控制的场景,也许有些情况可以直接用Xray/Sing-Box分流,一个进程就解决问题。现在分流规则也支持源地址匹配的,如果是控制不同设备走代理或直连,走不同代理,可以试试分流能否满足需求。而且你4个访问控制,能少一个是一个。

一个Xray进程本来内存占用相对其他程序来说就算很大了,目前开socks节点,和转换成socks的haproxy负载均衡,以及访问控制,每增加一个节点,都会增加一个进程。只能看有没有办法使用配置目录,让多组节点配置共用一个Xray/Sing-Box进程。这个想法有很久了,但还一直没有研究是否可行。

从你这图上也看不出什么,从ps 进程截图看,1个默认Xray进程,4组访问控制,每组各一个dnsmasq、dns2socks、Xray进程。 能看到的同一进程内存变化的只有4840这一Xray进程从32MB到47MB,涨了16MB,但是看5004的内存占用,应该后面xray平均内存占用在50MB左右,大概增长20MB左右,5个大概100MB,其他估计是不是dnsmasq增长的。如果还没重启的话,你可以把ps列出来的每个进程内存都记录一下,然后重启passwall,再记录一下刚启动时的初始内存。对比一下大概每个进程涨了多少。

不过这样来看,你这应该是正常的,刚启动的进程,还没处理过什么网络请求,内存还是空的,随着使用,肯定会慢慢增大,只是这个增大增到一定程度就停了就是正常的,如果随着使用一直无限制增长那就是有问题,可能内存泄漏之类的。你这个内存占用涨的多,还是你的配置,导致开启的进程数比较多,每个进程涨一点,加起来就多了。 可以继续观查是否继续无限制增长下去。涨到一定程度就不涨了,就是正常的。一直涨的话,就看是哪个程序,然后到相应repo去提内存有问题的issue。这个不管是哪种情况,都不是passwall可以解决的,因为占内存的并不是passwall本身。 只能自己尽量优化配置方式,可以用一个Xray进程解决的就不要开多个访问控制,实在避免不了要开多个进程的,节点协议如果可以换用其他内存占用少的程序就不用Xray。

使用访问控制的场景,也许有些情况可以直接用Xray/Sing-Box分流,一个进程就解决问题。现在分流规则也支持源地址匹配的,如果是控制不同设备走代理或直连,走不同代理,可以试试分流能否满足需求。而且你4个访问控制,能少一个是一个。

一个Xray进程本来内存占用相对其他程序来说就算很大了,目前开socks节点,和转换成socks的haproxy负载均衡,以及访问控制,每增加一个节点,都会增加一个进程。只能看有没有办法使用配置目录,让多组节点配置共用一个Xray/Sing-Box进程。这个想法有很久了,但还一直没有研究是否可行。

感谢大佬解答!两天后又增加了将近60M的内存,以下是我op所有进程的截图
image
image
image
请问是xray进程导致的内存泄漏吗?

内存泄漏是没有的,只是正常的内存占用,只是Xray天生就比其他C/C++写的单协议代理工具内存占用要多很多。
你的内存占用很多,主要还是进程开多了导致的。尤其是Xray,本身就是一个大而全的代理软件,本来就不适合开多个进程,而是通过配置一个进程开多个出站和入站。
另外用于访问控制dns分流的dnsmasq进程每个也占用了20.48MB,这个不知道是不是DNS分流的规则(server和ipset)多了导致的。这一块的话,换成Dnsmasq+ChinaDNS-NG不知道会不会好一些。这两天在尝试访问控制的dns分流能不能使用单ChinaDNS-NG完成,不用在前面多加一层Dnsmasq。

如果比较在意内存的话,目前可以尝试的只有尽量减少访问控制的条目,能改为主界面分流实现的就改为分流实现。访问控制的节点,其协议如果能用其他代理工具可以修改类型为别的试试,比如ss的话,用shadowsocks-libev内存占用肯定要少得多。

要不你把4个访问控制的配置截图发一下,给你看看有没有哪里可以优化的。

内存泄漏是没有的,只是正常的内存占用,只是Xray天生就比其他C/C++写的单协议代理工具内存占用要多很多。 你的内存占用很多,主要还是进程开多了导致的。尤其是Xray,本身就是一个大而全的代理软件,本来就不适合开多个进程,而是通过配置一个进程开多个出站和入站。 另外用于访问控制dns分流的dnsmasq进程每个也占用了20.48MB,这个不知道是不是DNS分流的规则(server和ipset)多了导致的。这一块的话,换成Dnsmasq+ChinaDNS-NG不知道会不会好一些。这两天在尝试访问控制的dns分流能不能使用单ChinaDNS-NG完成,不用在前面多加一层Dnsmasq。

如果比较在意内存的话,目前可以尝试的只有尽量减少访问控制的条目,能改为主界面分流实现的就改为分流实现。访问控制的节点,其协议如果能用其他代理工具可以修改类型为别的试试,比如ss的话,用shadowsocks-libev内存占用肯定要少得多。

要不你把4个访问控制的配置截图发一下,给你看看有没有哪里可以优化的。

我是要为4台设备走4个不同的代理,所以配置了4个访问控制,以下是我访问控制的配置截图,除了源IP、TCP节点不一样以外其他配置都一样,帮忙看看哪里需要优化吗?谢谢!
image
image

你访问控制的代理模式是 ***列表以外,主界面的代理设置也是一样的模式吗?

你访问控制的代理模式是 ***列表以外,主界面的代理设置也是一样的模式吗?

是的,主页面的代理设置一样的
image

你看看分流规则呢,新建4个分流规则,名字就叫设备名,只填写源地址,其他都不填。然后注意调整下顺序,尽量往上。然后在在主界面配置使用分流节点,给这4个设备(源地址匹配)规则分配不同的节点。
这样的话,访问控制可以直接关了。

当然,Xray目前源地址匹配只适合IPv4地址,IPv6的话,除非是静态地址,否则,需要支持后缀匹配。再就是Xray拿不到源 Mac地址,没法直接匹配源Mac。

另外想问问如果我还是保持使用访问控制这种配置方法,我需要怎么优化以上配置来减少内存使用呢?

你的节点是 VLESS 协议的,没有其他简单程序可用,最多只能换Sing-Box试试,看这两者哪个内存优化方面更好一些,不过我估计应该是差不多的。这样就只能从Xray配置上下功夫,搜一搜Xray相关的issue、论坛、博客之类的,看看有哪些参数可以影响Xray内存占用的。

然后一个就是Dnsmasq,每个占用也不少,可以试试用ChinaDNS-NG内存占用会不会少一些,这一条我可以帮你测试,测完告诉你。

另外想问问如果我还是保持使用访问控制这种配置方法,我需要怎么优化以上配置来减少内存使用呢?

你的节点是 VLESS 协议的,没有其他简单程序可用,最多只能换Sing-Box试试,看这两者哪个内存优化方面更好一些,不过我估计应该是差不多的。这样就只能从Xray配置上下功夫,搜一搜Xray相关的issue、论坛、博客之类的,看看有哪些参数可以影响Xray内存占用的。

然后一个就是Dnsmasq,每个占用也不少,可以试试用ChinaDNS-NG内存占用会不会少一些,这一条我可以帮你测试,测完告诉你。

好的,感谢大佬!明天试试你说的这个分流配置方法。

访问控制里面 DnsmasqDnsmasq + ChinaDNS-NG,使用非**列表代理模式(该模式规则数比GFW模式多很多倍,几万条,而且我国内是双DNS,Dnsmasq的规则server规则数还要×2)。

  • DNS分流仅使用 Dnsmasq,配置完,检查初始内存占用,12528KB,约12.23MB;
  • DNS分流使用 Dnsmasq + ChinaDNS-NG,配置完,初始内存占用,Dnsmasq 948KB,不到 1MB,ChinaDNS-NG 2380KB,约 2.32MB。而且Dnsmasq因为直接转发,不处理分流,它的内存占用大概率是没什么上涨的空间的。至于ChinaDNS-NG,是有专门对DNS分流优化过的,估计内存占用也没什么涨幅。

单从刚配置完的初始内存占用来看,948+2380 KB = 3328KB = 3.25MB << 12.23MB
不知道你国内直连DNS配置了几个,因为是非**列表代理模式,使用Dnsmasq分流DNS的话,会生成 **列表条目数 × 直连DNS数目 条 server规则。你可以检查下 /tmp/dnsmasq.d/passwall/001-server.conf,看里面每个域名有几个国内DNS条目。

不对,非**列表代理 模式,默认DNS选 直连DNS,实际上DNS分流配置还是把GFW列表域名走远程DNS,其他走直连。我把 默认DNS远程DNS 再测一下。

我把 默认DNS 改 远程DNS 再测一下。

改为 远程DNS 后:

  • 单独使用 Dnsmasq,初始内存占用 44556KB,约 43.51MB;
  • 使用 Dnsmasq + ChinaDNS-NG,初始内存占用:Dnsmasq 908KB,ChinaDNS-NG 无论选直连、远程、还是默认,都一样是 2380KB。

所以,如果是使用访问控制,要适当减少内存使用,可以尝试把 DNS分流从 单Dnsmasq 改为 Dnsmasq + ChinaDNS-NG,而且主设置也可以改,一个节省内存,还有就是DNS分流处理上也许更快。
另外看你截图,你应该落后几个版本没更新了,现在DNS设置把ChinaDNS-NG设置逻辑改了一下,更便于理解。现在的设置截图;
image

现在DNS设置把ChinaDNS-NG设置逻辑改了一下,更便于理解。现在的设置截图;

感谢大佬测试,我目前使用的Passwall版本是4.77-4,系统版本是Immortalwrt 23.05.2,意思是我把ChinaDNS-NG选项勾上,另外过滤模式这里选择Xray会不会好一些呢?
image

选上ChinaDNS-NG就行,dns2socks我看了好像才占用几KB,改成Xray反而可能增加更多。

选ChinaDNS-NG之后,ChinaDNS-NG 域名默认标签默认,更好,更适合非**列表代理模式。

我特意注意了一下我自己用的。我没用访问控制,就主配置GFW列表代理模式,DNS分流使用Dnsmasq + ChinaDNS-NG。
开始476KB,过段时间492KB,连续请求多个不同的代理网站,内存占用涨到528KB。
然后等了几分钟没请求网页,再看内存又降到 492KB。看来ChinaDNS-NG应该是可以放心用了,它会自己释放空闲内存。至于有没有轻微内存泄漏,越用越大,还需继续观察。

我特意注意了一下我自己用的。我没用访问控制,就主配置GFW列表代理模式,DNS分流使用Dnsmasq + ChinaDNS-NG。 开始476KB,过段时间492KB,连续请求多个不同的代理网站,内存占用涨到528KB。 然后等了几分钟没请求网页,再看内存又降到 492KB。看来ChinaDNS-NG应该是可以放心用了,它会自己释放空闲内存。至于有没有轻微内存泄漏,越用越大,还需继续观察。

使用Dnsmasq + ChinaDNS-NG模式,下面的过滤模式等等怎么设置,大佬能不能截个图,谢谢哇

过滤模式什么的,看自己需求吧,我目前就直接用的TCP。然后gfw列表代理模式也没有默认dns设置。

过滤模式什么的,看自己需求吧,我目前就直接用的TCP。然后gfw列表代理模式也没有默认dns设置。

ChinaDNS-NG能不能实现DOH和DOT哇

ChinaDNS-NG能不能实现DOH和DOT哇

只支持UDP和TCP,但是你可以用DNSProxy或其他支持DoT/DoQ/DoH/DoH3的DNS转发工具设置好,然后远程DNS设置转发工具的端口。如果是本地DNS,那就在luci接口设置。

ChinaDNS-NG能不能实现DOH和DOT哇

只支持UDP和TCP,但是你可以用DNSProxy或其他支持DoT/DoQ/DoH/DoH3的DNS转发工具设置好,然后远程DNS设置转发工具的端口。如果是本地DNS,那就在luci接口设置。

我用smartdns确实内存占用很高,用ChinaDNS-NG就很低。。

我用smartdns确实内存占用很高,用ChinaDNS-NG就很低。。

SmartDNS 占用也很高吗?大概多少MB?
Dnsmasq处理分流的话

  • GFW模式或非**列表模式默认DNS选直连,初始占用大概 12.2MB;
  • 非**列表默认DNS选远程,因为我国内DNS有 2个,初始占用 43.5MB。

我用smartdns确实内存占用很高,用ChinaDNS-NG就很低。。

SmartDNS 占用也很高吗?大概多少MB? Dnsmasq处理分流的话

  • GFW模式或非**列表模式默认DNS选直连,初始占用大概 12.2MB;
  • 非**列表默认DNS选远程,因为我国内DNS有 2个,初始占用 43.5MB。

我也搞不清楚占用多少,反正用smartdns越用越少,初始剩余内存160Mb,慢慢到剩余几十Mb,然后后面就随机自动重启了,不清楚什么问题。。刚刚试了下Dnsmasq+ChinaDNS-NG,初始剩余内存190Mb,好像挺稳的,在180-190Mb波动。

我的ChinaDNS-NG占用,初始是在5小时以前,大概476-492KB,后来有涨也有往下掉。
刚刚查了一下,现在是600KB。

smartdns挺好用的,就是这个内存越用越少,不知道什么原因,大佬有空可以研究下哇

我特意注意了一下我自己用的。我没用访问控制,就主配置GFW列表代理模式,DNS分流使用Dnsmasq + ChinaDNS-NG。 开始476KB,过段时间492KB,连续请求多个不同的代理网站,内存占用涨到528KB。 然后等了几分钟没请求网页,再看内存又降到 492KB。看来ChinaDNS-NG应该是可以放心用了,它会自己释放空闲内存。至于有没有轻微内存泄漏,越用越大,还需继续观察。

大佬,我刚试了下分流配置,发现这样配置以后不到1分钟内存就占用了很多,不使用ChinaDNS-NG的情况下网页打开非常慢,使用ChinaDNS-NG的情况下网页直接打不开了,但是Telegram这种纯ip连接的可以正常用,以下是我的分流配置和内存占用截图,有空帮忙看下是什么原因造成的,谢谢!
image
image
image
image

这样配置以后不到1分钟内存就占用了很多

看你htop截图,好像占用895MB,也太离谱了吧。
我刚刚测试了一下,把我正用的这台电脑使用分流规则-源地址分流,分配到TW节点(默认和其他都是HK)。打开各个网站都没问题,IP也确实是TW的。
不知道你是不是使用流量很大还是怎么,我没什么大流量使用场景,就不断刷YouTube Shorts,内存占用也就大概 28-30MB。

你先把passwall,chinadns-ng,xray都升到最新版试试。

你先把passwall,chinadns-ng,xray都升到最新版试试。

都已经是最新版了,流量很小,主节点是单节点的情况下是正常的
Passwall:4.77-5
ImmortalWrt: 23.05.2
ChinaDNS-NG: 2024.04.30
Xray: 1.8.11

你原来用过Xray分流吗,就是让你添加源地址分流规则之前。你试试不用源地址分流规则,就用一般的目的地址匹配分流,看是不是还是占用这么大。

另外,我搜索了下,好像在Xray的issue有人问过差不多的内存问题,下面有人说他遇到相似情况是IPv6和QUIC导致的。
你可以看下,有没有开启IPv6代理,UDP转发屏蔽端口有没有屏蔽QUIC(据我前几天测试,不屏蔽也连不上反而导致YouTube等连接异常缓慢)。可以先关闭IPv6透明代理、屏蔽QUIC转发,看看是不是还一样异常占用。还有你TCP透明代理方式是 REDIRECT 还是 TPROXY,也切换一下试试。

反正多调整一些配置参数试试。

你原来用过Xray分流吗,就是让你添加源地址分流规则之前。你试试不用源地址分流规则,就用一般的目的地址匹配分流,看是不是还是占用这么大。

另外,我搜索了下,好像在Xray的issue有人问过差不多的内存问题,下面有人说他遇到相似情况是IPv6和QUIC导致的。 你可以看下,有没有开启IPv6代理,UDP转发屏蔽端口有没有屏蔽QUIC(据我前几天测试,不屏蔽也连不上反而导致YouTube等连接异常缓慢)。可以先关闭IPv6透明代理、屏蔽QUIC转发,看看是不是还一样异常占用。还有你TCP透明代理方式是 REDIRECT 还是 TPROXY,也切换一下试试。

反正多调整一些配置参数试试。

原来没有用过xray分流,在使用一般的目的地址匹配分流的情况下不会出现上面我说的内存异常增大问题,另外IPV6代理没有开启,UDP转发屏蔽端口也屏蔽了QUIC,TCP透明代理方式是 REDIRECT,这些都是安装好passwall后默认就是这样的。
image

你刚测试的吗,用了源地址匹配就内存异常多,只用其他规则就正常?

你刚测试的吗,用了源地址匹配就内存异常多,只用其他规则就正常?

昨天测试过了,刚才又测试了下,确定只有在使用源地址匹配的情况下内存异常增多,其他规则的情况下是正常的

只填源地址,上面的协议都不勾呢?
看起来应该是Xray的问题,但是我昨天也试了源地址匹配,一点问题没有,不管勾不勾选协议差不多,跟没用源地址匹配以前一样。难道是因为架构不同,只有某些架构上会出问题?

你把分流类型和用到的那个节点都改成sing-box试试,总不至于2个都有问题吧。

只填源地址,上面的协议都不勾呢? 看起来应该是Xray的问题,但是我昨天也试了源地址匹配,一点问题没有,不管勾不勾选协议差不多,跟没用源地址匹配以前一样。难道是因为架构不同,只有某些架构上会出问题?

你把分流类型和用到的那个节点都改成sing-box试试,总不至于2个都有问题吧。

如果上面的协议不勾,代理不上,连Telegram这种也上不去,刚才将节点类型换成sing-box以后不再出现内存暴增的现象,但不管使用哪种节点类型,网页始终打开的很慢,但Telegram这种纯ip连接的可以正常使用

你这应该该是DNS问题。你的DNS过滤模式是 UCP、TCP,还是Xray/Sing-Box。

源地址匹配规则匹配不到DNS请求的流量,因为Xray收到的DNS请求流量都是从路由器本机其他端口转发过来的,匹配不到源地址。只能走默认节点,但你默认选的直连,所以设备的DNS请求并没有被代理出去。
你把默认规则设置一个代理节点应该就可以了。

当然如果源地址分流指定的节点和默认节点不在同一地区/国家,可能导致源地址分流的DNS获取到的IP地址不是最近的,这时可以打开高级设置的 覆盖连接目标地址,或DNS使用 FakeDNS。这样发送给代理节点的请求目标地址就是域名,节点会重新发起DNS请求,获取最近的IP。

对了,你把默认规则设置代理节点而不是直连之后,可以再测试下Xray类型,是否还会内存暴涨。

你这应该该是DNS问题。你的DNS过滤模式是 UCP、TCP,还是Xray/Sing-Box。

源地址匹配规则匹配不到DNS请求的流量,因为Xray收到的DNS请求流量都是从路由器本机其他端口转发过来的,匹配不到源地址。只能走默认节点,但你默认选的直连,所以设备的DNS请求并没有被代理出去。 你把默认规则设置一个代理节点应该就可以了。

当然如果源地址分流指定的节点和默认节点不在同一地区/国家,可能导致源地址分流的DNS获取到的IP地址不是最近的,这时可以打开高级设置的 覆盖连接目标地址,或DNS使用 FakeDNS。这样发送给代理节点的请求目标地址就是域名,节点会重新发起DNS请求,获取最近的IP。

对了,你把默认规则设置代理节点而不是直连之后,可以再测试下Xray类型,是否还会内存暴涨。

感谢大佬,问题解决了,DNS过滤模式选择的是TCP,默认规则那设置了一个代理节点后网页可以正常访问了,内存也不再出现暴增的情况。