为什么开启了广告屏蔽,内存占用达到近40M(512M的内存,占用达到13%左右,从内存可用数30%直接到17%)?
广告屏蔽文件链接: https://anti-ad.net/anti-ad-for-smartdns.conf github仓库: https://github.com/privacy-protection-tools/anti-AD?tab=readme-ov-file
猜测是为了实现高性能的域名匹配,把规则列表加载到内存中。
广告屏蔽文件链接: https://anti-ad.net/anti-ad-for-smartdns.conf
98210行 😯
不多。我用的规则7千多行。内存60M。
内存使用是配置文件(包括域名列表)和缓存的总和
内存使用是配置文件(包括域名列表)和缓存的总和
我小内存,没办法只能不开启。只是不知道大佬能否优化?
别用那么复杂的广告表呗。比如我用的是 TG-Twilight/AWAvenue-Ads-Rule
surge的规则也可以直接拿来用
surge的规则也可以直接拿来用
这个规则更大。。
放弃DNS去广告把 电脑端用浏览器插件 手机端用去广告浏览器
在相关商店搜索:AdBlock
就是内存占用用点高,希望能优化下
目前看来内存占用较大的有两部分:
conf.h:dns_domain_rule.rules[DOMAIN_RULE_MAX] 过大,大多数情况下都只需要其中少量槽位。轻度用户很可能只用到 rule_flags 和解析 DNS 服务器用到的 rule_nameserver。对于广告屏蔽的需求来说,每个域名会浪费 8 * 14 = 112 字节。十万条记录就是 10MB。
目前采用 Adaptive Radix Tree 维护域名列表,插入 adrules 和 anti-ad 共约 14 万条不同规则后,统计如下:
tree size: 141518
leaf length: 2571661
leaf count: 141518, size: 12
node4 count: 53477, size: 56
node16 count: 8029, size: 160
node48 count: 780, size: 656
node256 count: 0, size: 2064
estimated size: 9060909
num_children 2 count: 39045
num_children 3 count: 10082
num_children 4 count: 4350
num_children 5 count: 2452
num_children 6 count: 1512
num_children 7 count: 1058
num_children 8 count: 764
...
1 partial_len 0 count: 40106
2 partial_len 1 count: 6360
3 partial_len 2 count: 3860
4 partial_len 3 count: 2847
5 partial_len 4 count: 2287
6 partial_len 5 count: 1637
7 partial_len 6 count: 1210
8 partial_len 7 count: 946
9 partial_len 8 count: 685
10 partial_len 9 count: 586
...
没有立竿见影的优化方法,只能通过各种方法积少成多。
针对广告屏蔽的场景,还有一个想法是在加载完毕后,筛选出所有仅需要 rule_flag 且只设置了 SOA 的域名,让它们共同指向一个预设的 dns_domain_rule 对象,在析构时增加检查跳过。
大部分应该是address和namserver,可以把这两个单独提出来,其他单独放一个数组动态申请。
最新代码内存占用减少大约三分之一