mongodb 利用率高如何解決?
Step1: 分析資料庫正在執行的請求
db.currentOp()
client:請求是由哪個客戶端發起的?
opid:操作的opid,有需要的話,可以透過 db.killOp(opid) 直接幹掉的操作
secs_running/microsecs_running: 這個值重點關注,代表請求執行的時間,如果這個值特別大,就得注意了,看看請求是否合理
query/ns: 這個能看出是對哪個集合正在執行什麼操作
lock*:還有一些跟鎖相關的引數
Step2:分析資料庫慢請求
MongoDB 支援 profiling 功能,將請求的執行情況記錄到同DB下的 system.profile 集合裡,profiling 有3種模式
profiling 設定文件在這裡,多看官網文件
關閉 profiling
針對所有請求開啟 profiling,將所有請求的執行都記錄到 system.profile 集合
針對慢請求 profiling,將超過一定閾值的請求,記錄到system.profile 集合
預設請求下,MongoDB 的 profiling 功能是關閉,生產環境建議開啟,慢請求閾值可根據需要定製,如不確定,直接使用預設值100ms。
設定100ms的慢請求
db.setProfilingLevel(1, { slowms: 100 })
在開啟了慢請求 profiling 的情況下(MongoDB 雲資料庫是預設開啟慢請求 profiling的),我們對慢請求的內容進行分析,來找出可最佳化的點,常見的包括。
profiling的結果輸出含義在這裡,多看官網文件
CPU殺手1:全表掃描
全集合(表)掃描 COLLSCAN,當一個查詢(或更新、刪除)請求需要全表掃描時,是非常耗CPU資源的,所以當你在 system.profile 集合 或者 日誌檔案發現 COLLSCAN 關鍵字時,就得注意了,很可能就是這些查詢吃掉了你的 CPU 資源;確認一下,如果這種請求比較頻繁,最好是針對查詢的欄位建立索引來最佳化。
一個查詢掃描了多少文件,可檢視 system.profile 裡的 docsExamined 的值,該值越大,請求CPU開銷越大。
> 關鍵字:COLLSCAN、 docsExamined
CPU殺手2:不合理的索引
有的時候,請求即使查詢走了索引,執行也很慢,通常是因為合理建立不太合理(或者是匹配的結果本身就很多,這樣即使走索引,請求開銷也不會最佳化很多)
如下所示,假設某個集合的資料,x欄位的取值很少(假設只有1、2),而y欄位的取值很豐富。
{ x: 1, y: 1 }
{
{ x: 1, y: 2 }
{
{ x: 1, y: 3 }
.
......
{
{ x: 1, y: 100000}
{
{ x: 2, y: 1 }
{
{ x: 2, y: 2 }
{
{ x: 2, y: 3 }
.
......
{
{ x: 1, y: 100000}
要服務 {x: 1: y: 2} 這樣的查詢
db.createIndex( {y: 1 } ) 效果好,因為y相同取值很少
d
db.createIndex( {y: 1, x: 1 } ) 效果好,因為y相同取值少
一個走索引的查詢,掃描了多少條索引,可檢視 system.profile 裡的 keysExamined 欄位,該值越大,CPU 開銷越大。
>關鍵字:IXSCAN、keysExamined
CPU殺手3:大量資料排序
當查詢請求裡包含排序的時候,如果排序無法透過索引滿足,MongoDB 會在記憶體李結果進行排序,而排序這個動作本身是非常耗 CPU 資源的,最佳化的方法仍然是建立索引,對經常需要排序的欄位,建立索引。
當你在 system.profile 集合 或者 日誌檔案發現 SORT 關鍵字時,就可以考慮透過索引來最佳化排序。當請求包含排序階段時, system.profile 裡的 hasSortStage 欄位會為 true。
> 關鍵字:SORT、hasSortStage
======================MongodDB shard key片鍵選擇=====================
主要考慮key的「離散度」以及「頻率」,離散度越高越好,能更好的分散資料;頻率越低越好,避免出現熱點;
===========MongoDB 連線串樣例========================
正確連線分片叢集的姿勢
要正確連線複製集,需要先了解下MongoDB的Connection String URI,所有官方的driver都支援以 Connection String 的方式來連線 MongoDB 分片叢集。
下面就是Connection String包含的主要內容
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
mongodb:// 字首,代表這是一個Connection String
username:password@ 如果啟用了鑑權,需要指定使用者密碼
hostX:portX 多個 mongos 的地址列表
/database 鑑權時,使用者帳號所屬的資料庫
?options 指定額外的連線選項
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28211342/viewspace-2213186/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mongodb資料庫連結失敗如何解決MongoDB資料庫
- CPU利用率過高的原因
- win10 c盤利用率總是時不時的佔用100%如何解決Win10
- 爬蟲IP重複率高如何解決?爬蟲
- Mongodb高階更新MongoDB
- Mongodb高階特性MongoDB
- MySQL高可用(二)主備延時如何解決?MySql
- ❖ MongoDB 高階查詢MongoDB
- Mongodb高階查詢MongoDB
- MongoDB ( 五 )高階_索引MongoDB索引
- 深圳辦公室出租,空間合理利用率高
- 如何解決linux系統平均負載高(load average)Linux負載
- 如何解決公網無法訪問阿里雲ECS搭建的MongoDB服務阿里MongoDB
- MongoDB高可用叢集搭建MongoDB
- 高可用mongodb叢集(分片+副本)MongoDB
- mysql中CPU或記憶體利用率過高問題MySql記憶體
- win10解析度太高無限黑屏如何解決_win10解析度調高後黑屏如何解決Win10
- SQL Server CPU 利用率毛刺的分析定位與解決SQLServer
- MongoDB ( 四 )高階_find修飾符MongoDB
- 高頻面試:如何解決MySQL主從複製延時問題面試MySql
- 伺服器負載過高的原因是什麼?如何解決?伺服器負載
- SpringBoot高階篇MongoDB之如何新增文件Spring BootMongoDB
- 理解pytorch幾個高階選擇函式(如gather)PyTorch函式
- win10system佔用磁碟高怎麼辦_win10system佔用cpu高如何解決Win10
- mongodb埠占用怎麼解決MongoDB
- Win10系統中LSAISO程式CPU使用率過高如何解決Win10AI
- Win10系統Runtimebroker.exe程式佔用cpu非常高如何解決Win10
- win10系統Antimalware Service Executable程式佔用cpu過高如何解決Win10
- win10系統下wmiproviderhost程式佔用大量cpu過高如何解決Win10IDE
- 嘔吐、腹瀉……高發的諾如病毒預防難?
- 豪安能源助推業績高增長 沐邦高科稱光伏業務產能利用率較高
- 『MySQL』搞懂 InnoDB 鎖機制 以及 高併發下如何解決超賣問題MySql
- 恆訊科技分析:如何解決SQL Server CPU使用率過高的問題?SQLServer
- 美國伺服器延遲高怎麼辦,如何解決延遲問題伺服器
- mongodb find報錯怎麼解決MongoDB
- 如何解決pycharm報錯PyCharm
- SpringBoot高階篇MongoDB之修改基本使用姿勢Spring BootMongoDB
- MongoDB高階應用之高可用方案實戰(4)MongoDB