Amazon-Ec2

在 ec2 架構上提高 sphinx 搜尋性能

  • August 15, 2013

我正在處理 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 - 字元串 第三個 id - 字元串

我正在索引 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

獅身人面像會議 -

{
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
}‏

您對提高查詢速度有什麼建議或建議嗎?如果您需要任何其他資訊,請詢問,我會附上。

謝謝!

TL / 博士

這是我的建議的摘要(有關更多解釋,請參閱下面的標題)

  • 生成有關您的 DiskIO/記憶體/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) instead of 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/

此外,您還可以獲得一個獎勵:一旦您為分佈式搜尋配置伺服器,您也可以並行進行索引!

注意事項:雖然這種技術將改進大多數類型的搜尋查詢,但有些不會從並行執行中受益匪淺。

如果數據節點將大量數據返回到後處理,聚合器由於其單執行緒特性很可能成為瓶頸

引用自:https://serverfault.com/questions/530354