2013-08-28 68 views
1

我有一個64G RAM的服務器,我正在運行一個腳本,它將csv文件中的一百萬個數據與數據庫進行比較。如果找到匹配項,則腳本僅在執行結束時輸出匹配數。每秒mongodb查詢

腳本跑時,需要3分鐘才能完成。測試5萬,11萬,3萬,5萬數據文件以及執行腳本的執行速率或速率是成比例的。服務器中有足夠的可用內存。下面粘貼腳本運行時的mongostat輸出。我的問題是,我相信該腳本每秒執行接近5000個查詢。我讀過很多文章,他們每秒平均得到5萬個查詢。這怎麼能實現?我的服務器運行Ubuntu,64位和24核心。

insert query update delete getmore command flushes mapped vsize res faults   locked db idx miss %  qr|qw ar|aw netIn netOut conn  time 
    *0 3885  *0  *0  0  1|0  0 12g 24.2g 64m  0 db_list_restore:0.0%   0  0|0  1|0 380k 142k  2 03:09:26 
    *0 4188  *0  *0  0  1|0  0 12g 24.2g 68m  0 db_list_restore:0.0%   0  0|0  0|0 410k 153k  2 03:09:27 
    *0 4462  *0  *0  0  1|0  0 12g 24.2g 72m  0 db_list_restore:0.0%   0  0|0  0|0 440k 163k  2 03:09:28 
    *0 4401  *0  *0  0  1|0  0 12g 24.2g 76m  0 db_list_restore:0.0%   0  0|0  0|0 435k 161k  2 03:09:29 
    *0 4368  *0  *0  0  2|0  0 12g 24.2g 81m  0 db_list_restore:0.0%   0  0|0  1|0 432k 160k  2 03:09:30 
    *0 4416  *0  *0  0  1|0  0 12g 24.2g 84m  0 db_list_restore:0.0%   0  0|0  1|0 437k 161k  2 03:09:31 
    *0 4245  *0  *0  0  1|0  0 12g 24.2g 89m  0 db_list_restore:0.0%   0  0|0  0|0 420k 155k  2 03:09:32 
    *0 4561  *0  *0  0  1|0  0 12g 24.2g 93m  0 db_list_restore:0.0%   0  0|0  1|0 451k 167k  2 03:09:33 
    *0 3920  *0  *0  0  1|0  0 12g 24.2g 97m  0 db_list_restore:0.0%   0  0|0  0|0 388k 144k  2 03:09:34 
    *0 4307  *0  *0  0  2|0  0 12g 24.2g 105m  0 db_list_restore:0.0%   0  0|0  0|0 426k 157k  2 03:09:35 
+0

它可能是每秒50K查詢,但不是每個腳本,我會嘗試在查詢中使用更多的$,在一天結束時PHP cna只運行這麼快,一次做很多事情,再加上驅動程序是同步不async – Sammaye

+0

感謝Sammaye,服務器端可以做什麼來加速性能? – user2709899

+0

我不這麼認爲,那個mongostat很乾淨,我可能會錯過一些東西,但我認爲這只是PHP在一天結束時的速度 – Sammaye

回答

1

這些數字對於執行所有工作的單個進程看起來相對合理 - 這取決於您當前正在執行哪種查詢。

一般情況下,您將擁有數千個網絡服務器進程(取決於您的應用程序工作負載和CPU數量,可能只有幾百個),這將產生流量 - 所以您將擁有數千個向服務器開放的套接字您可以獨立擴展您的基礎架構中的任何組件。

對於單個流程應用程序,您將陷入「等待循環」中,因爲每次只有很多個人資源需要執行,因此您將永遠無法通過一個流程最大限度地發揮潛力套接字,一項任務。你想要佔用你所有的資源。

要達到此目的,您希望儘可能地並行化您的工作流程。沒有預先確定的工人數量是正確的答案,所以每個流程應該做的工作量是你必須通過嘗試找出自己的事情。

如果您在CSV文件中有100萬個條目,您可能希望開始將工作分成10個方面,創建10個PHP進程以查找文件,並通過100.000條目讀取。 基準測試,然後可能嘗試100個進程,每個進程一次處理10.000個條目,並與之前的結果進行比較。