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://www.atsuko.org/?p=324

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

https://www.reddit.com/r/qBittorrent/comments/13awdeo/qbittorrent_wont_download_torrents_saying_theyre/


发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。