亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 3943 | 回復(fù): 10
打印 上一主題 下一主題

[其他DFS] Linux文件系統(tǒng)十問 --關(guān)于文件系統(tǒng),你知道嗎? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2013-08-14 11:39 |只看該作者 |倒序?yàn)g覽
作者:yanfei,騰訊后臺架構(gòu)師,參與項(xiàng)目為搜搜網(wǎng)頁開發(fā)和搜搜開放平臺。

  關(guān)于文件系統(tǒng),相信大家都不陌生。身為攻城獅的我們幾乎天天都會與之打交道,但是細(xì)深剖一下,其中又有多少是我們理解深度不夠的呢。那么讓我們一起來看一下下面這一組Linux文件系統(tǒng)相關(guān)的問題吧:

1、機(jī)械磁盤隨機(jī)讀寫時速度非常慢,操作系統(tǒng)是采用什么技巧來提高隨機(jī)讀寫的性能的?

2、touch一個新的空文件占用磁盤空間嗎? 占用的話占用多少?

3、新建一個空目錄占用磁盤空間嗎?占用多少?和新建一個文件相比,哪個占用的更大?

4、你知道文件名是記錄在磁盤的什么地方嗎?

5、文件名最長多長?受什么制約?

6、文件名太長了會影響系統(tǒng)性能嗎?為什么會產(chǎn)生影響?

7、一個目錄下最多能建立多少個文件?

8、新建一個內(nèi)容大小1k的文件,實(shí)際會占用多大的磁盤空間?

9、向操作系統(tǒng)發(fā)起讀取文件2Byte的命令,操作系統(tǒng)實(shí)際會讀取多少呢?

10、我們使用文件時要怎么樣來能提高磁盤IO速度?

  如果你能想也不用想的就回答上來百分八十的問題,那么請關(guān)掉本篇文章吧。如果不能,而且你也像作者一樣對有窺探操作系統(tǒng)隱私的嗜好,那么就請隨我一起來探索文件系統(tǒng)的這些有趣的地方,相信理解了這些之后對我們手中的工作會有很大的幫助。

一、磁盤構(gòu)成及分區(qū)

1、磁盤物理結(jié)構(gòu)

  還是先從最基本的磁盤物理結(jié)構(gòu)說起吧,注意本文只討論機(jī)械磁盤,SSD不在本文討論范圍之內(nèi)。我們?nèi)祟惞芾砣魏问挛锟偸橇?xí)慣先劃分出一定的結(jié)構(gòu),再此規(guī)則的基礎(chǔ)上進(jìn)行管理。軍隊分軍、師、旅、團(tuán)和營。公司分事業(yè)群、部門、中心和小組。,然后。對于管理磁盤,分磁盤面、磁頭、磁道、柱面和扇區(qū)。

    磁盤面:磁盤是由一疊磁盤面組成,見下左圖。

    磁頭(Heads):每個磁頭對應(yīng)一個磁盤面,負(fù)責(zé)該磁盤面上的數(shù)據(jù)的讀寫。

    磁道(Track):每個盤面會圍繞圓心劃分出多個同心圓圈,每個圓圈叫做一個磁道。

    柱面(Cylinders):所有盤片上的同一位置的磁道組成的立體叫做一個柱面。

    扇區(qū)(Sector):以磁道為單位管理磁盤仍然太大,所以計算機(jī)前輩們又把每個磁道劃分出了多個扇區(qū),見下右圖



  本人愛上Linux的一個原因就是只要你愿意下功夫,你就能把Linux的外衣一脫到底,滿足你的一切欲望(請想歪的騷年去面壁)。Linux上可以通過fdisk命令,來查看當(dāng)前系統(tǒng)使用的磁盤的這些物理信息。



  以上是我本人的一臺虛擬機(jī)的磁盤物理信息?梢钥闯鑫业拇疟P有255個heads,也就是說共有255個盤面。3263個cylinders,也就是說每個盤面上都有3263個磁道, 63sectors/track說的是每個磁道上共有63個扇區(qū)。命令結(jié)果也給出了Sector size的值是512bytes。那我們動筆算一下該磁盤的大小吧。

  255盤面  * 3263柱面 * 63扇區(qū) * 每個扇區(qū)512bytes = 26839088640byte。
結(jié)果是26.8G,和磁盤的總大小相符(至于fdisk給出的詳細(xì)結(jié)果相差了約4M的大小,筆者也沒有弄徹底明白,有興趣的讀者可以繼續(xù)研究)。

  另外查看了其它兩臺機(jī)器的磁盤情況,發(fā)現(xiàn)個有意思的事情。如下圖,無論磁盤的容量大或者是小,其磁頭數(shù)和每磁道扇區(qū)數(shù)都是不變的,只是磁道變多了而已。




