qbittorrent下载没速度问题分析
缘起
之前一直使用qbittorrent进行bt/pt下载,在早期的版本中,经常出现崩溃问题,因此一直跟随最新的ubuntu系统和qbittorrent团队维护的ppa进行版本更新。
更新到4.x.x版本时,重启的问题得到比较好的解决(之前老版本总是跑几个小时就挂掉),但是自从更新4.5.x还是4.6.x之后,下载就经常没有速度了。
而同时段使用transmission就下载的很快,因此断断续续分析了几个月,终于找到原因,记录这篇博客方便后边查看。
折腾过程
下载一会儿就没速度
经过分析在热门的种子里,下载状态经常是s,即 下载者突然停止
或者等待
状态,此后下载速度就不行了,直至降低到kb级别,最终一点速度都没有。
尝试过各种qbittorrent的设置,均不能解决问题,因此基本不是配置问题,而同时transmission能下载,那就是qbittorrent本身的问题。
怀疑是max outstanding piece requests reached问题
经过分析在qbittorrent的日志中,有比较多的max outstanding piece requests reached
日志,经过排查分析网上没有有效的解决方案。
而调整各种参数,调大内存并不能解决问题。
怀疑是运营商封了端口
网上有说法是qbittorrent运行的端口导致运营商封了端口,尝试修改了各种端口,发现问题依旧,因此也不是端口的问题。
根本原因
折腾了2个多月,各种配置都尝试了还是不行,最终不得已尝试自行编译安装qbittorrent4.5.1,最终发现居然问题解决了。
不管是运行一段时间崩溃的问题,还是下载没有速度问题,都得到了解决。
分析其中的不同,发现qbittorrent编译过程中,需要先编译依赖的libtorrent库,而这个库教程文档里是1.2.x的版本。
而之前有问题的ubuntu ppa仓库里边的,使用的是2.x的libtorrent库,难道是库的问题吗?
经过网上搜索,还真的发现有些文章讲这个libtorrent 2.x版本不稳定,见https://www.ghostchu.com/archives/qbittorrent-nox-static ,可能是内存要求极高导致吧。
因此此问题就顺利解决,直接自行编译,使用老的libtorrent版本即可。
qbittorrent编译安装过程
下面为编译4.5.1的步骤,更高版本的可以参照qbittorrent官方的编译过程 https://github.com/qbittorrent/qBittorrent/wiki/Compilation-Debian,-Ubuntu,-and-derivatives
# 安装依赖 apt install build-essential pkg-config automake libtool git zlib1g-dev libssl-dev libgeoip-dev apt install libboost-dev libboost-system-dev libboost-chrono-dev libboost-random-dev apt install qtbase5-dev qttools5-dev libqt5svg5-dev # clone libtorrent库,并编译安装 git clone cd libtorrent git checkout v1.2.19 ./autotool.sh ./configure --disable-debug --enable-encryption make clean && make -j$(nproc) make install ldconfig #返回root目录编译qbittorrent并安装cd .. wget https://github.com/qbittorrent/qBittorrent/archive/refs/tags/release-4.5.1.tar.gz tar xf release-4.5.1.tar.gz cd release-4.5.1 ./configure CXXFLAGS="-std=c++14" --disable-gui --disable-debug make -j$(nproc) make install
拓展小知识
在分析日志时,发现每次启动qbittorrent,它都能检测出外部ip地址,而这个地址没看到qbittorrent通过接口或者其他途径获取的,比较奇怪。
经过分析qbittorrent源码,在src/base/bittorrent/sessionimpl.cpp
发现其应用的是libtorrent的external_ip_alert
里的ip,这里边的注释很清楚了,在libtorrent和tracker等通信时,获取到的外部的ip地址。
见:libtorrent-rasterbar/1.2.7/include/libtorrent/alert_types.hpp
// Whenever libtorrent learns about the machines external IP, this alert is // generated. The external IP address can be acquired from the tracker (if it // supports that) or from peers that supports the extension protocol. // The address can be accessed through the ``external_address`` member. struct TORRENT_EXPORT external_ip_alert final : alert { // internal external_ip_alert(aux::stack_allocator& alloc, address const& ip); TORRENT_DEFINE_ALERT(external_ip_alert, 47) static constexpr alert_category_t static_category = alert_category::status; std::string message() const override; // the IP address that is believed to be our external IP aux::noexcept_movable<address> external_address; };
总结
qbittorrent总体还是挺好用的,自带webui的qbittorrent-nox,web界面也比较友好,功能比transmission全,但是实际下载能力本身上,不如transmission稳定。
同时感觉最新的qbittorrent版本是不稳定的,日常使用建议使用低版本的qbittorrent版本或者自行编译使用低版本libtorrent的版本使用。
参考文档
https://www.vps333.com/18.html#lwptoc3
https://github.com/qbittorrent/qBittorrent/wiki/Compilation-Debian,-Ubuntu,-and-derivatives
https://evine.win/p/docker-install-qbittorrent/
https://www.ghostchu.com/archives/qbittorrent-nox-static
https://www.reddit.com/r/qBittorrent/comments/t9u5kh/performance_warning_max_outstanding_piece/
https://www.right.com.cn/forum/thread-519535-1-1.html
发表评论