下載吧 - 綠色安全的游戲和軟件下載中心

          軟件下載吧

          當前位置:軟件下載吧 > 數據庫 > DB2 > MongoDB磁盤IO問題的3種解決方法

          MongoDB磁盤IO問題的3種解決方法

          時間:2024-03-26 14:44作者:下載吧人氣:31

          IO概念

          在數據庫優化和存儲規劃過程中,總會提到IO的一些重要概念,在這里就詳細記錄一下,對這個概念的熟悉程度也決定了對數據庫與存儲優化的理解程度,以下這些概念并非權威文檔,權威程度肯定就不能說了。

          讀/寫IO,最為常見說法,讀IO,就是發指令,從磁盤讀取某段扇區的內容。指令一般是通知磁盤開始扇區位置,然后給出需要從這個初始扇區往后讀取的連續扇區個數,同時給出動作是讀,還是寫。磁盤收到這條指令,就會按照指令的要求,讀或者寫數據。控制器發出的這種指令+數據,就是一次IO,讀或者寫。

          大/小塊IO,指控制器的指令中給出的連續讀取扇區數目的多少,如果數目很大,比如128,64等等,就應該算是大塊IO,如果很小,比如1, 4,8等等,就應該算是小塊IO,大塊和小塊之間,沒有明確的界限。

          連續/隨機IO,連續和隨機,是指本次IO給出的初始扇區地址,和上一次IO的結束扇區地址,是不是完全連續的,或者相隔不多的,如果是,則本次IO應該算是一個連續IO,如果相差太大,則算一次隨機IO。連續IO,因為本次初始扇區和上次結束扇區相隔很近,則磁頭幾乎不用換道或換道時間極短;如果相差太大,則磁頭需要很長的換道時間,如果隨機IO很多,導致磁頭不停換道,效率大大降底。

          順序/并發IO,這個的意思是,磁盤控制器每一次對磁盤組發出的指令套(指完成一個事物所需要的指令或者數據),是一條還是多條。如果是一條,則控制器緩存中的IO隊列,只能一個一個的來,此時是順序IO;如果控制器可以同時對磁盤組中的多塊磁盤,同時發出指令套,則每次就可以執行多個IO,此時就是并發IO模式。并發IO模式提高了效率和速度。

          IO并發幾率。單盤,IO并發幾率為0,因為一塊磁盤同時只可以進行一次IO。對于raid0,2塊盤情況下,條帶深度比較大的時候(條帶太小不能并發IO,下面會講到),并發2個IO的幾率為1/2。其他情況請自行運算。

          IOPS。一個IO所用的時間=尋道時間+數據傳輸時間。 IOPS=IO并發系數/(尋道時間+數據傳輸時間),由于尋道時間相對傳輸時間,大幾個數量級,所以影響IOPS的關鍵因素,就是降底尋道時間,而在連續IO的情況下,尋道時間很短,僅在換磁道時候需要尋道。在這個前提下,傳輸時間越少,IOPS就越高。

          每秒IO吞吐量。顯然,每秒IO吞吐量=IOPS乘以平均IO SIZE。 Io size越大,IOPS越高,每秒IO吞吐量就越高。設磁頭每秒讀寫數據速度為V,V為定值。則IOPS=IO并發系數/(尋道時間+IO SIZE/V),代入,得每秒IO吞吐量=IO并發系數乘IO SIZE乘V/(V乘尋道時間+IO SIZE)。我們可以看出影響每秒IO吞吐量的最大因素,就是IO SIZE和尋道時間,IO SIZE越大,尋道時間越小,吞吐量越高。相比能顯著影響IOPS的因素,只有一個,就是尋道時間。

          MongoDB磁盤IO問題的3種解決方法

          1.使用組合式的大文檔

          我們知道MongoDB是一個文檔數據庫,其每一條記錄都是一個JSON格式的文檔。比如像下面的例子,每一天會生成一條這樣的統計數據:

            { metric: content_count, client: 5, value: 51, date: ISODate(2012-04-01 13:00) }

            { metric: content_count, client: 5, value: 49, date: ISODate(2012-04-02 13:00) }

          而如果采用組合式大文檔的話,就可以這樣將一個月的數據全部存到一條記錄里:

            { metric: content_count, client: 5, month: 2012-04, 1: 51, 2: 49, … }

          通過上面兩種方式存儲,預先一共存儲大約7GB的數據(機器只有1.7GB的內存),測試讀取一年信息,這二者的讀性能差別很明顯:

            第一種: 1.6秒

            第二種: 0.3秒

            那么問題在哪里呢?

          實際上原因是組合式的存儲在讀取數據的時候,可以讀取更少的文檔數量。而讀取文檔如果不能完全在內存中的話,其代價主要是被花在磁盤seek上,第一種存儲方式在獲取一年數據時,需要讀取的文檔數更多,所以磁盤seek的數量也越多。所以更慢。

          實際上MongoDB的知名使用者foursquare就大量采用這種方式來提升讀性能。

          2.采用特殊的索引結構

          我們知道,MongoDB和傳統數據庫一樣,都是采用B樹作為索引的數據結構。對于樹形的索引來說,保存熱數據使用到的索引在存儲上越集中,索引浪費掉的內存也越小。所以我們對比下面兩種索引結構:

            db.metrics.ensureIndex({ metric: 1, client: 1, date: 1}) 與 db.metrics.ensureIndex({ date: 1, metric: 1, client: 1 })

          標簽MongoDB,磁盤,IO,題的,3種,解決,方法

          相關下載

          查看所有評論+

          網友評論

          網友
          您的評論需要經過審核才能顯示

          熱門閱覽

          最新排行

          公眾號

          主站蜘蛛池模板: 亚洲天堂一区在线| 无码人妻av一区二区三区蜜臀 | 精品人妻少妇一区二区三区不卡| 四虎在线观看一区二区| 久久精品一区二区三区日韩| 日本美女一区二区三区| 中文字幕无码不卡一区二区三区| 中文字幕一区二区三区四区| 国产日韩精品一区二区在线观看 | 日韩一区二区三区射精| 精品一区二区三区免费观看| 国产亚洲福利精品一区二区| 亚洲av永久无码一区二区三区| 国产91精品一区二区麻豆网站| 久久99精品波多结衣一区| 久久综合精品国产一区二区三区| 白丝爆浆18禁一区二区三区| 日本在线视频一区二区三区| 国产午夜精品一区二区三区极品| 国产福利一区二区三区在线视频| 国产精品毛片一区二区三区| 亚洲综合无码AV一区二区| 夜夜嗨AV一区二区三区| 久久国产视频一区| 久久久久99人妻一区二区三区| 日韩精品一区二区三区四区| 一区二区三区无码视频免费福利| 国产亚洲一区区二区在线| 亚洲日本一区二区三区在线| 日本免费一区二区久久人人澡| 精品一区二区久久| 国产成人亚洲综合一区| 性色av闺蜜一区二区三区| 韩国精品福利一区二区三区| 国产婷婷色一区二区三区深爱网| 日韩精品一区二区三区在线观看| 日本在线观看一区二区三区| 国产成人高清视频一区二区| 精品日产一区二区三区手机| 亚洲国产福利精品一区二区| 韩国精品一区视频在线播放 |