Closed ccloli closed 1 month ago
出于 #22 的性能考虑,明确拒绝 5.x 以下版本添加私有种子支持。
不好意思,我在看原 issue 时才看到 #22 相关的问题。不知是否可以使用缓存来记录映射关系?我理解活跃 torrent 仅是所有 torrent 的一小部分,且仅需发起一次检查即可,应该不会发起过多请求。此外,我个人认为不太会出现启动后瞬间会有 100 个活跃 torrent 的情况,理论上活跃 torrent 是逐步增加的。
可以考虑使用串行请求 + 间隔延迟的方式减少请求负载,而不是一次性并发获取所有的结果,相关结果也可以存储在本地缓存,服务端重启也可复用之前的缓存。
不好意思,我在看原 issue 时才看到 #22 相关的问题。不知是否可以使用缓存来记录映射关系?我理解活跃 torrent 仅是所有 torrent 的一小部分,且仅需发起一次检查即可,应该不会发起过多请求。此外,我个人认为不太会出现启动后瞬间会有 100 个活跃 torrent 的情况,理论上活跃 torrent 是逐步增加的。
可以考虑使用串行请求 + 间隔延迟的方式减少请求负载,而不是一次性并发获取所有的结果,相关结果也可以存储在本地缓存,服务端重启也可复用之前的缓存。
即使是缓存也需要定期从下载器更新数据(还需要考虑更新失败的情况),极大的提升了复杂性,暂时没有添加的计划。
PR is welcome
Hi,不好意思再打扰一下。
我按照上面的逻辑试着编写了一部分代码,但是由于我本地并没有完整的 Java 开发环境,且没有看到相关的开发文档,所以不太清楚该如何配置开发环境。我看到项目内有一个 Dockerfile,所以想直接使用 Docker 构建镜像后再 docker cp
出产物。
但是在安装依赖的容器内,mvn 提示了如下错误:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-dependency-plugin:3.8.0:go-offline (default-cli) on project peerbanhelper
我试着修改 Dockerfile,将指令换成 mvn install
也是相似的错误,只是上面的 WARNING 变成了 ERROR:
[ERROR] Failed to execute goal on project peerbanhelper: Could not collect dependencies for project com.ghostchu.peerbanhelper:peerbanhelper:takari-jar:6.2.1
此问题应该与网络无关,因为其他的依赖均可正常拉取。已经尝试过 docker build .
多次,均是相同问题。
我理解 Docker 镜像构建的环境应该是比较稳定、不会有太大变数的,可以避免本地与构建环境相关的问题,所以使用相同的 Dockerfile 构建应该不会有问题。不知是否是我的配置有问题,或者构建环境不对?还望不吝赐教,若有打扰还望谅解,感谢。
Updated: GitHub Actions 工作正常,先暂时使用 GitHub Actions 构建测试,目前还在验证功能中。
测试了下,在修改获取所有 torrent 列表,最终列表为 ~800 个 torrent 的情况下,并发 5 个线程调用请求,逐一获取 is_private 的部分耗时大约 3s。在 Ryzen 5600 4x vCPU+16G RAM 的情况下,qBittorrent CPU 闲时占用 ~2%,在 PBH 定时拉取列表时占用 ~5%,再加上私有 torrent 的并发请求后首次启动占用 ~8%,感觉性能尚可。后续执行均命中缓存,获取 is_private 的耗时基本在 1ms 左右。
试着调整为并发 10 / 15 个线程,耗时与资源占用并没有明显变化。怀疑是输出抢占资源,故去掉了调试输出。
去掉后,5 线程耗时 ~1.1s,峰值占用 ~15%;10 线程耗时 ~1.2s,峰值占用 ~15%;15 线程耗时大约 1s,峰值占用 ~17%。感觉再堆线程边际效应会递减,因此 5 线程应该已经足够。且上述测试发现吞吐量已经达到瓶颈,增加线程数并没有意义。
此外,吞吐率也有可能是 PBH 自身相关,因为 PBH 启动时会占用大约 80% 左右的 CPU,留给 qBittorrent 的资源相对有限。一般来说请求数较多的情况也仅出现在 PBH 启动的时候,因此感觉应该可以忽略不计。
上述 torrent 中有大约 350 条是私有 torrent,本 issue 相关功能实现后,过滤得到实际 torrent 数为 450 条,需要检查的 torrent 数降低了,后续定时检查的耗时也从 ~670ms 降低到了 ~450ms,其中 /info
这一 API 在浏览器开发者工具里显示本身大约会耗时 ~120ms,所以排除掉获取列表的时间,其他操作时间从 ~550ms 降低到 ~330ms,减少了大约 2/5 的时间。因此对于私有 torrent 比例较高的客户端来说,整体性能其实是更好的。
感兴趣的话可以获取上面测试的 jar 产物试验下,本地 qBittorrent 的 torrent 数量不是很多,所以可能不能直接暴露性能问题。不过一般来说客户端都会有最大连接数限制,如果没有主动修改过的话,默认的全局最大连接数也就是 500,因此极端情况下最多对应 500 个活跃 torrent。
此问题与 #399 相似,但后者仅提到 qBittorrent 5.x,且目前 WebUI 也提示仅支持 qBittorrent 5.x。
对于 qBittorrent 4.x(例如 v4.5.5)可以使用 /api/v2/torrents/properties 获取到 torrent 的详细信息,其中包含
is_private
字段可用于判断是否是私有 torrent。Update: 原 issue 提到了 #22 的问题,是否考虑在服务端添加 LRU 缓存,记录 torrent hash 与是否私有的映射,来减少活跃种子的检测请求?