欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

記一次MongoDB性能問題(從MySQL遷移到MongoDB)

 更新時間:2017年03月22日 15:53:30   投稿:mdxy-dxy  
最近忙著把一個項目從MySQL遷移到MongoDB,在導入舊數(shù)據(jù)的過程中,遇到了些許波折,犯了不少錯誤,但同時也學到了不少知識,遂記錄下來,需要的朋友可以參考下

公司為這個項目專門配備了幾臺高性能務(wù)器,清一色的雙路四核超線程CPU,外加32G內(nèi)存,運維人員安裝好MongoDB后,就交我手里了,我習慣于在使用新服務(wù)器前先看看相關(guān)日志,了解一下基本情況,當我瀏覽MongoDB日志時,發(fā)現(xiàn)一些警告信息:

WARNING: You are running on a NUMA machine. We suggest launching mongod like this to avoid performance problems: numactl –interleave=all mongod [other options]

當時我并不太清楚NUMA是什么東西,所以沒有處理,只是把問題反饋給了運維人員,后來知道運維人員也沒有理會這茬兒,所以問題的序幕就這樣拉開了。

遷移工作需要導入舊數(shù)據(jù)。MongoDB本身有一個mongoimport工具可供使用,不過它只接受json、csv等格式的源文件,不適合我的需求,所以我沒用,而是用PHP寫了一個腳本,平穩(wěn)運行了一段時間后,我發(fā)現(xiàn)數(shù)據(jù)導入的速度下降了,同時PHP拋出異常:

cursor timed out (timeout: 30000, time left: 0:0, status: 0)

我一時判斷不出問題所在,想想先在PHP腳本里加大Timeout的值應(yīng)付一下:

<?php
MongoCursor::$timeout = -1;
?>

可惜這樣并沒有解決問題,錯誤反倒變著花樣的出現(xiàn)了:

max number of retries exhausted, couldn't send query, couldn't send query: Broken pipe

接著使用strace跟蹤了一下PHP腳本,發(fā)現(xiàn)進程卡在了recvfrom操作上:

