2015-10-13 178 views
0

我在Ubuntu 12.04上使用Solr 5.2.1。我有大約25萬份索引文件。從所有文件中提取2個小字段大約需要2.5分鐘。 爲什麼需要這麼長時間,我能做些什麼來加快速度?爲了擺脫我在做的事情:我正在將solr文檔與MySQL記錄同步。執行此操作(處理刪除)的最簡單方法是將Solr中的所有內容與MySQL中的所有內容進行比較。爲什麼這個Solr查詢很慢?

http://localhost:8983/solr/[my集合] /選擇?Q = %3A & FL =字段1 & FL =場2 &行= 300000 &重量= JSON

如果我用捲曲取水的時候,我可以看到它的結果寫大約50KBps,比普通的本地http服務器文件慢,所以我知道這個問題必須在Solr內部。但爲什麼?令人驚訝的是,具有wt(寫入器類型,也稱爲響應格式)CSV的相同查詢同樣緩慢。看來Solr本身就是瓶頸。

我想這可能是由於我如何運行Solr,我相信它是默認選項。下面是從ps過程:

的java -server -Xss256k -Xms512m -Xmx512m -XX:NewRatio = 3 -XX:SurvivorRatio = 4 -XX:TargetSurvivorRatio = 90 -XX:MaxTenuringThreshold = 8 -XX:+ UseConcMarkSweepGC -XX :+ UseParNewGC -XX:ConcGCThreads = 4 -XX:ParallelGCThreads = 4 -XX:+ CMSScavengeBeforeRemark -XX:PretenureSizeThreshold = 64m -XX:+ UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction = 50 -XX:CMSMaxAbortablePrecleanTime = 6000 -XX:+ CMSParallelRemarkEnabled -XX :+ PrintRecProcEnabled -XX:CMSFullGCsBeforeCompaction = 1 -XX:CMSTriggerPermRatio = 80 -verbose:gc -XX:+ PrintHeapAtGC -XX:+ PrintGCDetails -XX:+ PrintGCDateStamps -XX:+ PrintGCTimeStamps -XX:+ PrintTenuringDistribution -XX:+ PrintGCApplicationStoppedTime - Xloggc:/home/tylercollier/solr/dist/server/logs/solr_gc.log -Djetty.port = 8983 -DSTOP.PORT = 7983 -DSTOP.KEY = solrrocks -Duser.timezone = UTC -Djetty.home =/home/Ť/home/tylercollier/solr/dist -jar start.jar -XX:OnOutOfMemoryError =/home/tylercollier/solr/dist/bin/oom_solr.sh 8983/home/tylercollier/solr/dist/server/logs --module = http

我即將嘗試使用內存大小this page。我仍然首先想在這裏提出這個問題,因爲我通常發現這些「猜測和檢查」設置的內存令人沮喪處理,因爲它與代碼和機器的情況有很大關係。但我會用我的發現報告。

UPDATE:將Xmx值從512m更改爲2g將時間從約150秒減少到約50秒。但進一步增加Xmx似乎沒有什麼區別(我嘗試過3g,4g)。改變Xss似乎沒有任何區別。它的默認值是256k,但是我嘗試了1m和5m。所以,在150秒內50秒是一個改進,但遠不及我想要的。 MySQL可以在2秒內給我這些結果。是什麼賦予了?

UPDATE 2:更改查詢以返回所有字段(而不是將其限制爲2個字段)對時間也沒有影響。這對我來說真的很令人驚訝。現在CURL傳輸速率約爲11 MB/s。我不相信Solr無法以更快的速度拉出自己的記錄。

UPDATE 3:有沒有其他人試過一次從Solr獲取這麼多文檔(無論是使用分頁還是一次讀取)?這對你來說也慢嗎?

+2

我想如果你只抓取所有的數據,你可以讀取數據mysql或使用lucene,solr不是數據倉庫,儘管你可以做到。可能是你可以嘗試solr頁面來讀取所有數據,行不要設置太大 –

+0

謝謝,但我沒有在數據存儲中使用它。我使用它來建立索引。在我的情況下,我試圖將Solr與MySQL同步。我在這個問題中的筆記討論了行大小不是瓶頸。 –

+2

您可以使用分頁並以塊的形式獲取數據。這會更快。如果你一次不需要所有的數據。 – YoungHobbit

回答

1

有一個專門的請求處理程序就是爲了這個目的,Export Request Handler

如果您需要檢索完整的查詢集,那可能是更好的解決方案。

Solr的最新版本中還有Streaming API support,如果您需要檢索大型結果集並在檢索時處理它,而不必一次爲整個集合分配內存,這可能是合適的。但是這僅限於支持DocValues的字段,因此在這種情況下可能不適用(如最後的註釋所示)。