2、分區(qū)

  分區(qū)是操作系統(tǒng)對磁盤進(jìn)行管理的第一步,這也是我們?nèi)魏我粋計算機(jī)使用者都非常熟悉的概念。例如Windows下的C、D、E、F盤。那么請思考一下,

    思考:前面的磁盤的詳細(xì)物理結(jié)構(gòu)已經(jīng)有了,如果讓你把整塊磁盤分成C、D等分區(qū),你會怎么分呢?
   
  方案一: 255個盤面,C盤是0-100盤面, D盤是101-200個盤面,……

  方案二:3263個柱面,C盤0-1000個柱面,D盤1001-20001個柱面,……

  對于以上的兩個方案,你會選擇哪一種呢??先說下磁盤IO時的過程。第一步,首先是磁頭徑向移動來尋找數(shù)據(jù)所在的磁道。這部分時間叫尋道時間。第二步,找到目標(biāo)磁道后通過盤面旋轉(zhuǎn),將目標(biāo)扇區(qū)移動到磁頭的正下方。第三步,向目標(biāo)扇區(qū)讀取或者寫入數(shù)據(jù)。到此為止,一次磁盤IO完成,故:

  單次磁盤IO時間 = 尋道時間 + 旋轉(zhuǎn)延遲 + 存取時間。

  對于旋轉(zhuǎn)延時,現(xiàn)在主流服務(wù)器上經(jīng)常使用的是1W轉(zhuǎn)/分鐘的磁盤,每旋轉(zhuǎn)一周所需的時間為60*1000/10000=6ms,故其旋轉(zhuǎn)延遲為(0-6ms)。對于存取時間,一般耗時較短,為零點(diǎn)幾ms。對于尋道時間,現(xiàn)代磁盤大概在3-15ms,其中尋道時間大小主要受磁頭當(dāng)前所在位置和目標(biāo)磁道所在位置相對距離的影響。

  其實(shí)采用哪一種,最主要看的是那種方式性能更快。因?yàn)橥环謪^(qū)下的數(shù)據(jù)經(jīng)常會一起讀取,假如采用第一種,那么這樣磁頭就需要在3000多個track間不停地跳來跳去,這樣磁盤的尋道時間就會翻倍,磁盤性能就會下降。而對于方案二,假如對于磁盤C,只需要在磁頭在1-1000個磁道間移動就可以了,大大降低了尋道時間。(實(shí)際上分區(qū)并不是從0開始的,磁盤的第一個磁道對應(yīng)的柱面會被用來安裝引導(dǎo)加載程序以及磁盤分區(qū)表)。所以,方案二的分區(qū)方式可以降低磁盤IO時間中的尋道時間部分,所以所有的操作系統(tǒng)采用的都是方案二,沒有用方案一的。

    在Linux下使用過fdisk進(jìn)行分區(qū)的話可以注意到以下信息。





  這充分證明了操作系統(tǒng)是采用方案二的。

  回到開篇問題1,操作系統(tǒng)是采用什么技巧來降低隨機(jī)讀寫的性能問題的呢?操作系統(tǒng)通過按磁道對應(yīng)的柱面劃分分區(qū),來降低磁盤IO所花費(fèi)的的尋道時間 ,進(jìn)而提高磁盤的讀寫性能。

二、 目錄與文件

1、引子   

  好了,磁盤基礎(chǔ)都說完了,那我們正式進(jìn)入主題,開始我們Linux文件系統(tǒng)相關(guān)的討論吧。文件系統(tǒng)不就是目錄和文件嗎?這二位可是我們熟悉的不能再熟悉的家伙了。可你確認(rèn)它不是你的那位熟悉的陌生人么?我先來來創(chuàng)建個空目錄和空文件吧,查看結(jié)果如下圖:



  我們都知道第五列顯示的是占用的空間大小,那么我來提個幾個小小的問題吧。
(1)為什么目錄占用的空間是4096?

(2)為什么空文件占用的空間卻是0?

(3)如果空文件真占用0byte空間,那么該文件的文件名、創(chuàng)建者以及權(quán)限-rw-rw-r—等文件夾相關(guān)的信息都存到哪兒去了?

