成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么說很多NoSQL的Benchmark是扯淡?

數據庫 其他數據庫
正如原作者所言,本文有標題黨之嫌,但確實道出了一個眾所周知的問題。就是很多NoSQL產品的官方 benchmark 過高。雖然本人并不完全同意作者的觀點,但是其不盲從輕信較勁的態度還是值得學習。

抱歉我用了這么一個標題黨的題目做為標題。

寫這篇文章只是想引起大家的注意:在選擇NoSQL產品時,達到標稱性能,需要諸多限制條件,例如本文主要討論的磁盤I/O。

現在NoSQL的產品已經很多了,很多都宣稱“我們的QPS可以達到十萬,甚至百萬”,但是當我們在生產環境中使用的時候,卻明顯的感覺到,隨著數據文件不斷增大,NoSQL的性能卻指數下降,問題處在哪里了?

這些NOSQL的Benchmark的量都有一個前提“你得內存足夠放下你的全部數據文件”

Case1:有人說,我內存16GB,那只能說明你得數據規模還不夠大……我已經經歷被無數上百GB的數據庫折磨過了。此外,你可能需要在1GB內存的虛擬機上支撐數10GB的數據,比如我現在的情況。

繼續討論,一旦內存放不下全部的數據,會怎么辦呢?

有很多策略,但無非都是訪問磁盤,將數據Cache到內存中。

我們先討論最壞的情況,假定每條記錄的偏移是放在內存中,但所有數據都放在磁盤,我們使用fseek等操作來查詢磁盤。

來看下面的測試代碼。

  1. void test_fseek_set() 
  2.     long offset; 
  3.     FILE*fp = NULL; 
  4.     long i; 
  5.  
  6.     fp = fopen(FILE_NAME, "r"); 
  7.     if(!fp) 
  8.     { 
  9.         printf("Open file fail.\n"); 
  10.         printf("%s\n",strerror(errno)); 
  11.         exit(-1); 
  12.     }    
  13.  
  14.     for(i=0; i<TIMES; i++) 
  15.     { 
  16.         //Because random max is 1<<30 - 1 
  17.         offset = random() * 10 % MAX_FILE; 
  18.         if(fseek(fp, offset, SEEK_SET)) 
  19.         { 
  20.             printf("fseek error.\n"); 
  21.             printf("%ld",offset); 
  22.             printf("%s\n",strerror(errno)); 
  23.         } 
  24.     }    
  25.  
  26.     fclose(fp); 

好了,你猜猜上述隨機fseek的程序在一個7200轉的硬盤上,針對一個4GB的文件隨機訪問,能跑多塊?

答案是QPS<=80。

有人說你騙人,我跑的能到1XXX,那么請你執行下述命令清空你內存中的磁盤緩存。

  1. sync; echo 3 > /proc/sys/vm/drop_caches 

很多時候,之所以我們能在小數據時達到NoSQL官方標稱的QPS,而大數據量卻指數下降,都是這些緩存在作怪。說白了,我們很Happy的Benchmark半天,實際是在玩系統的緩存,當然快了。

一旦你的數據文件大于內存磁盤緩存,那么速度會馬上像我列舉的這樣,不會多余80QPS,在一個4GB的文件上。

有人說mmap,我曾經也是這樣YY的,但根據我的測試,事情不是這樣。

我有一個120GB的Tokyo Cabinet數據文件,把內存開滿,它默認會用mmap,然后你會發現top中“VIRT”一列,會顯示為120GB+(換算后),而我得機器內存卻只 有32GB。這時,當你訪問恰好不在內存中的那部分數據時,操作系統會進行非常耗時的換入換出操作(首先就需要fseek等)。在這臺24核、32GB的 機器上,QPS勉強能達到3000(這已經遠遠低于標稱的QPS),而一旦清空緩存,QPS會迅速跌落到70左右……

可能還會有人說:我沒事閑的為啥要自己清空緩存?

機器不是給你一個NoSQL進程服務的,很多系統其他服務都需要訪問磁盤,讀取文件,漸漸的就會把你Cache起來的內存全部換掉,根據實際測試的 情況,一臺完全閑置的機器,開TT能達到3000, 閑置放置48小時(不開其他服務), 性能就會驟降到1000左右,再放置72小時左右,就回歸到70的qps了,此時Cache已經基本完全換出。

