我公司有几台服务器专门用于运行 Sphinx Search。所有服务器都是 CentOS 5,内存约为 48GB,我们的 searchd 版本是 1.11。最近我一直在尝试了解为什么 Sphinx 的常规索引占用的可用内存如此之少(我们目前不使用 RT 索引)。根据 Sphinx 官方网站,除 .spd 和 .spp 文件外,与索引相关的所有文件都存储在 RAM 中。目前,这构成了我们所有索引的约 14GG,可以轻松放入 RAM 中。但是,当我查阅 htop 的内存使用情况时,它显示使用的内存略少于 1.5GB!有趣的是,它报告交换空间也在使用中,即使将 vm.swappiness 设置为 0。如果我停止 searchd,交换空间就会降至 0。(应该注意,使用的交换空间量不大于正在使用的内存量。)我们已将其配置为在启动时预先打开所有索引(我们的 sphinx conf 中的 preopen_indexes = 1)。
根据以上信息,我有两个问题:
- 如果 Sphinx 没有将这些索引中的数据保存在内存中,它会如何处理这些数据?
- 是否可以强制 Sphinx 在内存中保留更多数据?
答案1
尝试 mlock = 1 并重新索引所有索引。
index index1
{
source = main1
path = /ssd/sphinx/index.main
charset_type = utf-8
docinfo = extern
mlock = 1
}
答案2
如果 Sphinx 没有将这些索引中的数据保存在内存中,它会如何处理这些数据?
它可能确实将它们放入内存中。但主机操作系统注意到它们使用得不多,因此将它们交换出去。
建议查看以确保您的交换功能确实得到应用。
是否可以强制 Sphinx 在内存中保留更多数据?
如果你有多余的内存。将索引放在 RAM 磁盘上 :)
如果你真的有足够的内存,那就完全关闭交换。如果内存不足,你可能会面临崩溃的风险,但这似乎不太可能发生在那台服务器上。