2、我就不信空文件不占用空間

  為了解開這個謎底,需要借助df命令。輸入df –i,

  Linux結(jié)果中紅框位置處顯示的是inodes的相關(guān)信息,如果你對inode的概念不熟悉,你可以暫時把它當(dāng)成一個操作系統(tǒng)秘密管理的一個家伙,會占用空間就行了。接下來我touch一個空的文件后再次df -i。

  雖然前面操作系統(tǒng)告訴我們,一個新建的空文件占用的空間是0。但是這個實(shí)驗(yàn)卻證明操作系統(tǒng)“欺騙”了我們,它消耗掉了一個inode。那么inode的節(jié)點(diǎn)大小是多少呢,使用dumpe2fs命令可以幫助我們查看到這個東東的實(shí)際大小。

  在輸出的結(jié)果中我們可以找到下面這行:

  它告訴我們每個inode的大小是256Byte。當(dāng)然這個大小每臺機(jī)器都會不一樣,它實(shí)際上是在系統(tǒng)格式化磁盤的時候決定的。

  好了,開篇第二個問題也有答案了。原來新建一個空的文件是會占用磁盤空間的,實(shí)際占用的是256Byte。哦,不,準(zhǔn)確的說法應(yīng)該是一個inode size,具體的值是在格式化時決定的。

  再說說新建空目錄吧,前面說了新建空目錄會占用4KB的磁盤空間。那么僅僅如此嗎? 我們同樣在新建目錄前后都使用df –i來監(jiān)視系統(tǒng)inode的占用。

  原來目錄也是會占用一個inode節(jié)點(diǎn)的,第三個問題也有了答案了,新建一個空目錄會占用磁盤空間4KB + inode size。 哦,這個在你的系統(tǒng)上也不一定是4K,它實(shí)際上一個block size。同樣在dumpe2fs下可以看到。


  只不過我的磁盤在格式化時采用的是4KB的大小,呵呵!

3、神秘的空目錄的4KB
  前面的謎團(tuán)解開了,可以作為攻城獅的我對另外一個東西產(chǎn)生了好奇心。就是空目錄占用的那4KB,這些空間是用來存什么的呢?好神秘呀。
  cd到我們新建的目錄下查看。

  我們再新建兩個空的文件,再查看下目錄的空間占用情況。

  貌似,沒有什么新發(fā)現(xiàn)。因?yàn)榭瘴募徽加胋lock,所以這里顯示的仍然是目錄占用的block,和之前大小沒有變化。那么我繼續(xù)使用php腳本創(chuàng)建100個文件名長度為32Byte的空文件。


  這時我們發(fā)現(xiàn)目錄占用的磁盤空間變大了,成了3個Block了。哈哈,這就解答了我們開篇的第四個問題,文件名是存在目錄占用的block中的。接下來我又還證明了每個目錄block中能保存的文件名個數(shù)是和文件名的長度有關(guān)的(好像有點(diǎn)廢話的意思,不過親手證明自己的猜想還是有點(diǎn)小爽的)。我又另外新建了個空目錄,創(chuàng)建了100個文件名長度為32*3個空文件,該臨時目錄占用的磁盤空間如下:

  你可能會問我為什么文件名變成了3倍后,占用的block數(shù)目為什么沒有變成3倍。其實(shí)Linux文件系統(tǒng)關(guān)于文件的結(jié)構(gòu)體中除了文件名以外,還有其它的一些字段的,文件名變長3倍不會導(dǎo)致結(jié)構(gòu)體變大3倍的,這點(diǎn)可以參考Linux系統(tǒng)內(nèi)核相關(guān)書籍。

  好了,到現(xiàn)在開篇問題6也有了答案了。文件名長了當(dāng)然會對系統(tǒng)性能產(chǎn)生影響,因?yàn)檫@可能會導(dǎo)致更多的磁盤IO。很多程序員都喜歡將文件命名為有意義的長串,使人一看文件名就知道用途。當(dāng)然我沒說這樣不好,但是如果你的文件數(shù)量相當(dāng)大的時候,你就要考慮你的文件名是否導(dǎo)致你的目錄block占用太多了。占用的空間倒是小事,磁盤很便宜,但是你得考慮下在目錄下查找文件時操作系統(tǒng)的感受,操作系統(tǒng)可需要用你你提供的文件名進(jìn)行字符串比較,而且運(yùn)氣不好的話需要將其名下所有block都搞一遍才行啊。(當(dāng)然了,你的文件名長度不變態(tài),而且數(shù)量沒有達(dá)到十萬數(shù)量級的話實(shí)際上這個開銷也不會太大,但是這個開銷你還是知道的為好)

  至于開篇問題5,文件名最長多長。實(shí)際上Linux操作系統(tǒng)就是為了避免程序員不節(jié)制地使用長文件名,強(qiáng)加了個限制,不得超過255byte。

  另外,大家有沒有經(jīng)驗(yàn),在目錄下文件很多的時候,我們使用ls命令時會很慢。現(xiàn)在大家知道原因了吧,這時實(shí)際上操作系統(tǒng)在讀取當(dāng)前目錄的所有block,如果block比較多的話,可能得需要多次IO操作才能完成這個簡單的ls命令。
  我在自己的電腦某個目錄下創(chuàng)建了一100W個空文件,ls命令1分鐘還沒出結(jié)果,被我ctrl+c掉了。在自己的項(xiàng)目中可不要這么干,雖然操作系統(tǒng)可以cache住你的目錄數(shù)據(jù),使你下次調(diào)用時會塊很多,但我還是建議你單個目錄下文件數(shù)目不要過萬。否則你的程序在重啟后首次運(yùn)行時可能會出現(xiàn)性能不佳的情況。

  好了,回到開篇問題7,你有答案了嗎?一個目錄下最多能建多少個文件,這個最多其實(shí)是受限于你目錄所在分區(qū)的inode數(shù)量,你有100W個inode,你最多就可以新建100W個文件。但是,上面說了,單個目錄下文件數(shù)量最好不要過萬,否則會帶來系統(tǒng)性能的問題。

