需要大型 Wiki 设置建议,服务器缓存/索引会随着时间的推移而变慢


Large Wiki Setup-Advice needed, Server Caching/Indexing slows over time

首先,我想为长篇大论道歉,但请耐心等待,我相信所有这些都是必要的......

我在我的网站上使用DokuWiki(V: 2014-09-29)http://nofusscomputing.com/wiki/,主要是为了记录我自己的网络(封闭),或帮助人们使用我提供的任何服务或功能(只读)。 所有 wiki 都会生成自己的站点地图,该地图由"我的站点站点地图索引"引用。 现在其中一些维基将超过50,000页,据我所知,DokuWiki不符合这些大型维基的站点地图协议, 在这种情况下,我稍后会过那座桥。我使用搜索索引管理器扩展来索引和缓存此站点,以加快加载时间。

我的设置包括主维基一个农场和子维基作为信息数据库设置为动物,即 http://nofusscomputing.com/database/application/home。此设置使我能够在需要时打开/关闭和释放信息数据库的每个组件。主维基的当前大小约为 40 页,上述动物为 65 页。使用wiki而不是创建我自己的网站页面的主要原因非常简单。以降低成本,DokuWiki 简单、开发良好且基本上非常适合我的需求,我希望避免使用锤击 MySQL 服务器的网站,除非我真的需要。

背景在业余时间,我编写Windows软件,最终对任何PC用户都有帮助。该软件的一部分收集安装它的机器的系统清单;这些数据反过来存储在MySQL数据库中,然后由我自己的软件解析以动态创建wiki页面。目前,我在从数据库中获取数据并以编程方式创建 wiki 页面方面没有问题,因此可以创建可呈现且希望有用的信息。

问题这个新的维基动物将提供文件信息。初始起始大小约为 200,000 页,我预计它会增长到数百万页。

周末我开始将数据迁移到一个新的信息数据库,我编写了从MySQL中提取数据以创建页面所需的脚本(初始页面创建只有5000页),这是一项非常简单的任务。但。。。。。索引/缓存有点慢。

还行。。。很快将其缩小到硬件规格非常小的 Web 服务器(QNAP TS-110...不要笑得太大声,它对我很好),所以我拿出了HP DC7900 SFF(Intel Core2 Duo E8400 3.00Ghz,4GB RAM,1TB HDD(非Raid)和WIN7 w/WAMP2)和我的Intel Bare Bone服务器(Intel XEON old may 2.8Ghz(四核),8GB RAM,RAID 1 WIN SVR 2003 + WAMP2)经过数小时的测试,英特尔服务器赢得了胜利,但我仍然对HP DC7900的性能感到满意。随着时间的推移,所有机器共享相同的索引/缓存降级,缓存/索引时间减少到如果我索引超过 5000 个页面,我的 wiki 将处于索引/缓存新 wiki 页面的恒定状态,我肯定错过了一些东西......

初始命名空间设置基于文件名,该文件名是相关文件的 SHA256 哈希,该哈希被分解为每个子文件夹 2 个字符,结束于 19-20 个文件夹深度,顺便说一下,这是一个不行的.....要扫描索引的文件夹太多,速度很慢,但从积极的方面来说,每个文件夹不会超过 256 个对象。最后,为了测试,我决定将哈希的前两个十六进制数字作为子文件夹,然后将文件放入其中。仍然不知道我将如何设置文件夹结构,除了尝试找到一种方法使其不高于每个文件夹大约 16,000-17,000 个对象,因为这是我开始注意到机器开始减慢堆的速度的时候。

结果通过计算 Web 服务器日志条目来索引/缓存 5000 页的时间Qnap TS110 在 8 小时后我停止索引,开始每 1-2 秒索引大约 2 页。HP DC7900 前 10 分钟约为 1.381 页/秒。5000Pages需要4630秒或1.0799Pages/秒,页面加载时间几乎是即时的。英特尔服务器只是稍微快一点,大约在同一时间完成。前 10 分钟约为 3.121 页/秒。5000Pages需要2015秒或2.4813Pages/秒,页面加载时间几乎是即时的。

问题两台服务器都会随着时间的推移而降级,有什么办法可以解决这个问题吗?或者有谁知道改进我想要实现的目标的方法吗?

我不确定这个问题是否适合StackOverflow。我想最好在DokuWiki论坛或Mailinglist上问这个问题。

对此的一些想法:

  • 200k页面很多
  • DokuWiki的索引使用单个文件来存储所有页面的列表(data/index/page.idx)。
  • 该页面索引在每次索引访问时被读入数组中,这很可能是这里的瓶颈之一
  • 您没有说明页面的内容,但我认为它们可能都非常相似,这将使单个索引文件膨胀,而不是将索引分散到不同的文件上(就像自然语言页面一样)
  • 您不应该使用基于 Web 的 SearchIndex 插件进行索引,而应该使用命令行工具 bin/indexer.php以避免许多 AJAX 请求的开销
  • 最后,最好切换到使用专用搜索引擎后端(如SOLR或Sphinx)的可用搜索插件之一
  • 通常,通过使用快速存储(SSD)和足够的RAM(用于文件系统缓存)可以提高性能