綜上,mmap不是神,因為你的內存不夠,而其他進程也會爭奪內存來做自己的Cache。

如果你想充分發揮NoSQL的性能,建議用支持集群的NoSQL產品,盡量將全部數據放入內存中。

或者你沒錢購置很多Moster內存的服務器,像我一樣,就不要期望NoSQL能有很驚人的性能了。此時,NoSQL所能帶來的提升,只是關系數據庫所剪掉的那部分開銷,如果你基本沒有什么join,那么可能還會不如關系數據庫。

分析性能,我們不能僅僅看官方的數據比較,要考慮機器的實際情況和自己的數據規模,最終才能分析出瓶頸出在哪里。

對于原作者的觀點,本人提出兩點看法:

  • 要充分發揮NoSQL性能,并不是一定要盡量把所有數據放到內存,實際上只要保證了熱數據都能裝在內存中就夠了。
  • 作者舉例中的程序,主要用了磁盤seek,磁盤的seek速度慢,原本就是磁盤物理結構的硬傷,所以許多NoSQL存儲采用了變隨機寫為順序寫的方式,減少磁盤seek操作,也是提升IO性能的良方。

【編輯推薦】

  1. MongoDB之父:MongoDB勝過BigTable
  2. 主流NoSQL數據庫全方位評測之MongoDB
  3. 教你如何利用MySQL學習MongoDB
  4. 在Windows環境下MongoDB搭建和簡單操作
  5. Mongodb源碼分析之Mongos分析
責任編輯:艾婧 來源: 開源中國社區
相關推薦

2022-03-14 08:33:09

TypeScriptJavaScript前端

2020-07-03 14:05:26

Serverless云服務商

2021-11-29 18:27:12

Web Wasmjs

2019-09-23 13:37:09

Anthos谷歌Kubernetes

2011-10-27 13:37:51

網頁設計

2023-05-05 16:26:33

2019-09-23 13:10:02

容器進程

2018-07-02 14:31:47

健康品牌

2019-01-18 15:01:17

云計算運維管理

2023-03-21 10:16:36

2023-05-04 07:44:13

編程界小語言Java

2021-02-25 14:09:55

人工智能數據機器學習

2018-01-23 11:48:17

Vue.js前端開發

2021-01-14 15:34:53

區塊鏈比特幣機器

2015-04-16 15:42:21

關系型數據庫NoSQL

2012-02-08 10:02:53

Web

2025-05-27 10:10:00

Java緩存開發

2011-05-05 08:51:18

PHP

2025-04-07 08:30:00

緩存Java開發

2017-10-02 11:53:17

數據庫SQLNoSQL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91xxx在线观看 | 国产一区二区三区四区五区加勒比 | 欧美一区二区三区在线观看 | 国产在视频一区二区三区吞精 | 国产成人精品一区二区三 | 久久精品色欧美aⅴ一区二区 | 日韩在线视频免费观看 | 91免费在线视频 | 久在线| 精品久久久久一区二区国产 | 久久精品中文 | 999久久久久久久久6666 | 国产日产久久高清欧美一区 | 久久亚洲综合 | 免费成人高清在线视频 | 亚洲精品黑人 | 国产99久久精品 | www.国产精品| 99在线播放 | h视频在线播放 | 国产精品美女一区二区三区 | 一道本在线 | 一区二区三区精品视频 | 精品免费国产视频 | 精品久久久久一区二区国产 | 欧美一区二区三区在线观看视频 | 欧美黑人国产人伦爽爽爽 | 欧美日韩在线观看视频网站 | 亚洲精品日日夜夜 | 亚洲日本免费 | 华丽的挑战在线观看 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 久久久久久免费免费 | 日韩在线精品视频 | 日本高清不卡视频 | 蜜月aⅴ国产精品 | 超级黄色一级片 | 西西裸体做爰视频 | 亚洲人成人一区二区在线观看 | www久久久| 国产精品精品视频一区二区三区 |