最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

公司為這個(gè)項(xiàng)目專門配備了幾臺(tái)高性能務(wù)器,清一色的雙路四核超線程CPU,外加32G內(nèi)存,運(yùn)維人員安裝好MongoDB后,就交我手里了,我習(xí)慣于在使用新服務(wù)器前先看看相關(guān)日志,了解一下基本情況,當(dāng)我瀏覽MongoDB日志時(shí),發(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]

當(dāng)時(shí)我并不太清楚NUMA是什么東西,所以沒(méi)有處理,只是把問(wèn)題反饋給了運(yùn)維人員,后來(lái)知道運(yùn)維人員也沒(méi)有理會(huì)這茬兒,所以問(wèn)題的序幕就這樣拉開(kāi)了。

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

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

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

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

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

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

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

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

通過(guò)如下命令查詢r(jià)ecvfrom操作的含義:

shell> apropos recvfrom
receive a message from a socket

或者按照下面的方式確認(rèn)一下:

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

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

mongo> db.currentOp()

與此同時(shí),運(yùn)行mongostat的話,結(jié)果會(huì)顯示很高的locked值。

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

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

為了驗(yàn)證這種可能,我搜索了一下MongoDB日志:

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

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

MongoDB按需自動(dòng)生成數(shù)據(jù)文件:先是<DB>.0,大小是64M,然后是<DB>.1,大小翻番到128M,到了<DB>.5,大小翻番到2G,其后的數(shù)據(jù)文件就保持在2G大小。為了避免可能出現(xiàn)的問(wèn)題,可以采用事先手動(dòng)創(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并不是標(biāo)準(zhǔn)的2G,這是INT整數(shù)范圍決定的。

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

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

不過(guò)結(jié)果顯示基本都是insert操作(因?yàn)槲沂菍?dǎo)入數(shù)據(jù)為主),本身就不需要索引:

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

問(wèn)題始終沒(méi)有得到解決,求人不如求己,我又重復(fù)了幾次遷移舊數(shù)據(jù)的過(guò)程,結(jié)果自然還是老樣子,但我發(fā)現(xiàn)每當(dāng)出問(wèn)題的時(shí)候,總有一個(gè)名叫irqbalance的進(jìn)程CPU占用率居高不下,搜索了一下,發(fā)現(xiàn)很多介紹irqbalance的文章中都提及了NUMA,讓我一下子想起之前在日志中看到的警告信息,我勒個(gè)去,竟然繞了這么大一個(gè)圈圈!安下心來(lái)仔細(xì)翻閱文檔,發(fā)現(xiàn)官方其實(shí)已經(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ù)的說(shuō)明,可以參考官方文檔。

注:從MongoDB1.9.2開(kāi)始:MongoDB會(huì)在啟動(dòng)時(shí)自動(dòng)設(shè)置zone_reclaim_mode。

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

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

相關(guān)文章

  • MongoDB創(chuàng)建用戶報(bào)錯(cuò)command createUser requires authentication的解決方法

    MongoDB創(chuàng)建用戶報(bào)錯(cuò)command createUser requires auth

    這篇文章主要介紹了MongoDB創(chuàng)建用戶報(bào)錯(cuò)command createUser requires authentication的解決方法,文中通過(guò)代碼和圖文講解的非常詳細(xì),對(duì)大家的解決問(wèn)題有一定的幫助,需要的朋友可以參考下
    2024-09-09
  • MongoDB 3.4配置文件避免入坑的注意事項(xiàng)

    MongoDB 3.4配置文件避免入坑的注意事項(xiàng)

    最近在配置mongodb的時(shí)候遇到了一些問(wèn)題,現(xiàn)總結(jié)出來(lái)方便以后需要或同樣遇到該問(wèn)題的朋友們參考,下面這篇文章主要給大家介紹了關(guān)于MongoDB 3.4配置文件時(shí)避免入坑的兩個(gè)注意事項(xiàng),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)下吧。
    2017-09-09
  • Mongodb 如何將時(shí)間戳轉(zhuǎn)換為年月日日期

    Mongodb 如何將時(shí)間戳轉(zhuǎn)換為年月日日期

    這篇文章主要介紹了Mongodb 如何將時(shí)間戳轉(zhuǎn)換為年月日日期,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 解決MongoDB占用內(nèi)存過(guò)大頻繁死機(jī)的方法詳解

    解決MongoDB占用內(nèi)存過(guò)大頻繁死機(jī)的方法詳解

    這篇文章主要介紹了解決MongoDB占用內(nèi)存過(guò)大頻繁死機(jī)的方法詳解,需要的朋友可以參考下
    2020-02-02
  • MongoDB中MapReduce的使用方法詳解

    MongoDB中MapReduce的使用方法詳解

    MapReduce應(yīng)該算是MongoDB操作中比較復(fù)雜的了,下面這篇文章主要給大家介紹了關(guān)于MongoDB中MapReduce使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起看看吧。
    2017-12-12
  • MongoDB數(shù)據(jù)庫(kù)基本概念解析

    MongoDB數(shù)據(jù)庫(kù)基本概念解析

    這篇文章介紹了MongoDB數(shù)據(jù)庫(kù)的一些基本概念,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • MongoDB游標(biāo)超時(shí)問(wèn)題的4種解決方法

    MongoDB游標(biāo)超時(shí)問(wèn)題的4種解決方法

    這篇文章主要給大家介紹了關(guān)于MongoDB游標(biāo)超時(shí)問(wèn)題的4種解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MongoDB具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Ubuntu 18.04安裝MongoDB 4.0 的教程詳解

    Ubuntu 18.04安裝MongoDB 4.0 的教程詳解

    這篇文章主要介紹了Ubuntu 18.04安裝MongoDB 4.0 的教程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • mongodb root用戶創(chuàng)建數(shù)據(jù)庫(kù)提示not master的解決

    mongodb root用戶創(chuàng)建數(shù)據(jù)庫(kù)提示not master的解決

    這篇文章主要介紹了mongodb root用戶創(chuàng)建數(shù)據(jù)庫(kù)提示not master的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2023-02-02
  • 深入理解MongoDB的復(fù)合索引

    深入理解MongoDB的復(fù)合索引

    對(duì)于MongoDB的多鍵查詢,創(chuàng)建復(fù)合索引可以有效提高性能。這篇文章主要給大家介紹了關(guān)于MongoDB復(fù)合索引的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2018-03-03

最新評(píng)論

邵阳县| 蛟河市| 吴堡县| 宜章县| 汶川县| 盐池县| 瓦房店市| 辽源市| 和田市| 新巴尔虎左旗| 湘潭市| 大化| 和政县| 沅江市| 修文县| 黑山县| 陆良县| 阿尔山市| 九龙坡区| 辛集市| 松桃| 博客| 海阳市| 咸宁市| 中卫市| 贡觉县| 萨迦县| 阳谷县| 宾阳县| 台湾省| 伊吾县| 镇沅| 贵港市| 洛阳市| 仁怀市| 宣城市| 平阴县| 治多县| 镇巴县| 开封县| 祁连县|