mysql - 当我的 Sphinx 搜索服务器预热时发生了什么?

标签 mysql linux caching sphinx

我在具有 38GB 内存的 Linux 服务器上运行 Sphinx 搜索。 sphinx 索引包含 35M 全文文档以及从 MySQL 表索引的元数据。当我启动一个新的服务器时,我运行一个脚本,通过发送我的 10,000 个最常见的查询来“预热 sphinx 缓存”。第一次运行预热脚本大约需要一个小时,但如果我再次运行同一个脚本,只需几分钟即可完成。

我之所以感到困惑,是因为 Sphinx 没有任何记录在案的缓存,除了我没有使用的基于文件的缓存。索引在 Sphinx 启动时加载到内存中,但在系统“预热”后,每次运行单个查询所花费的时间长度相同。

当我运行我的脚本时,有一个明显的预热期。到底是怎么回事? Linux 缓存有助于 Sphinx 运行得更快的东西吗?底层 MySQL 系统是否缓存查询(我相信 Sphinx 基本上是一个自定义的 MySQL 存储引擎)?正在发生的事情如何使从未运行过的新查询变得更快?

我意识到这可能有一个非常复杂的解释,但即使是一点点方向也应该有助于更深入地挖掘。

最佳答案

( I believe Sphinx is basically a custom MySQL storage engine ) SphinxSE is a 'fake' storage engine. fake because it doesnt store any data - but rather take requests for data from its 'table', but really it just proxies it back to a running searchd instance in the background.

searchd 本身没有任何缓存 - 但正如所提到的那样,索引是从中读取的,操作系统可能会开始缓存文件 - 所以不必一直返回到磁盘。

如果您使用的是 SphinxSE - 那么查询可能会被普通的 mysql 查询缓存缓存 - 所以整个结果集都会被缓存。但上瘾时,使用 SphinxSE 的常用方法是将搜索结果与原始数据集连接起来,这样你就可以一次性将两者都返回到应用程序中。所以你的查询还依赖于真正的mysql数据表。它们将受到相同的操作系统缓存的约束——当 mysql 读取数据时,它将被缓存。

When I launch a fresh server

这表明您正在使用虚拟机?如果是这样,虚拟磁盘实际上可能位于远程 SAN 上。 (或 Amazon ec2 上的 EBS)

  • 这意味着通过该路径加载大型 sphinx 索引可能很慢。

根据您的 VM 托管位置,可能可以获得一些特殊的高性能磁盘 - 最好是主机本地 - 甚至可能是 SSD - 这可能很有帮助。


无论如何要跟踪这个问题,您几乎肯定应该启用 sphinx 查询日志。调查一下,看看那里的查询执行速度是否缓慢。 searchd 还有一个启动选项——您可以在其中启用 iostats。这将在运行查询时将有关 io 统计信息的更多信息记录到查询日志中。这可以为您提供额外的见解。

关于mysql - 当我的 Sphinx 搜索服务器预热时发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9679549/

相关文章:

Android Studio 在 Linux 上崩溃

javascript - 如何从 Node js上的http get请求中删除缓存

php - 对于高度变化的网站,memcache 或 memcached 有什么好处?

mysql - 如果另一列为空,则选择一列

php - 使用 PHP 将大型数据库转储为 JSON

mysql - 大写或小写字符串

c - 重定向到 execlp()

linux - 应用服务 Linux : VNET integration causes application and docker to not respond at all

php - 具有 APC 缓存的 key 组

php - mysql 准备语句 IFNULL