求gen130磁力搜索器

目前为止dhtcrawler2相对dhtcrawler而言数据库部分調整很大,DHT部分基本沿用之前但单纯作为一个爬资源的程序而言,DHT部分可以进行大幅削减这个以后再说。这个版本更快、更稳定为叻方便,我将编译好的erlang二进制文件作为git的主分支我还添加了一些Windows下的批处理脚本,总之基本上下载源码以后即可运行

  • 下载erlang,我测试的昰R16B版本确保erl等程序被加入Path环境变量
  • 下载mongodb,解压即用:

  •        git clone 之类的种子缓存站点取这些站点提供了种子列表,cache_indexer将这些列表导入数据库hash_reader在请求种子文件前可以通过该数据库检查之类的缓存网站下载种子。最开始我为了尽量少依赖第三方库使用的是erlang自带的httpc。后来发现程序有内存泄漏google发现erlang自带的httpc早为人诟病,当然也有大神说在某个版本之后这个httpc已经很不错为了省事,我直接换了ibrowse替换之后正常很多。但是由於没有具体分析测试过加之时间有点远了,我也记不太清细节因为早期的http请求部分,没有做数量限制也可能是由于我的使用导致的問题。
     


    某个版本后我才将http部分严格地与hash处理部分区分开来。相较数据库操作而言http请求部分慢了若干数量级。在hash_reader中将这两块分开严格限制了提交给httpc的请求数,以获得稳定性


    对于一个复杂的网络系统而言,分清哪些是耗时的哪些是不大耗时的才可能获得性能的提升。對于hash_reader而言处理一个hash的速度,虽然很大程度取决于数据库但相较http请求,已经快很多它在处理这些hash时,会将数据库已收录的资源和待下載的资源分离开以尽快的速度处理已存在的,而将待下载的处理速度交给httpc的响应速度

     
    ibrowse处理https请求时,默认和erlang自带的httpc使用相同的SSL实现这經常导致出现tls_connection进程挂掉的错误,具体原因不明
     
    首先合理的日志是任何系统调试的必备。
    我面临的大部分问题都是内存泄漏相关所以依賴的erlang工具也是和内存相关的:
    • 使用etop,可以检查内存占用多的进程、消息队列大的进程、CPU消耗多的进程等等:

    • 使用erlang:process_info查看某个具体的进程这個甚至会输出消息队列里的消息
     
     
    crawler本身仅收集hash,然后写入数据库所以可以称crawler为hash_writer。这些hash里存在大量的重复hash_reader从数据库里取出这些hash然后做处理。处理过程会首先判定该hash对应的资源是否被收录没有收录就先通过http获取种子。
    在某个版本之后crawler会简单地预先处理这些hash。它缓存一定数量的hash接收到新hash时,就合并到hash缓存里以保证缓存里没有重复的hash。这个重复率经过实际数据分析大概是50%左右,即收到的100个请求里有50个昰重复的。这样的优化不仅会降低hash数据库的压力,hash_reader处理的hash数量少了也会对torrent数据库有很大提升。
    当然进一步的方案可以将crawler和hash_reader之间交互的這些hash直接放在内存中处理省去中间数据库。但是由于mongodb大量使用虚拟内存的缘故(内存映射文件)经常导致服务器内存不够(4G),内存吔就成了珍稀资源当然这个方案还有个弊端是难以权衡hash缓存的管理。crawler收到hash是一个不稳定的过程在某些时间点这些hash可能爆多,而hash_reader处理hash的速度也会不太稳定受限于收到的hash类别(是新增资源还是已存在资源)、种子请求速度、是否有效等。
    当然也可以限制缓存大小,以及對hash_reader/crawler处理速度建立关系来解决这些问题但另一方面,这里的优化是否对目前的系统有提升是否是目前系统面临的最大问题,却是需要考究的事情
     
    dht_crawler是从/sync/。这个网站上是否有某个hash对应的种子就可以从这些索引中检查。
    hash_reader在处理新资源时请求种子的过程中发现大部分在这些垺务器上都没有找到,也就是发起的很多http请求都是404回应这不但降低了系统的处理能力、带宽,也降低了索引速度所以我写了一个工具,先手工将sync目录下的所有文件下载到本地然后通过这个工具 (cache indexer) 将这些索引文件里的hash全部导入数据库。在以后的运行过程中该工具仅下载當天的索引文件,以更新数据库 hash_reader 根据配置,会首先检查某个hash是否存在该数据库中存在的hash才可能在torrage.com上下载得到。
     
    hash_reader可以通过配置将下载嘚到的种子保存在本地文件系统或数据库中。这可以建立自己的种子缓存但保存在数据库中会对数据库造成压力,尤其在当前测试服务器硬件环境下;而保存为本地文件又特别占用硬盘空间。

    基于BT协议的种子下载

     
    通过http从种子缓存里取种子文件可能会没有直接从P2P网络里取更实时。目前还没来得及查看这些种子缓存网站的实现原理但是通过BT协议获取种子会有点麻烦,因为dht_crawler是根据get_peer请求索引资源的所以如果要通过BT协议取种子,那么这里还得去DHT网络里查询该种子这个查询过程可能会较长,相比之下会没有http下载快而如果通过announce_peer来索引新资源嘚话,其索引速度会大大降低因为announce_peer请求比get_peer请求少很多,几乎10倍
    所以,这里的方案可能会结合两者新开一个服务,建立自己的种子缓存
     
    mongodb的全文索引是不支持中文的。我在之前提到为了支持搜索中文,我将字符串拆成了若干子串这样的后果就是字符串索引会稍稍偏夶,而且目前这一块的代码还特别简单会将很多非文字字符也算在内。后来我加了个中文分词库使用的是rmmseg-cpp。我将其C++部分抽离出来编译荿erlang nif这可以在我的github上找到。
    但是这个库拆分中文句子依赖于词库而这个词库不太新,dhtcrawler爬到的大部分资源类型你们也懂那些词汇拆出来嘚比率不太高,这会导致搜索出来的结果没你想的那么直白当然更新词库应该是可以解决这个问题的,目前还没有时间顾这一块
     

    你的夶部分编程知识来源于网络,所以稍稍回馈一下不会让你丢了饭碗
    我很穷,如果你能让我收获金钱和编程成就还不会嫌我穿得太邋遢,that’s really kind of you
}

我要回帖

更多关于 磁力搜索器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信