2016-07-26 96 views
1

美好的一天,首先感謝提供任何指導。PHP MongoDB性能下降

最近我開始有一個服務問題,我運行在高峯時間給503錯誤。我在PHP(5.4)/ MongoDB(2.4)驅動的API中運行該服務。在高峯時間延遲期間,接下來連接了mongostat和mongotop。

enter image description here

enter image description here

enter image description here

上mongostat和mongotop的時間戳是不太在同一時間,但在同一停機期間確實發生了,他們和我會考慮安全的假設,它是一個有效的表示。

該平臺託管在Openshift(Web服務器和數據庫)。

我覺得好奇的是連接數量和(qr | ar)與正在執行的查詢數量。考慮到在這種情況下索引的使用是最佳的(idx miss%爲零?)。

我可能會誤解輸出,但問題可能在哪裏? PHP的mongodb驅動程序和連接的數量打開? PHP應用程序源代碼中的缺陷?

有沒有人遇到類似的問題?最好的行動是什麼?

我想增加允許的最大連接數,但MongoDB的默認值似乎更高,我不認爲這會有所幫助。我也無能爲力,因爲如何處理大量排隊閱讀的客戶端,以及在執行查詢量較低時高活動讀取的高峯。

再次感謝您。

+0

你使用Oplog嗎? – Dude

+0

不,我們沒有使用oplog。數據庫不分片也不復制。 –

回答

1

事實證明這是一個糟糕的索引問題。如果您在頂部檢查mongostat,您會看到每秒完成1-100個查詢,我們已經打開了400多個連接,並且有大量的請求。通過檢查與最常用的集合相關的查詢(檢查mongotop),我們發現在我們的push_notifications集合中存在被錯誤值編入索引的查詢。由於某種原因(不知道),php mongo驅動程序開始創建連接,查詢排隊,內存達到峯值,系統總體變慢。

修復代碼並重新排列代碼中的查詢字段並在數據庫中插入適當的索引後,我們開始看到更好的性能,並且沒有連接溢出。

結論:雖然在PHP中使用mongostat和mongotop來分析哪些是最常用的集合,請檢查您的代碼並嘗試優化索引和查詢字段的順序。