我们在 3 个 EC2 实例(当前为 m3.large)的集群上运行了一个 Sphinx 安装(2.0.3)。
目前,我们的 Sphinx 配置中有workers = threads
和max_children = 30
(每个框都相同)。我们定期收到可怕的“临时搜索错误:服务器已达到最大容量,请稍后重试”。我们的实例的 CPU 利用率徘徊在 5% 左右。以下是一些示例 top 输出:
top - 19:51:56 up 22:15, 1 user, load average: 0.08, 0.04, 0.01
Tasks: 82 total, 2 running, 80 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.0%us, 0.0%sy, 0.0%ni, 98.5%id, 0.3%wa, 0.0%hi, 0.0%si, 0.2%st
Mem: 7872040k total, 2911920k used, 4960120k free, 245168k buffers
Swap: 0k total, 0k used, 0k free, 2190992k cached
Sphinx 文档似乎都提到了关于设置 max_children 的内容“有助于控制服务器负载”。在搜索时,我发现一个论坛帖子表明设置它任何一个太高或太低都会导致“服务器超负荷” - 我推测前者是因为单个查询不足 - 但没有进一步提示如何选择正确的级别。(我找不到这篇文章的链接来拯救我的生命。抱歉。)
两个相关问题:
- 我是否可以正确地认为低 CPU 表明 max_children 可以/应该高于 30?
- 我如何才能找到最佳数量(即,通常不会导致查询速度变慢的最大子项数量)?我不太确定 Sphinx 会记录哪些类型的信息
query.log
。是否有一个工具可以用来确定查询速度是否正在变慢(由于并行查询太多),如果没有,查询是 CPU 密集型还是内存密集型(或者我应该完全查看其他值)?