4、文件的block

  再做個關(guān)于文件的實(shí)驗(yàn)。我新建了個空目錄,并在其下新建了個文件,里面只寫了一個空格數(shù)據(jù),保存后du命令顯示如下:

  這8K里有4K是目錄的,也就可以算出操作系統(tǒng)為只包含一個空格的文件分配了4KB。其實(shí)文件的block比較簡單的了,不像目錄的block里會存很多文件系統(tǒng)的結(jié)構(gòu)體,文件的block里只會保存文件的數(shù)據(jù)。上面這個實(shí)驗(yàn)表明,操作系統(tǒng)分配空間時是以block為最小單位。也就是說只要你的文件數(shù)據(jù)不為空,操作系統(tǒng)就至少會給你分配一個block來存儲,直到你超過了4KB,操作系統(tǒng)再給你分配下一個block,就是這樣。所以對于開篇問題8,新建一個內(nèi)容大小為1k的文件,實(shí)際會占用1個block(一般為4k)和一個inode(一般為256byte)。

  其實(shí)文件系統(tǒng)在向磁盤發(fā)起IO請求的時候,也是以block size為單位的。哪怕你只向操作系統(tǒng)發(fā)起讀取文件的2Byte,但是操作系統(tǒng)會一次性給你讀取4KB回來。因此磁盤IO真的是很慢,而且我們只要訪問了這2Byte,確實(shí)很有可能接下來繼續(xù)訪問這2byte后面的內(nèi)容,這也就是程序局部性原理,所以操作系統(tǒng)索性一次性就多讀取些回來了。呵呵,這就是開篇問題9的答案。
這就像我們?nèi)ス涑,逛一次真的是很浪費(fèi)時間,這可要比坑爹的磁盤IO也慢許多了。我們總不會逛了一圈超市就買了一個蘋果就回來了吧,我們肯定會多買些東西為家里以后的需求準(zhǔn)備著,反正買一堆東西比買一個蘋果也沒多花多少時間,何樂為不為呢,就是這個道理。

  再說說開篇問題10,我們攻城獅怎么樣設(shè)計你的文件能提高一些IO速度呢?那就是如果你知道你的要新建的文件大概會占用多大的空間的話,比如1M。那么你新建文件時就順便和操作系統(tǒng)說一下,讓它幫你將文件的size預(yù)留下來。這樣實(shí)際上操作系統(tǒng)時會盡可能為你分配連續(xù)的block,這樣你再讀取這個文件時,磁頭就省去很多尋道時間了,IO速度就顯得快多了。   

