posts - 28,  comments - 15,  trackbacks - 0

          解釋一下Linux上free命令的輸出。

            下面是free的運行結果,一共有4行。為了方便說明,我加上了列號。這樣可以把free的輸出看成一個二維數組FO(Free Output)。例如:

          • FO[2][1] = 24677460
          • FO[3][2] = 10321516  
                             1          2          3          4          5          6
          1              total       used       free     shared    buffers     cached
          2 Mem:      24677460   23276064    1401396          0     870540   12084008
          3 -/+ buffers/cache:   10321516   14355944
          4 Swap:     25151484     224188   24927296

            free的輸出一共有四行,第四行為交換區的信息,分別是交換的總量(total),使用量(used)和有多少空閑的交換區(free),這個比較清楚,不說太多。

            free輸出地第二行和第三行是比較讓人迷惑的。這兩行都是說明內存使用情況的。第一列是總量(total),第二列是使用量(used),第三列是可用量(free)。

            第一行的輸出時從操作系統(OS)來看的。也就是說,從OS的角度來看,計算機上一共有:

          • 24677460KB(缺省時free的單位為KB)物理內存,即FO[2][1];
          • 在這些物理內存中有23276064KB(即FO[2][2])被使用了;
          • 還用1401396KB(即FO[2][3])是可用的;

          這里得到第一個等式:

          • FO[2][1] = FO[2][2] + FO[2][3]

          FO[2][4]表示被幾個進程共享的內存的,現在已經deprecated,其值總是0(當然在一些系統上也可能不是0,主要取決于free命令是怎么實現的)。

          FO[2][5]表示被OS buffer住的內存。FO[2][6]表示被OS cache的內存。在有些時候buffer和cache這兩個詞經?;煊?。不過在一些比較低層的軟件里是要區分這兩個詞的,看老外的洋文:

          • A buffer is something that has yet to be "written" to disk. 
          • A cache is something that has been "read" from the disk and stored for later use.

          也就是說buffer是用于存放要輸出到disk(塊設備)的數據的,而cache是存放從disk上讀出的數據。這二者是為了提高IO性能的,并由OS管理。

          Linux和其他成熟的操作系統(例如windows),為了提高IO read的性能,總是要多cache一些數據,這也就是為什么FO[2][6](cached memory)比較大,而FO[2][3]比較小的原因。我們可以做一個簡單的測試:

          1. 釋放掉被系統cache占用的數據;
            echo 3>/proc/sys/vm/drop_caches

             

          2. 讀一個大文件,并記錄時間;
          3. 關閉該文件;
          4. 重讀這個大文件,并記錄時間;

          第二次讀應該比第一次快很多。原來我做過一個BerkeleyDB的讀操作,大概要讀5G的文件,幾千萬條記錄。在我的環境上,第二次讀比第一次大概可以快9倍左右。

            free輸出的第二行是從一個應用程序的角度看系統內存的使用情況。

          • 對于FO[3][2],即-buffers/cache,表示一個應用程序認為系統被用掉多少內存;
          • 對于FO[3][3],即+buffers/cache,表示一個應用程序認為系統還有多少內存;

          因為被系統cache和buffer占用的內存可以被快速回收,所以通常FO[3][3]比FO[2][3]會大很多。

          這里還用兩個等式:

          • FO[3][2] = FO[2][2] - FO[2][5] - FO[2][6]
          • FO[3][3] = FO[2][3] + FO[2][5] + FO[2][6]

          這二者都不難理解。

            free命令由procps.*.rpm提供(在Redhat系列的OS上)。free命令的所有輸出值都是從/proc/meminfo中讀出的。

          在系統上可能有meminfo(2)這個函數,它就是為了解析/proc/meminfo的。procps這個包自己實現了meminfo()這個函數??梢韵螺d一個procps的tar包看看具體實現,現在最新版式3.2.8。

          posted on 2013-04-12 11:19 zhangxl 閱讀(166) 評論(0)  編輯  收藏 所屬分類: linux

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(1)

          隨筆分類(17)

          隨筆檔案(28)

          文章分類(30)

          文章檔案(30)

          相冊

          收藏夾(2)

          hibernate

          java基礎

          mysql

          xml

          關注

          壓力測試

          算法

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 96754
          • 排名 - 600

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 冀州市| 青铜峡市| 兴宁市| 玉环县| 无锡市| 林口县| 商洛市| 南雄市| 额济纳旗| 象州县| 沙坪坝区| 万全县| 虹口区| 永丰县| 绩溪县| 卢湾区| 久治县| 鄯善县| 邵阳市| 营口市| 廊坊市| 阿坝县| 镇江市| 鄯善县| 郓城县| 鸡西市| 湟中县| 百色市| 丹凤县| 淳安县| 古丈县| 壤塘县| 呼图壁县| 涡阳县| 宝兴县| 拜城县| 紫阳县| 苗栗市| 鸡泽县| 山西省| 平泉县|