乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      文件系統(tǒng)的緩存管理

       海漩渦 2016-03-28

      文件系統(tǒng)的緩存管理

       

      1     緩存的概念... 1

      2     dentry緩存和inode緩存... 1

      2.1    文件名查找... 1

      2.2    dentry緩存... 2

      2.3    dentry緩存的查找方式... 2

      2.4    dentry緩存的管理... 2

      2.5    超級(jí)塊的dentry緩存... 2

      2.6    dentry的數(shù)據(jù)結(jié)構(gòu)... 2

      2.7    inode緩存... 3

      3     PageBuffer緩存... 3

      3.1    緩存的作用... 3

      3.2    緩存的種類... 3

      3.3    附屬在頁(yè)緩存上的塊緩存... 3

      3.4    獨(dú)立的塊緩存... 4

      3.5    /proc/meminfoBuffersCached的區(qū)別... 4

      4     數(shù)據(jù)回寫(xiě)... 4

      4.1    概念... 4

      4.2    周期性寫(xiě)回... 5

      4.3    完全同步... 5

      4.4    強(qiáng)制寫(xiě)回... 5

      4.5    當(dāng)今最新進(jìn)展... 5

      5     proc文件系統(tǒng)... 5

      5.1    概述... 5

      5.2    proc中文件的讀寫(xiě)方法... 6

      6     通過(guò)proc文件系統(tǒng)管理緩存... 6

      7     示例... 7

      8     The Swap Cache. 7

       

      1        緩存的概念

      緩存位于客戶和服務(wù)中間,用來(lái)加速訪問(wèn)。

      常見(jiàn)的緩存有CPU緩存、瀏覽器緩存、代理服務(wù)器緩存等。

       

      2        dentry緩存和inode緩存

      2.1       文件名查找

      如果想打開(kāi)/usr/local/bin/xxx,首先要知道xxxinode,它保存在/usr/local/bin這個(gè)目錄文件中,要打開(kāi)/usr/local/bin這個(gè)文件,需要知道/usr/local/bininode,它的inode保存在/usr/local這個(gè)目錄文件中,依次類推,直至查找“/”的inode。實(shí)際操作中,先打開(kāi)磁盤(pán)中的/目錄文件,查找/usrinode,然后打開(kāi)磁盤(pán)中的/usr文件,查找/usr/localinode,依次如此這般。因此文件名查找需要反復(fù)查詢inode表,并打開(kāi)相應(yīng)的目錄文件讀取inode。

      2.2       dentry緩存

      在打開(kāi)文件時(shí),將需要的目錄項(xiàng)都復(fù)制一份到內(nèi)存中,下次需要讀取相同的inode時(shí),通過(guò)dentry緩存直接找到對(duì)應(yīng)的inode

      2.3       dentry緩存的查找方式

      dentry的數(shù)據(jù)結(jié)構(gòu)中有d_subdirs鏈表,鏈表元素可以連接到它的子目錄和文件的dentry實(shí)例,搜索時(shí)沿著這個(gè)鏈表搜索。

      2.4       dentry緩存的管理

      內(nèi)存中維護(hù)一個(gè)散列表(dentry_hashtable)包含了所有的dentry對(duì)象,還有一個(gè)LRU(最近最少使用,least recently used)鏈表,當(dāng)某個(gè)dentry不再被使用時(shí)(使用計(jì)數(shù)d_count0),放進(jìn)這個(gè)列表。新放進(jìn)LRUdentry項(xiàng)置于鏈表的起始處,這表明越舊的dentry項(xiàng)就越靠后,在內(nèi)核需要更多內(nèi)存時(shí),就會(huì)把一些比較舊的dentry釋放掉。

      LRU鏈表中的對(duì)象同時(shí)也處于散列表中,因此在需要時(shí),也可通過(guò)散列表找到它,將其從LRU表中刪除,同時(shí)將其使用計(jì)數(shù)加1

      2.5       超級(jí)塊的dentry緩存

      在超級(jí)塊的內(nèi)存結(jié)構(gòu)中,包含一個(gè)指針s_root,它指向內(nèi)存中一個(gè)dentry實(shí)例。因此所有文件系統(tǒng)的根目錄的dentry都在文件系統(tǒng)掛載的同時(shí)就加載到內(nèi)存中了,相應(yīng)的inode緩存也必然已經(jīng)加載到內(nèi)存中。

      2.6       dentry的數(shù)據(jù)結(jié)構(gòu)

      struct dentry {

          atomic_t d_count;

          unsigned int d_flags;       /* protected by d_lock */

          spinlock_t d_lock;       /* per dentry lock */

          int d_mounted;

          struct inode *d_inode;      /* Where the name belongs to - NULL is

                         * negative */

          /*

           * The next three fields are touched by __d_lookup.  Place them here

           * so they all fit in a cache line.

           */

          struct hlist_node d_hash;   /* lookup hash list */

          struct dentry *d_parent; /* parent directory */

          struct qstr d_name;

       

          struct list_head d_lru;     /* LRU list */

          /*

           * d_child and d_rcu can share memory

           */

          union {

             struct list_head d_child;   /* child of parent list */

              struct rcu_head d_rcu;

          } d_u;

          struct list_head d_subdirs; /* our children */

          struct list_head d_alias;   /* inode alias list */

          unsigned long d_time;        /* used by d_revalidate */

          const struct dentry_operations *d_op;

          struct super_block *d_sb;   /* The root of the dentry tree */

          void *d_fsdata;          /* fs-specific data */

       

          unsigned char d_iname[DNAME_INLINE_LEN_MIN];  /* small names */

      };

       

      2.7       inode緩存

      inode的內(nèi)容保存在內(nèi)存中

       

      3        PageBuffer緩存

      3.1       緩存的作用

      緩存利用一部分系統(tǒng)物理內(nèi)存,確保最重要、最常使用的塊設(shè)備數(shù)據(jù)在操作時(shí)可以直接從內(nèi)存中獲取,而無(wú)需從低速設(shè)備中讀取

      數(shù)據(jù)在每次修改后并非都立即寫(xiě)回,同樣是保存在寫(xiě)緩存中,在一定的時(shí)間間隔之后在回寫(xiě)。

      3.2       緩存的種類

      對(duì)低速設(shè)備的緩存有頁(yè)緩存和塊緩存兩種。頁(yè)緩存以內(nèi)存頁(yè)為單位,一般為4K;塊緩存以磁盤(pán)塊為單位,在進(jìn)行I/O操作時(shí),存取的單位是設(shè)備的各個(gè)塊,而不是整個(gè)內(nèi)存頁(yè)。

      頁(yè)緩存占主要地位,因?yàn)閮?nèi)核中其它部分的操作都是以內(nèi)存頁(yè)為單位的;在以讀取元數(shù)據(jù)塊時(shí),用塊緩存更加方便。

      塊緩存分兩種,一種是頁(yè)緩存的附屬,一種是獨(dú)立的塊緩存。

      3.3       附屬在頁(yè)緩存上的塊緩存

      一些與塊設(shè)備之間的傳輸操作,傳輸單位的長(zhǎng)度依賴于底層設(shè)備的塊長(zhǎng)度,而內(nèi)核的許多部分按頁(yè)的粒度來(lái)執(zhí)行I/O操作,在這種情況下,塊緩存充當(dāng)了雙方的中介。

      一幀頁(yè)緩存包含一個(gè)或多個(gè)塊緩存,數(shù)目取決于塊大小。頁(yè)緩存中的塊與塊之間沒(méi)有間隙,對(duì)塊的管理有單獨(dú)的緩沖頭結(jié)構(gòu)。

         每個(gè)塊緩存有一個(gè)緩沖頭,它包含了與塊緩存狀態(tài)相關(guān)的所有管理數(shù)據(jù),包括塊號(hào)、塊長(zhǎng)度、訪問(wèn)計(jì)數(shù)器等等。緩沖頭和塊緩存數(shù)據(jù)在內(nèi)存中分屬完全獨(dú)立的不同區(qū)域。

      3.4       獨(dú)立的塊緩存

      依然保存在頁(yè)中,但無(wú)需關(guān)注塊在頁(yè)中的組織。

      采用LRU管理

      3.5       /proc/meminfoBuffersCached的區(qū)別

      Buffers存儲(chǔ)的是文件的元數(shù)據(jù)塊

      Cached存儲(chǔ)的是文件的實(shí)際數(shù)據(jù)

      4        數(shù)據(jù)回寫(xiě)

      4.1       概念

      數(shù)據(jù)總是在物理內(nèi)存中操作,隨后在隨機(jī)的時(shí)間點(diǎn)寫(xiě)回到磁盤(pán),以保存修改。

      兩種處理方式:周期性的和強(qiáng)制性的。

      內(nèi)存中的超級(jí)塊結(jié)構(gòu)中包含了臟塊的鏈表,從這個(gè)鏈表中選擇一部分或全部臟塊寫(xiě)回近磁盤(pán)。

      4.2       周期性寫(xiě)回

      系統(tǒng)啟動(dòng)時(shí)默認(rèn)啟動(dòng)2個(gè)pdflush線程,并使其處于睡眠狀態(tài)。在系統(tǒng)寫(xiě)操作并不繁忙時(shí),定期啟動(dòng)pdflush線程,將一定量的臟頁(yè)(默認(rèn)是1024)寫(xiě)回磁盤(pán),然后進(jìn)入睡眠狀態(tài)。

      默認(rèn)情況下,并發(fā)的pdflush線程是2,最大是8.。當(dāng)系統(tǒng)中超過(guò)1秒鐘沒(méi)有空閑的pdflush線程,則啟動(dòng)一個(gè)新的pdflush。若某個(gè)線程的空閑時(shí)間超過(guò)1秒,則銷毀它,但要保證系統(tǒng)中pdflush線程數(shù)不少于2個(gè)。

      當(dāng)前并發(fā)的pdflush線程數(shù)可通過(guò)/proc/sys/vm/nr_pdflush_threads查看,該參數(shù)只讀不可改。

      運(yùn)作機(jī)制簡(jiǎn)述:

      一個(gè)pdflush線程調(diào)用wb_kupdate函數(shù)來(lái)回寫(xiě),回寫(xiě)的頁(yè)總數(shù)不能超過(guò)1024個(gè)頁(yè),默認(rèn)只有變臟一段時(shí)間的頁(yè)才會(huì)被回寫(xiě),還可以回寫(xiě)對(duì)應(yīng)指定設(shè)備的臟頁(yè)。由于回寫(xiě)需要上鎖,因此具體過(guò)程是通過(guò)一個(gè)循環(huán)來(lái)實(shí)現(xiàn),每次回寫(xiě)一部分,直至所有臟塊寫(xiě)完或總數(shù)達(dá)到1024,寫(xiě)完后進(jìn)入睡眠,過(guò)一定時(shí)間間隔再次被喚醒。

      若某個(gè)頁(yè)被內(nèi)核其它部分鎖定,則默認(rèn)跳過(guò)它,下次pdflush啟動(dòng)時(shí)再去回寫(xiě)。

      若一次回寫(xiě)的時(shí)間超過(guò)了wb_kupdate線程啟動(dòng)的時(shí)間間隔,則推遲1秒在調(diào)用wb_kupdate。

      回寫(xiě)時(shí)在遇到阻塞時(shí),可選擇等待或跳過(guò),在struct writeback_control中設(shè)置sync_modeWB_SYNC_ALL時(shí),稱作數(shù)據(jù)完整性回寫(xiě),在阻塞時(shí)等待,直至回寫(xiě)真正完成。

      4.3       完全同步

      將系統(tǒng)中所有臟頁(yè)全部回寫(xiě),用sync系統(tǒng)調(diào)用實(shí)現(xiàn),有一個(gè)同名的用戶程序。

      4.4       強(qiáng)制寫(xiě)回

      當(dāng)需要更多的空閑內(nèi)存時(shí)或來(lái)自用戶的sync系統(tǒng)調(diào)用,內(nèi)核啟動(dòng)強(qiáng)制回寫(xiě)函數(shù)wakeup_pdflush。

      某些強(qiáng)制寫(xiě)回并不等待回寫(xiě)完成,而是發(fā)出請(qǐng)求后即返回,除非是數(shù)據(jù)完整性同步。

      若某個(gè)進(jìn)程產(chǎn)生大量臟頁(yè),會(huì)強(qiáng)制這個(gè)進(jìn)程調(diào)用回寫(xiě)函數(shù)balance_dirty_pagesmm/page-writeback.c)。

       

      4.5       當(dāng)今最新進(jìn)展

      pdflush在新版內(nèi)核中已經(jīng)被移除。

      一個(gè)塊設(shè)備上可能有幾個(gè)臟塊隊(duì)列,每一個(gè)pdflush線程可以處理一個(gè)或多個(gè)隊(duì)列,但每個(gè)塊設(shè)備均有擁塞限制,默認(rèn)是128個(gè)寫(xiě)請(qǐng)求。

      原有的pdflush機(jī)制是和設(shè)備數(shù)無(wú)關(guān)的,寫(xiě)回隊(duì)列和超級(jí)塊掛鉤,現(xiàn)在內(nèi)核中回寫(xiě)機(jī)制是和設(shè)備掛鉤的。每個(gè)塊設(shè)備均有一個(gè)flush線程

       

      5        proc文件系統(tǒng)

      5.1       概述

      proc文件系統(tǒng)是一種虛擬文件系統(tǒng),其信息并沒(méi)有存儲(chǔ)在塊設(shè)備上,而是在讀取的時(shí)候,才從內(nèi)存中動(dòng)態(tài)生成內(nèi)容。通過(guò)它,用戶可以讀取內(nèi)核數(shù)據(jù),并可以改變某些內(nèi)核數(shù)據(jù),從而改變系統(tǒng)的行為。

       

      5.2       proc中文件的讀寫(xiě)方法

      proc中的文件的文件都是文本文件,可以用catless去讀,用echo去寫(xiě)。需要注意的是,并不是每個(gè)文件都可寫(xiě),有些是只讀的。

       

      6        通過(guò)proc文件系統(tǒng)管理緩存

      /proc/sys/vm

      dirty_background_bytes緩存中的臟數(shù)據(jù)達(dá)到設(shè)定值時(shí),啟動(dòng)pdflush開(kāi)始強(qiáng)制寫(xiě)回。默認(rèn)值是0,即沒(méi)有設(shè)定,其值實(shí)際上是計(jì)算得出,dirty_background_ratio * the amount of dirtyable memory。

       

      dirty_background_ratio緩存中的臟數(shù)據(jù)達(dá)到設(shè)定的比例時(shí),啟動(dòng)pdflush開(kāi)始強(qiáng)制寫(xiě)回。默認(rèn)值是10。這個(gè)比例是指臟數(shù)據(jù)與可用內(nèi)存之比,可用內(nèi)存是指:未使用的內(nèi)存+當(dāng)前可回收的內(nèi)存 (LRU中活動(dòng)或非活動(dòng)的內(nèi)存頁(yè),包括可回收的緩存和映射的內(nèi)存頁(yè))。如果dirty_background_bytes已設(shè)置,則此處的設(shè)置無(wú)效,其值根據(jù)dirty_background_bytes重新計(jì)算,dirty_background_bytes / the amount of dirtyable system memory。若其值大于dirty_ratio,則自動(dòng)下降至dirty_ratio的一半。(在mm\page-writeback.c中的get_dirty_limits函數(shù)中計(jì)算)

       

      dirty_ratio某個(gè)進(jìn)程產(chǎn)生的臟頁(yè)到達(dá)此比例時(shí)(默認(rèn)為20%,但不能小于5%),開(kāi)始強(qiáng)制寫(xiě)回。此時(shí)由于回寫(xiě)頁(yè)數(shù)很多,導(dǎo)致設(shè)備上的寫(xiě)隊(duì)列擁塞,因此這個(gè)設(shè)備上的IO操作會(huì)被阻塞,可能導(dǎo)致很多進(jìn)程掛起,從而出現(xiàn)系統(tǒng)停止響應(yīng)的現(xiàn)象。若系統(tǒng)寫(xiě)負(fù)荷較重,可適當(dāng)降低dirty_background_ratio、dirty_expire_centisecs、dirty_writeback_centisecs等參數(shù),使系統(tǒng)的回寫(xiě)在時(shí)間上盡量分散開(kāi)。

       

      dirty_bytes某個(gè)進(jìn)程產(chǎn)生的臟頁(yè)到達(dá)此字節(jié)數(shù),開(kāi)始強(qiáng)制寫(xiě)回。默認(rèn)為0,即禁用,最小值不能少于兩個(gè)內(nèi)存頁(yè),否則使用舊設(shè)置的值。此參數(shù)優(yōu)先級(jí)高于dirty_ratio,當(dāng)被設(shè)置時(shí),dirty_ratio根據(jù)它計(jì)算得出(dirty_bytes / the amount of dirtyable system memory)。設(shè)置非0數(shù)值后,dirty_ratio變?yōu)?span lang="EN-US">0。設(shè)置dirty_ratiodirty_bytes變?yōu)?span lang="EN-US">0.

       

      dirty_expire_centisecs時(shí)間值,當(dāng)頁(yè)變臟時(shí)間超過(guò)此值時(shí),pdflush將其寫(xiě)回。以百分之一秒為單位,默認(rèn)值為3000,即30秒。

       

      dirty_writeback_centisecs時(shí)間值,為pdflush的調(diào)用周期,以百分之一秒為單位,默認(rèn)值為500,即5秒。

       

      drop_caches用于釋放頁(yè)緩存、dentry緩存和inode緩存。值為0時(shí)代表禁用;值為1時(shí)釋放頁(yè)緩存;值為2時(shí)釋放dentryinode緩存;值為3時(shí)釋放頁(yè)緩存、dentry緩存和inode緩存。注意:它并不能釋放臟塊。

       

      nr_pdflush_threads當(dāng)前并發(fā)的pdflush線程數(shù),該參數(shù)只讀不可改。

       

      vfs_cache_pressure用于確定回收dentry緩存和inode緩存的策略,默認(rèn)值是100。小于100表示傾向于保留dentry緩存和inode緩存,意味著盡管有一些緩存已經(jīng)沒(méi)有進(jìn)程在使用它,但依然會(huì)保留下來(lái),大于100則相反。如果為0則不回收它們,不過(guò)這樣容易導(dǎo)致內(nèi)存溢出,即沒(méi)有可用內(nèi)存分配給進(jìn)程。

       

      /sys/block/xxx/queue/nr_requests這個(gè)塊設(shè)備讀、寫(xiě)隊(duì)列發(fā)生擁塞時(shí)的請(qǐng)求數(shù)上限,默認(rèn)是128(讀寫(xiě)都是128),即寫(xiě)請(qǐng)求數(shù)少于128時(shí),認(rèn)為這個(gè)設(shè)備還有能力接受更多的寫(xiě)請(qǐng)求,pdflush不會(huì)遇到阻塞。如果塊設(shè)備性能好,可調(diào)大此參數(shù)。

       

       

      7        示例

      運(yùn)行一個(gè)遍歷目錄的腳本,通過(guò)free命令可以看到buffer在上升,slabtop命令可以看到dentry、ext3_inode_cache都在上升,而cache不變。

      停止腳本, echo 1 > /proc/sys/vm/drop_caches,buffer迅速回落,幾乎為0,free命令中的使用的內(nèi)存也減少同樣的數(shù)量;dentry、ext3_inode_cache不變;

      echo 2 > /proc/sys/vm/drop_caches,dentry、ext3_inode_cache迅速回落,free命令中的使用的內(nèi)存也減少同樣的數(shù)量。

      結(jié)論:由于腳本只是遍歷目錄,沒(méi)有寫(xiě)操作(除了向標(biāo)準(zhǔn)輸出寫(xiě)目錄名稱),因此buffer中都是目錄和inode信息,此信息也寫(xiě)進(jìn)dentry、ext3_inode_cache,即有兩份相同的拷貝。

       

      8        The Swap Cache

      When swapping pages out to the swap files, Linux avoids writing pages if it does not have to. There are times when a page is both in a swap file and in physical memory. This happens when a page that was swapped out of memory was then brought back into memory when it was again accessed by a process. So long as the page in memory is not written to, the copy in the swap file remains valid.

      Linux uses the swap cache to track these pages. The swap cache is a list of page table entries, one per physical page in the system. This is a page table entry for a swapped out page and describes which swap file the page is being held in together with its location in the swap file. If a swap cache entry is non-zero, it represents a page which is being held in a swap file that has not been modified. If the page is subsequently modified (by being written to), its entry is removed from the swap cache.

      When Linux needs to swap a physical page out to a swap file it consults the swap cache and, if there is a valid entry for this page, it does not need to write the page out to the swap file. This is because the page in memory has not been modified since it was last read from the swap file.

      The entries in the swap cache are page table entries for swapped out pages. They are marked as invalid but contain information which allow Linux to find the right swap file and the right page within that swap file.


        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多