• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            cyt

            目前的工程需要簡單的監測一下Linux系統的:CPU負載、內存消耗情況、幾個指定目錄的磁盤空間、磁盤I/O、swap的情況還有就是網絡流量。
            Linux下的性能檢測工具其實都有很多。mrtg(http://people.ee.ethz.ch/~oetiker/webtools/mrtg/)就是一個很不錯的選擇。不過用mrtg就要裝sysstat、apache、snmp、perl之類的東西。而且安裝也要好幾個步驟,似乎比較麻煩。本來也想直接調用sar、vmstat之類的命令,parse一下結果就算了。哪知道發現不同的版本的linux這些命令的結果也都是不一樣。既然要按版本parse它們的結果,那還不如直接去系統里面獲得算了。于是研究了一下sysstat(http://freshmeat.net/projects/sysstat/)和gkrellm(http://gkrellm.net )的源代碼,找到監測性能的數據所在。

            1、CPU
               在文件"/proc/stat"里面就包含了CPU的信息。每一個CPU的每一tick用在什么地方都在這個文件里面記著。后面的數字含義分別是:user、nice、sys、idle、iowait。有些版本的kernel沒有iowait這一項。這些數值表示從開機到現在,CPU的每tick用在了哪里。例如:
            cpu0 256279030 0 11832528 1637168262
            就是cpu0從開機到現在有256279030 tick用在了user消耗,11832528用在了sys消耗。所以如果想計算單位時間(例如1s)里面CPU的負載,那只需要計算1秒前后數值的差除以每一秒的tick數量就可以了。gkrellm就是這樣實現的:((200 * (v2 - v1) / CPU_TICKS_PER_SECOND) + 1) /2
            例如,第一次讀取/proc/stat,user的值是256279030;一秒以后再讀一次,值是256289030,那么CPU在這一秒的user消耗就是:((200 * (256289030 - 256279030) / CPU_TICKS_PER_SECOND) + 1) /2 = ((10000 * 200 / 1000000) + 1) / 2 = 1%了。

            2、內存消耗
               文件"/proc/meminfo"里面包含的就是內存的信息,還包括了swap的信息。例如:
            $ cat /proc/meminfo
                    total:    used:    free:  shared: buffers:  cached:
            Mem:  1057009664 851668992 205340672        0 67616768 367820800
            Swap: 2146787328 164429824 1982357504
            MemTotal:      1032236 kB
            MemFree:        200528 kB
            MemShared:           0 kB
            ……
            不過從gkrellm的源代碼看,有些版本沒有前面那兩行統計的信息,只能夠根據下面的Key: Value這種各式的數據收集。

            3、磁盤空間
               從gkrellm的源代碼看,這個是一個很復雜的數據。磁盤分區的數據有可能分布在:/proc/mounts、/proc/diskstats、/proc/partitions等等。而且如果想要檢查某幾個特定的路徑,還需要通過mount、df等命令的幫助。為了減少麻煩,這個數據我就直接用statfs函數直接獲得了。
            int statfs(const char *path, struct statfs *buf);
            這個函數只需要輸入需要檢查的路徑名稱,就可以返回這個路徑所在的分區的空間使用情況:
            總空間:buf.f_bsize * buf.f_blocks
            空余空間:buf.f_bsize * buf.f_bavail

            4、磁盤I/O
               磁盤I/O的數據也同樣比較復雜,有些版本看/proc/diskstats,有些版本看/proc/partitions,還有些版本至今我也不知道在那里看……不過可以看到數據的版本也像CPU那樣,需要隔一段時間取值,兩次取值的差就是流量。

            5、網絡流量
               網絡流量也是五花八門,不過基本上都可以在/proc/net/dev里面獲得。同樣也是需要兩次取值取其差作為流量值。

               以上就是數據獲得源頭。程序也比較好寫,不外乎就是打開一些文件,逐行讀出來然后用sscanf來parse一下數據就可以了。

            posted on 2006-03-02 22:54 cyt 閱讀(4399) 評論(3)  編輯 收藏 引用 所屬分類: Work
            Comments
            • # re: Linux的系統性能監測參數獲取
              nomad
              Posted @ 2006-04-09 17:26
              我在現在到公司一直開發 snmp 網管軟件。。。
              其實走 snmp 的管理還是很爽的,通用很多。但是系統必須裝一個 snmpd ,主流操作系統都自帶了。  回復  更多評論   
            • # re: Linux的系統性能監測參數獲取
              cyt
              Posted @ 2006-04-10 14:59
              snmp絕對是正途。
              不過在我們的應用中,需要自己的程序去檢查一些系統資源,發現不妥的時候要做一些相應的舉措。例如磁盤分區滿了,要自動調整分區的存放數據的權重;CPU過忙,就減少一些復雜運算的請求等等……如果這些操作都用snmp,消耗在snmp上的資源就太多了,所以才會想到自己去獲取這些信息。  回復  更多評論   
            • # re: Linux的系統性能監測參數獲取
              magixescuchador@hotmail.com
              Posted @ 2007-12-18 21:51
              ni hao  回復  更多評論   
             
            99久久精品国产一区二区蜜芽 | 久久精品人人做人人爽电影| 久久亚洲中文字幕精品有坂深雪 | 久久免费视频一区| 久久精品国产久精国产果冻传媒 | 亚洲AV无码久久精品狠狠爱浪潮| 国内精品久久久人妻中文字幕| 91久久国产视频| 思思久久好好热精品国产| 久久精品国产亚洲一区二区| 7777精品伊人久久久大香线蕉 | 亚洲精品乱码久久久久久| 九九久久自然熟的香蕉图片| 亚洲国产成人精品女人久久久| 久久婷婷五月综合色奶水99啪| 99久久婷婷免费国产综合精品| 亚洲精品国产自在久久| 亚洲国产精品久久久久| 日本欧美久久久久免费播放网| 久久天天躁狠狠躁夜夜av浪潮| 精品精品国产自在久久高清| 婷婷久久久亚洲欧洲日产国码AV| 狠狠精品久久久无码中文字幕 | 久久99精品综合国产首页| 伊人久久一区二区三区无码| 国产亚洲成人久久| 亚洲成色999久久网站| 久久夜色精品国产网站| 久久精品国产男包| 久久无码AV中文出轨人妻| 热久久国产欧美一区二区精品| 国产99久久久久久免费看| 国产精品女同久久久久电影院| 一本色道久久88—综合亚洲精品| 色欲综合久久躁天天躁| 久久亚洲国产成人影院网站| 久久综合久久性久99毛片| 日日狠狠久久偷偷色综合免费 | 精产国品久久一二三产区区别 | 国产精品美女久久久免费| 久久99精品国产麻豆婷婷|