我在一台内存为38 of的Linux服务器上运行Sphinx Search。sphinx索引包含35M全文文档,外加从MySQL表索引的元数据。当我启动一个新的服务器时,我运行一个脚本,通过它发送我的10,000个最常见的查询来“预热sphinx缓存”。第一次运行预热脚本大约需要一个小时,但是如果我再次运行它,同样的脚本只需要几分钟就可以完成。
我之所以感到困惑,是因为Sphinx没有任何文档化的缓存,除了我没有使用的基于文件的缓存。索引在Sphinx启动时加载到内存中,但是在系统“预热”之后,每次运行单个查询都需要相同的时间长度。
当我运行我的脚本时,有一个明确的热身期。怎么一回事?Linux缓存是否可以帮助Sphinx运行得更快?底层的MySQL系统会缓存查询吗(我相信Sphinx基本上是一个自定义的MySQL存储引擎)?正在发生的事情如何让从未运行过的新查询变得更快?
我意识到这可能有一个非常复杂的解释,但即使是一点方向也应该有助于更深入地挖掘。
发布于 2012-03-13 22:17:06
(我相信Sphinx基本上是一个自定义的MySQL存储引擎) SphinxSE是一个“假的”存储引擎。假的,因为它不存储任何数据-而是从它的“表”中获取数据的请求,但实际上它只是将数据代理回后台正在运行的searchd实例。
searchd本身没有任何缓存-但正如前面提到的那样,从索引读取时,操作系统很可能会开始缓存文件-所以不必一直回到磁盘。
如果你使用的是SphinxSE -那么查询可能会被普通的mysql查询缓存-所以整个结果集都会被缓存。但在上瘾时,通常使用SphinxSE的方法是将搜索结果与原始数据集结合起来,这样你就可以一口气把它们都返回到应用程序中。因此,您的查询也依赖于真实的mysql数据表。它们将受到相同的操作系统缓存的影响-当mysql读取数据时,它将被缓存。
启动新服务器时出现
这是否表明您正在使用VM?如果是这样,虚拟磁盘实际上可能位于远程SAN上。(或亚马逊ec2上的EBS )
根据你的VM所在的位置,可能会得到一些特殊的高性能磁盘-理想情况下是主机本地的-甚至可能是SSD -这可能会很有帮助。
无论如何,为了跟踪这个问题,您几乎肯定应该启用sphinx查询日志。查看一下,看看那里的查询执行是否很慢。还有一个指向searchd的启动向上选项,您可以在其中启用iostats。这将在查询运行时将有关io统计信息的更多信息记录到查询日志中。这可以给你更多的洞察力。
发布于 2012-03-13 18:48:26
Sphinx不会缓存查询,但文件系统会缓存。所以,是的,第二次查询的执行速度比第一次快。
https://stackoverflow.com/questions/9679549
复制相似问题