shell> strace -f -r -p <PID>
recvfrom(<FD>,

通過如下命令查詢recvfrom操作的含義:

shell> apropos recvfrom
receive a message from a socket

或者按照下面的方式確認一下:

shell> lsof -p <PID>
shell> ls -l /proc/<PID>/fd/<FD>

此時如果查詢MongoDB的當前操作,會發(fā)現(xiàn)幾乎每個操作會消耗大量的時間:

mongo> db.currentOp()

與此同時,運行mongostat的話,結(jié)果會顯示很高的locked值。

我在網(wǎng)絡(luò)上找到一篇:MongoDB Pre-Splitting for Faster Data Loading and Importing,看上去和我的問題很類似,不過他的問題實質(zhì)是由于自動分片導致數(shù)據(jù)遷移所致,解決方法是使用手動分片,而我并沒有使用自動分片,自然不是這個原因。

詢問了幾個朋友,有人反映曾遇到過類似的問題,在他的場景里,問題的主要原因是系統(tǒng)IO操作繁忙時,數(shù)據(jù)文件預(yù)分配堵塞了其它操作,從而導致雪崩效應(yīng)。

為了驗證這種可能,我搜索了一下MongoDB日志:

shell> grep FileAllocator /path/to/log
[FileAllocator] allocating new datafile ... filling with zeroes...
[FileAllocator] done allocating datafile ... took ... secs

我使用的文件系統(tǒng)是ext4(xfs也不錯 ),創(chuàng)建數(shù)據(jù)文件非常快,所以不是這個原因,但如果有人使用ext3,可能會遇到這類問題,所以還是大概介紹一下如何解決:

MongoDB按需自動生成數(shù)據(jù)文件:先是<DB>.0,大小是64M,然后是<DB>.1,大小翻番到128M,到了<DB>.5,大小翻番到2G,其后的數(shù)據(jù)文件就保持在2G大小。為了避免可能出現(xiàn)的問題,可以采用事先手動創(chuàng)建數(shù)據(jù)文件的策略:

#!/bin/sh

DB_NAME=$1

cd /path/to/$DB_NAME

for INDEX_NUMBER in {5..50}; do
  FILE_NAME=$DB_NAME.$INDEX_NUMBER

  if [ ! -e $FILE_NAME ]; then
    head -c 2146435072 /dev/zero > $FILE_NAME
  fi
done

注:數(shù)值2146435072并不是標準的2G,這是INT整數(shù)范圍決定的。

最后一個求助方式就是官方論壇了,那里的國際友人建議我檢查一下是不是索引不佳所致,死馬當活馬醫(yī),我激活了Profiler記錄慢操作:

mongo> use <DB>
mongo> db.setProfilingLevel(1);

不過結(jié)果顯示基本都是insert操作(因為我是導入數(shù)據(jù)為主),本身就不需要索引:

mongo> use <DB>
mongo> db.system.profile.find().sort({$natural:-1})

問題始終沒有得到解決,求人不如求己,我又重復(fù)了幾次遷移舊數(shù)據(jù)的過程,結(jié)果自然還是老樣子,但我發(fā)現(xiàn)每當出問題的時候,總有一個名叫irqbalance的進程CPU占用率居高不下,搜索了一下,發(fā)現(xiàn)很多介紹irqbalance的文章中都提及了NUMA,讓我一下子想起之前在日志中看到的警告信息,我勒個去,竟然繞了這么大一個圈圈!安下心來仔細翻閱文檔,發(fā)現(xiàn)官方其實已經(jīng)有了相關(guān)介紹,按如下設(shè)置搞定:

shell> echo 0 > /proc/sys/vm/zone_reclaim_mode
shell> numactl --interleave=all mongod [options]

關(guān)于zone_reclaim_mode內(nèi)核參數(shù)的說明,可以參考官方文檔。

注:從MongoDB1.9.2開始:MongoDB會在啟動時自動設(shè)置zone_reclaim_mode。

至于NUMA的含義,簡單點說,在有多個物理CPU的架構(gòu)下,NUMA把內(nèi)存分為本地和遠程,每個物理CPU都有屬于自己的本地內(nèi)存,訪問本地內(nèi)存速度快于訪問遠程內(nèi)存,缺省情況下,每個物理CPU只能訪問屬于自己的本地內(nèi)存。對于MongoDB這種需要大內(nèi)存的服務(wù)來說就可能造成內(nèi)存不足,NUMA的詳細介紹,可以參考老外的文章。

理論上,MySQL、Redis、Memcached等等都可能會受到NUMA的影響,需要留意。

相關(guān)文章

  • mongodb操作的模塊手動封裝

    mongodb操作的模塊手動封裝

    這篇文章主要介紹了mongodb操作的模塊手動封裝的相關(guān)資料,這里提供實例幫助大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-08-08
  • mongodb增刪改查詳解_動力節(jié)點Java學院整理

    mongodb增刪改查詳解_動力節(jié)點Java學院整理

    這篇文章主要介紹了mongodb增刪改查詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • mongodb權(quán)限設(shè)置之添加管理員、普通用戶的方法

    mongodb權(quán)限設(shè)置之添加管理員、普通用戶的方法

    這篇文章主要介紹了mongodb添加管理員、普通用戶的方法,同時介紹了mongodb開啟權(quán)限認證后PHP客戶端的兩種連接方法,需要的朋友可以參考下
    2014-06-06
  • MongoDB的安裝方法圖文詳細

    MongoDB的安裝方法圖文詳細

    MongoDB?是一個基于分布式文件存儲的數(shù)據(jù)庫,主要用于為?web?應(yīng)用提供可擴展的高性能數(shù)據(jù)存儲解決方案,這里簡單介紹一下安裝方法
    2023-06-06
  • MongoDB數(shù)據(jù)庫性能監(jiān)控詳解

    MongoDB數(shù)據(jù)庫性能監(jiān)控詳解

    MongoDB作為圖片和文檔的存儲數(shù)據(jù)庫,為啥不直接存MySQL里,還要搭個MongoDB集群,麻不麻煩?這篇文章就帶你介紹MongoDB數(shù)據(jù)庫性能監(jiān)控,感興趣的同學可以參考閱讀
    2023-03-03
  • 關(guān)于NoSQL之MongoDB的一些總結(jié)

    關(guān)于NoSQL之MongoDB的一些總結(jié)

    這篇文章主要介紹了關(guān)于NoSQL之MongoDB的一些總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2015-07-07
  • MongoDB快速翻頁的方法

    MongoDB快速翻頁的方法

    這篇文章主要為大家詳細介紹了MongoDB快速翻頁的方法,通過實例學習在MongoDB中翻閱數(shù)據(jù)的不同方式,感興趣的小伙伴們可以參考一下
    2016-05-05
  • MongoDB在Linux系統(tǒng)中的安裝與配置指南

    MongoDB在Linux系統(tǒng)中的安裝與配置指南

    在這篇文章中,我們將介紹如何在CentOS 7服務(wù)器上安裝MongoDB,并通過DataX將數(shù)據(jù)從MongoDB遷移到MySQL數(shù)據(jù)庫,這將包括MongoDB的安裝、配置、數(shù)據(jù)準備以及使用DataX進行數(shù)據(jù)遷移的詳細步驟
    2024-09-09
  • Mongodb如何開啟用戶訪問控制詳解

    Mongodb如何開啟用戶訪問控制詳解

    默認啟動 MongoDB 服務(wù)時沒有任何參數(shù),可以對數(shù)據(jù)庫任意操 作,而且可以遠程訪問數(shù)據(jù)庫,所以推薦開發(fā)階段可以不設(shè)置任何參數(shù),但對于生產(chǎn)環(huán)境還是要仔細考慮一下安全方面的因素,下面就介紹了Mongodb開啟用戶訪問控制的相關(guān)資料。
    2017-01-01
  • 關(guān)于單臺MongoDB實例開啟Oplog的過程詳解

    關(guān)于單臺MongoDB實例開啟Oplog的過程詳解

    這篇文章主要給大家介紹了關(guān)于單臺MongoDB實例開啟Oplog的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-09-09

最新評論