三、寫在后面的話

  前面我們說的都是基于我自己的文件系統(tǒng),情形是一個block size是4KB,一個inode size是256byte,包括我虛擬機(jī)上的inode數(shù)量才只有140多萬個。這些值實(shí)際上不是固定的,你完全可以在格式化你的硬盤的時候設(shè)置成其它的值。設(shè)置的原則就是看你的硬盤的容量,以及你的用途。

  如果你的文件都是大于4KB,甚至是幾M,幾G的文件,那么建議你的block還是盡可能的大一點(diǎn)吧,這樣inode里就能少記幾個地址。

  如果你的文件大部分都是1K以下的,那么確實(shí)使用4K的block會造成一點(diǎn)點(diǎn)浪費(fèi),如果你的老板對成本要求異?量痰脑挘憧梢赃m當(dāng)考慮把你的block設(shè)置得小一點(diǎn)。

  另外,要關(guān)注你的文件系統(tǒng)的inode。操作系統(tǒng)在查看目錄和文件占用的磁盤空間信息時把inode節(jié)點(diǎn)的占用給隱藏起來了,其用意在于為用戶提供一個白盒的環(huán)境,把數(shù)據(jù)占用的空間交給我們來認(rèn)知,而把inode信息隱藏起來為了降低我們理解操作系統(tǒng)的難度。而實(shí)際上,我們作為非普通用戶的開發(fā)人員應(yīng)該具備這個知情權(quán)。這個東東直接關(guān)系到你文件系統(tǒng)能創(chuàng)建文件數(shù)量。否則哪天等你發(fā)現(xiàn)線上機(jī)器磁盤還剩大把大把的空間,但就是inode使用光了,那時候就只有重新格式化或者遷移服務(wù)器了。這兩個操作想想都覺得苦逼啊,還是能避免就盡量避免吧。   


  思考題:我們大家有個經(jīng)驗(yàn)就是目錄下小文件太多的情況下,往其它地方拷貝的話,速度會非常的慢,我們這時往往會把目錄壓縮一下再拷貝,F(xiàn)在你能說出這樣做為什么會快嗎?


論壇徽章:
3
雙魚座
日期:2013-08-17 16:21:25CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:34射手座
日期:2014-08-10 13:48:32
2 [報告]
發(fā)表于 2013-08-17 16:19 |只看該作者

論壇徽章:
0
3 [報告]
發(fā)表于 2013-09-10 17:52 |只看該作者
讓我想起鳥哥關(guān)于文件系統(tǒng)的介紹

論壇徽章:
0
4 [報告]
發(fā)表于 2013-09-25 11:59 |只看該作者
無意中,學(xué)生在群里分享此文,必須支持下。寫得很好。

論壇徽章:
0
5 [報告]
發(fā)表于 2013-09-25 12:01 |只看該作者
2個月了,發(fā)現(xiàn)沒幾個人評論
這個文章寫得不錯
但是 由于比較抽象和偏底層
因此 關(guān)注的人不多 而這恰恰是通向高手的 必經(jīng)之路!
在贊下

論壇徽章:
0
6 [報告]
發(fā)表于 2013-09-25 12:37 |只看該作者
博主的邏輯思維太強(qiáng)了!膜拜!另外,對于文件系統(tǒng)已經(jīng)磁盤容量這塊兒給了初學(xué)者一些指點(diǎn)!不過都談的比較深入了。對于初學(xué)者了解就好,大贊!

論壇徽章:
0
7 [報告]
發(fā)表于 2013-09-25 12:39 |只看該作者
寫得非常不錯

論壇徽章:
0
8 [報告]
發(fā)表于 2014-05-07 09:06 |只看該作者
daidai141 發(fā)表于 2013-09-25 12:39
寫得非常不錯


轉(zhuǎn)過來的,有好的東西和大家分享啊

論壇徽章:
0
9 [報告]
發(fā)表于 2014-05-08 10:36 |只看該作者
回復(fù) 5# 老男孩linux培訓(xùn)


寫的很好,都是通過現(xiàn)象,尋找本質(zhì)。
其實(shí)如果是做linux下c語言系統(tǒng)編程,反而是倒過來,直接接觸本質(zhì),再觀察現(xiàn)象。

   

論壇徽章:
0
10 [報告]
發(fā)表于 2014-05-08 11:20 |只看該作者
最后我不明白的是為什么壓縮后拷貝就快。
假設(shè)我這里是同一個系統(tǒng),不同磁盤的分區(qū)之間拷貝。
如果是大量的圖片文件,tar czf壓縮的話,完全是浪費(fèi)cpu,壓縮比很低。
如果cf只是打包的話,也會有向磁盤讀的操作,cp也有讀的操作,所有在讀取方面,應(yīng)該效率差不多
寫入的話,cf打包后寫入只有一個大文件,相比cp大量文件寫入,當(dāng)然是tar快了
但是后期,tar也會解包,也會大量寫入,這里我分析的話,tar是吧大量讀和大量寫分開了,cp是同時進(jìn)行,但是tar多了大文件的寫入這一步。
因此說他倆的效率誰高,真是不清楚。

如果是網(wǎng)絡(luò)之間傳輸,那得看什么協(xié)議了吧。
如果純tcp協(xié)議,這個必須要打包,否則小文件傳輸,需要控制文件的結(jié)束與下一個文件的開始。
如果是scp這樣的協(xié)議,傳輸小文件比傳輸單個文件需要的操作和數(shù)據(jù)量都多。所以網(wǎng)絡(luò)傳輸還是打包來的快。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP