TL/DR

TL/DR

我正在 ec2 中处理 m1.large 实例。

m1.large 64 位

vCPU -2
ECU-4
Memory -7.5GB 
DIsks-2 x 420 
EBS-Optimized - Yes 
Network performance: Moderate

索引文件位于具有 500(承诺)IOPS 的 EBS 块上。

我有一个索引由 3 个属性组成 id - uint 第二个 id - string 第三个 id - string

我正在索引 3 个大型文本字段。

索引文件大小:

spa - 68mb
spd - 8.8 gb
sph - 567 bytes
spi - 88 mb
spp - 20gb
sps - 36mb

我的目标是达到每个查询大约 0.1 秒,但是目前我很难实现这个目标。

以下是查询日志 -

必须屏蔽查询,将每个字母改为“x”

[Mon Aug 12 06:34:17.569 2013] 0.306 sec [ext2/0/ext 33074 (0,40)] [Index_1] [ios=2891
kb=101461.1 ioms=32.8 cpums=306.5] xxx xxxxxxxxx xxxxx
[Mon Aug 12 06:34:43.105 2013] 0.155 sec [ext2/0/ext 55208 (0,40)] [Index_1] [ios=256
kb=10974.0 ioms=42.7 cpums=120.1] xxxxxx xxx
[Mon Aug 12 06:37:43.063 2013] 0.148 sec [ext2/0/ext 122 (0,40)] [Index_1] [ios=257
kb=17985.1 ioms=6.1 cpums=148.9] xxxxxxxxx xxx xxxxxxxxx xxxx xxxxx xxxx xx xxxxx
[Mon Aug 12 07:00:18.735 2013] 0.179 sec [ext2/0/ext 1409 (0,40)] [Index_1] [ios=246
kb=9872.1 ioms=139.3 cpums=48.3] xxxxxxx xxx xxxxxxx
[Mon Aug 12 07:00:40.811 2013] 2.395 sec [ext2/0/ext 54213 (0,40)] [Index_1] [ios=2360
kb=92897.0 ioms=2004.9 cpums=458.9] xxxx xxxx xxxxxx
[Mon Aug 12 07:04:49.447 2013] 0.358 sec [ext2/0/ext 17698 (0,40)] [Index_1] [ios=696
kb=26975.8 ioms=237.0 cpums=140.2] xxxxx xxxxxx xxxx xxxxx
[Mon Aug 12 07:05:29.542 2013] 0.041 sec [ext2/0/ext 0 (0,40)] [Index_1] [ios=8 kb=1606.5
ioms=26.3 cpums=16.8] xxxxxxxx xxxxxxx xxx xxxxxxxx
[Mon Aug 12 07:05:40.208 2013] 0.244 sec [ext2/0/ext 72176 (0,40)] [Index_1] [ios=376
kb=15216.4 ioms=41.1 cpums=214.0] xxxxxxxx xxxxxxxx xxxxxxxx
[Mon Aug 12 07:13:28.726 2013] 10.177 sec [ext2/0/ext 703 (0,40)] [Index_1] [ios=6235
kb=294854.2 ioms=8724.6 cpums=1723.4] x xxxxx xxxxxxx xxxxxxx xx xxxx xxxxxxx, xxxxxxxxx
a xxxxx xxxxxxx xxxxxx, a xxxxxxx xxxxxxx xxxxxxx xx xxxx xxxxxxxx xxxxxxx xx xxxx xxxxx
xxxxxx xxxxxx
[Mon Aug 12 07:14:16.458 2013] 1.522 sec [ext2/0/ext 703 (0,40)] [Index_1] [ios=6235
kb=294854.2 ioms=100.1 cpums=1523.6] a xxxxx xxxxxxx xxxxxxx xx xxxx xxxxxxx, xxxxxxxxx a
xxxxx xxxxxxx xxxxxx, a xxxxxxx xxxxxxx xxxxxxx xx xxxx xxxxxxxx xxxxxxx xx xxxx xxxxx
xxxxxxx xxxxxx
[Mon Aug 12 07:36:47.737 2013] 1.391 sec [ext2/0/ext 727 (0,40)] [Index_1] [ios=5899
kb=269990.2 ioms=161.8 cpums=1320.6] a xxxxx xxxxxxx xxxxxxx xx xxxx xxxxxxx, xxxxxxxxx a
xxxxx xxxxxxx xxxxxx, a xxxxxxx xxxxxxx xxxxxxx xx xxxx xxxxxxx xxxxx xxxxxx xxxxxx
[Mon Aug 12 07:38:12.832 2013] 1.325 sec [ext2/0/ext 140830 (0,40)] [Index_1] [ios=3264
kb=120011.3 ioms=737.1 cpums=652.5] a xxxxx xxxxxxx xxxxxxx xx xxxx

sphinx 会议 -

{
source = DB
path = /home/ubuntu/sphinx_drive/sphinxdata/index/IndexMain
docinfo = extern
charset_type = sbcs
stopwords = /home/ubuntu/sphinx_drive/sphinxdata/stopwords
morphology = stem_en
min_word_len = 3
html_strip = 1
}


searchd
{
mysql_version_string = 5.0.37
listen = 0.0.0.0:9999:mysql41
log = /home/ubuntu/sphinx_drive/sphinxdata/log/searchd.log
query_log = /home/ubuntu/sphinx_drive/sphinxdata/log/query.log
read_timeout = 5
max_children = 30
pid_file = /home/ubuntu/sphinx_drive/sphinxdata/searchd.pid
max_matches = 1000
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
workers = threads
binlog_path = /home/ubuntu/sphinx_drive/sphinxdata/data
compat_sphinxql_magics = 0
}‏

您对提高查询速度有什么建议或推荐吗?如果您需要任何其他信息,请提出,我会附上。

谢谢!

答案1

TL/DR

以下是我的建议总结(请参阅下面的标题了解更多解释)

  • 生成有关磁盘 IO/内存/CPU 使用情况的统计数据
  • 尝试更多的 IOPS,这对查询时间有显著影响吗?
  • Sphinx 当前使用了多少内存?
  • 调查问题查询(打开详细日志记录)
  • 充分利用同一台计算机上的多个 CPU 核心

收集有用的信息

您是否检查过 EC2 的性能,以了解它可能在哪些方面存在问题(如果有的话)?我认为 DiskIO、内存、CPU 是值得检查的良好指标。

在这种情况下,看看增加 IOPS 是否会显著提高性能会很有趣,您是否尝试过几个不同的 IOPS 值来查看如何提高性能?

内存 - 我估计你使用的内存远少于 7GB

http://sphinxsearch.com/blog/2011/11/11/sphinx-memory-consumption/

本文计算内存时不包括 .spd 和 .spp 文件。因此您的内存消耗应该在 200MB 左右。

您可能还需要考虑 rt_mem_limit 和 mem_limit。话虽如此,您消耗的内存似乎不太可能超过 7GB。

您可以使用以下命令确认内存使用情况SHOW INDEX myindex STATUS

有一个想法:如果您不需要那么多内存但可以使用更多 CPU,那么最好使用 2x c1.medium(0.183 美元)而不是 1x m1.large(0.320 美元)

追踪该查询

http://sphinxsearch.com/blog/2011/10/27/sphinx-performance-know-your-queries-time/

query_log_format = sphinxql
query_log = query.log

然后重新启动 Sphinx 守护进程,您将获得更多有用的输出。

这里的想法是使用这些数据并寻找问题的线索(一个特定的查询可能会导致问题,您可能想要尝试具体地优化它)。

多线程搜索 - 利用多个 CPU 核心

您可能需要研究 sphinx 分布式搜索功能,它可以为某些查询类型提供帮助。您可以对其进行配置,以充分利用 m1.large 中的两个 CPU 核心

http://www.mysqlperformanceblog.com/2013/01/16/sphinx-search-performance-optimization-multi-threaded-search/

此外,您还会获得额外奖励:一旦您为分布式搜索配置了服务器,您也可以并行进行索引!

...

需要注意的是:虽然这种技术可以改善大多数类型的搜索查询,但有些查询不会从并行执行中受益匪浅。

...

如果数据节点返回大量数据进行后期处理,聚合器可能会因其单线程特性而成为瓶颈

相关内容