linux概念之/proc與/sys


http://blog.chinaunix.net/uid-1835494-id-3070465.html   proc/x:1/sched

http://bbs.chinaunix.net/thread-2002769-1-1.html  proc文件系統詳解

Linux系統上的/proc目錄是一種文件系統,即proc文件系統。與其它常見的文件系統不同的是,/proc是一種偽文件系統(也即虛擬文件系統),存儲的是當前內核運行狀態的一系列特殊文件,用戶可以通過這些文件查看有關系統硬件及當前正在運行進程的信息,甚至可以通過更改其中某些文件來改變內核的運行狀態。
大多數虛擬文件可以使用文件查看命令如cat、more或者less進行查看,有些文件信息表述的內容可以一目了然,但也有文件的信息卻不怎么具有可讀性。不過,這些可讀性較差的文件在使用一些命令如apm、free、lspci或top查看時卻可以有着不錯的表現。

/proc/sched_debug
/proc/schedstat 總
/proc/pid/schedstat 分
/proc/pid/sched

[root@250-shiyan 27227]# cat sched
mfsmount (27227, #threads: 13)
---------------------------------------------------------
se.exec_start                      :    4298337843.907125
se.vruntime                        :       4714787.554887
se.sum_exec_runtime                :            23.716516
se.wait_start                      :             0.000000
se.sleep_start                     :    4298337843.907125
se.block_start                     :             0.000000
se.sleep_max                       :             1.655287
se.block_max                       :             0.000000
se.exec_max                        :             1.003137
se.slice_max                       :             3.550532
se.wait_max                        :             0.310097
se.wait_sum                        :             0.745722
se.wait_count                      :                   11
se.iowait_sum                      :           494.469927
se.iowait_count                    :                  131
sched_info.bkl_count               :                    1
se.nr_migrations                   :                    0
se.nr_migrations_cold              :                    0
se.nr_failed_migrations_affine     :                    0
se.nr_failed_migrations_running    :                    0
se.nr_failed_migrations_hot        :                    0
se.nr_forced_migrations            :                    0
se.nr_wakeups                      :                    1
se.nr_wakeups_sync                 :                    1
se.nr_wakeups_migrate              :                    0
se.nr_wakeups_local                :                    1
se.nr_wakeups_remote               :                    0
se.nr_wakeups_affine               :                    0
se.nr_wakeups_affine_attempts      :                    0
se.nr_wakeups_passive              :                    0
se.nr_wakeups_idle                 :                    0
avg_atom                           :             2.371651
avg_per_cpu                        :             0.000001
nr_switches                        :                   10
nr_voluntary_switches              :                    2
nr_involuntary_switches            :                    8
se.load.weight                     :                71755
policy                             :                    0
prio                               :                  101
clock-delta                        :                  135

[root@250-shiyan 27227]# cat schedstat
23716516 745722 10
[root@250-shiyan 27227]# cat /proc/schedstat
version 15
timestamp 9130051710
cpu0 0 0 90294274 19486189 49453373 49453373 5270546755145 379982355396 70804217
[root@250-shiyan 27227]# cat /proc/sched_debug
Sched Debug Version: v0.09, 2.6.32-431.el6.x86_64 #1
now at 4835548701.686494 msecs
  .jiffies                                 : 9130215997
  .sysctl_sched_latency                    : 5.000000
  .sysctl_sched_min_granularity            : 1.000000
  .sysctl_sched_wakeup_granularity         : 1.000000
  .sysctl_sched_child_runs_first           : 0.000000
  .sysctl_sched_features                   : 3183
  .sysctl_sched_tunable_scaling            : 1 (logaritmic)

cpu#0, 3092.974 MHz
  .nr_running                    : 1
  .load                          : 1024
  .nr_switches                   : 90292999
  .nr_load_updates               : 21243167
  .nr_uninterruptible            : 0
  .next_balance                  : 9130.216230
  .curr->pid                     : 1037
  .clock                         : 4834502548.387724
  .cpu_load[0]                   : 1024
  .cpu_load[1]                   : 512
  .cpu_load[2]                   : 256
  .cpu_load[3]                   : 128
  .cpu_load[4]                   : 64
  .yld_count                     : 0
  .sched_switch                  : 0
  .sched_count                   : 90296954
  .sched_goidle                  : 19487350
  .avg_idle                      : 994034
  .ttwu_count                    : 49454858
  .ttwu_local                    : 49454858
  .bkl_count                     : 706

cfs_rq[0]:/
  .exec_clock                    : 5263171.784834
  .MIN_vruntime                  : 0.000001
  .min_vruntime                  : 5035599.468468
  .max_vruntime                  : 0.000001
  .spread                        : 0.000000
  .spread0                       : 0.000000
  .nr_spread_over                : 7543
  .nr_running                    : 1
  .load                          : 1024
  .load_avg                      : 0.000000
  .load_period                   : 0.000000
  .load_contrib                  : 0
  .load_tg                       : 0

rt_rq[0]:/
  .rt_nr_running                 : 0
  .rt_throttled                  : 0
  .rt_time                       : 0.000000
  .rt_runtime                    : 950.000000

runnable tasks:
            task   PID         tree-key  switches  prio     exec-runtime         sum-exec        sum-sleep
----------------------------------------------------------------------------------------------------------
R            cat  1037   5035599.468468         1   120   5035599.468468         0.470952         0.000000 /

[root@250-shiyan 27227]#

/proc/pid/schedstat
/proc/pid/sched
/proc/schedstat
/proc/sched_debug

proc的調度相關字段解釋 2.6.32內核
CONFIG_SCHED_DEBUG (需要配置CONFIG_SCHEDSTAT才能顯示更多信息)
/proc/pid/sched  顯示信息解釋如下:
ata/2 (111, #threads: 1)
---------------------------------------------------------
se.exec_start                      :          1159.482823    //此進程最近被調度到的開始執行時刻 ns
se.vruntime                        :            -1.044234    //虛擬運行時間,cfs調度用
se.sum_exec_runtime                :             0.000000    //累計運行時間
se.avg_overlap                     :             0.000000   
se.avg_wakeup                      :             3.617187    //當前進程最近一次調用try_to_wake_up為止的單次執行時間
se.avg_running                     :             0.000000   //平均單次執行時間
//以下開始需要同時配置CONFIG_SCHEDSTATS才能顯示
se.wait_start                      :             0.000000  //最近一次當前進程被入隊的時刻 cfs使用
se.sleep_start                     :          1159.482823 //此進程最近一次被從隊列里取出,並被置S狀態的時刻
se.block_start                     :             0.000000 //此進程最近一次被從隊列里取出,並被置D狀態的時刻
se.sleep_max                       :             0.000000 //最長處於S狀態時間
se.block_max                       :             0.482651 //最長處於D狀態時間
se.exec_max                        :             0.000000 //最長單次執行時間
se.slice_max                       :             0.000000 //曾經獲得時間片的最長時間 (當cpu load過高時開始計算)
se.wait_max                        :             0.000000 //最長在就緒隊列里的等待時間
se.wait_sum                        :             0.000000 //累計在就緒隊列里的等待時間
se.wait_count                      :                    2 //累計等待次數 (被出隊的次數) cfs使用,當被選中做下一個待運行進程時(set_next_entity),等待結束
se.iowait_sum                      :             0.000000 //io等待時間
se.iowait_count                    :                    0 //io等待次數  io_schedule調用次數
sched_info.bkl_count               :                    0 //此進程大內核鎖調用次數
se.nr_migrations                   :                    2 //需要遷移當前進程到其他cpu時累加此字段
se.nr_migrations_cold              :                    0  //2.6.32 代碼里賦值都是0
se.nr_failed_migrations_affine     :                    0   //進程設置了cpu親和,進程遷移時檢查失敗的次數
se.nr_failed_migrations_running    :                    0    //當前進程出入R,不運行遷移的次數
se.nr_failed_migrations_hot        :                    0   //當前進程因為是cache hot導致遷移失敗的次數
se.nr_forced_migrations            :                    0    //在當前進程cache hot下,由於負載均衡嘗試多次失敗,強行進行遷移的次數
se.nr_forced2_migrations           :                    1     //在當前進程是cache hot下,設置此進程進行遷移的次數
se.nr_wakeups                      :                    1  // 被喚醒的累計次數
se.nr_wakeups_sync                 :                    0  // 同步喚醒次數,即a喚醒b,a立刻睡眠,b被喚醒的次數 /* waker goes to sleep after wakup */
se.nr_wakeups_migrate              :                    0  //被喚醒得到調度的當前cpu,不是之前睡眠的cpu的次數
se.nr_wakeups_local                :                    0 //被本地喚醒的次數
se.nr_wakeups_remote               :                    1 //其他喚醒累計次數
se.nr_wakeups_affine               :                    0 //考慮了任務的cache親和性的喚醒次數
se.nr_wakeups_affine_attempts      :                    0 //嘗試進行考慮了任務的cache親和性的喚醒次數
se.nr_wakeups_passive              :                    0 //2.6.32 代碼里賦值都是0
se.nr_wakeups_idle                 :                    0 //2.6.32 代碼里賦值都是0
avg_atom                           :             0.000000 //本進程平均切換耗時
avg_per_cpu                        :             0.000000 //如果本進程曾經被推或者拉到其他cpu上,則計算每個cpu上的平均耗時
nr_switches                        :                    2 //主動切換和被動切換的累計次數
nr_voluntary_switches              :                    2  //主動切換次數
nr_involuntary_switches            :                    0  //被動切換次數
se.load.weight                     :                 1024  //權重,和負載均衡有關
policy                             :                    0  //進程屬性,0為非實時
                                                       #define SCHED_NORMAL  0
                                                       #define SCHED_FIFO  1
                                                       #define SCHED_RR  2
                                                       #define SCHED_BATCH  3
                                                       #define SCHED_IDLE  5
prio                               :                  120  //優先級
clock-delta                        :                  165  //測試用

/proc/sched_debug
此為cpu15運行隊列的調度信息:
cpu#15, 1595.968 MHz
  .nr_running                    : 0                           //運行隊列里處於就緒態進程的數目
  .load                          : 0                          //當前cpu負載
  .nr_switches                   : 120820818                  //切換累計次數
  .nr_load_updates               : 674238115                  //cpu權重更新的次數,和負載均衡有關
  .nr_uninterruptible            : -30                       
  .next_balance                  : 8012.054504               //下次執行定時負載均衡的時間
  .curr->pid                     : 0                         //當前運行進程
  .clock                         : 3717386659.081997          //當前cpu運行隊列時刻
  .cpu_load[0]                   : 0                          //以下為cpu歷史負載數組
  .cpu_load[1]                   : 0
  .cpu_load[2]                   : 0
  .cpu_load[3]                   : 0
  .cpu_load[4]                   : 0

   //以下開始需要同時配置CONFIG_SCHEDSTATS才記錄
  .yld_count                     : 8236                      //調yield的次數
  .sched_switch                  : 0                       
  .sched_count                   : 122061248                //調用schedule的次數,>=nr_switches
  .sched_goidle                  : 30689623                  //切換到idle進程的次數
  .avg_idle                      : 1000000                   //cpu處於idle的平均時間
  .ttwu_count                    : 46238267                 //此cpu try_to_wake_up喚醒進程的次數
  .ttwu_local                    : 30988951                 //本地喚醒的次數,即進程睡眠前所在cpu為當前cpu
  .bkl_count                     : 2090                     //此cpu上大內核鎖調用次數

cfs_rq[15]:/
  .exec_clock                    : 545099081.498339           //非實時線程得到調度的累計時間
  .MIN_vruntime                  : 0.000001                   //當前cfs 運行隊列里虛擬時間最小的那個進程的vtime
  .min_vruntime                  : 770437019.732761           //當前cfs 運行隊列虛擬時間下限,當處於rb樹最左邊進程運行虛擬時間,減去此值大於一個閾值后搶占當前進程
  .max_vruntime                  : 0.000001                   // 2.6.32里沒有找到這個字段
  .spread                        : 0.000000                  
  .spread0                       : 407973445.279093            //cpu0上的min_vruntime與當前cpu的min_vruntime差值
  .nr_running                    : 0                          //當前cpu非實時進程在就緒隊列中的個數
  .load                          : 0                          //非實時進程負載
  .nr_spread_over                : 6811                        //當前cpu中,長時間非實時進程由一個進程占有的次數
                                                               s64 d = se->vruntime - cfs_rq->min_vruntime;
                                                               if (d > 3*sysctl_sched_latency)
                                                         schedstat_inc(cfs_rq, nr_spread_over);

  .shares                        : 0                          
 
rt_rq[15]:/
  .rt_nr_running                 : 0                                 //處於就緒隊列的實時進程個數
  .rt_throttled                  : 0                                  //是否限制實時進程的帶寬運行時間,實時進程是否需要讓出cpu
  .rt_time                       : 0.000000                          //做實時進程帶寬分析用
  .rt_runtime                    : 950.000000                          //做實時進程帶寬分析用

另外,還有一個:
/proc/schedstat
字段詳細解釋文檔在內核目錄的:
documentation/scheduler/sched-stats.txt

 

 

http://blog.chinaunix.net/uid-27411029-id-3522299.html   sysfs

http://www.iteedu.com/os/grub/grubdiary/1.php  多重操作系統

 

Debugfs文件系統目的是為開發人員提供更多內核數據,方便調試內容. 我們知道/proc文件系統關注的是進程信息,/sysfs關注是one-value-per-file策略集,而Debugfs文件系統沒有如此多限制,可是任何內核要輸出的信息。

內核中有三個常用的偽文件系統:procfs,debugfs和sysfs。
    procfs — The proc filesystem is a pseudo-filesystem which provides an interface to kernel data structures.
    sysfs — The filesystem for exporting kernel objects.
    debugfs — Debugfs exists as a simple way for kernel developers to make information available to user space.
它們都用於Linux內核和用戶空間的數據交換,但是適用的場景有所差異:
    procfs 歷史最早,最初就是用來跟內核交互的唯一方式,用來獲取處理器、內存、設備驅動、進程等各種信息。
    sysfs 跟 kobject 框架緊密聯系,而 kobject 是為設備驅動模型而存在的,所以 sysfs 是為設備驅動服務的。
    debugfs 從名字來看就是為debug而生,所以更加靈活。
它們仨的掛載方式類似,做個實驗:

標准形式

mount -t type device dir

Debugfs沒有物理設備,其掛載方式:
mount -t debugfs none /sys/kernel/debug

這樣后,用df -a可以看到filesystem列為none的都是無物理設備即虛擬文件系統的掛載方式


$ sudo mkdir /tmp/{proc,sys,debug}
$ sudo mount -t proc none|nonedev|任意名字都可以 /tmp/proc/
$ sudo mount -t sys nondev /tmp/sys/
$ sudo mount -t debugfs nondev /tmp/debug/
不過,默認情況下,它們分別掛載在/proc,/sys/,/sys/kernel/debug/。

通過比較發現,上述三個文件系統的 API 用法類似,而其中 debugfs 和 procfs 幾乎有相同的參數,用的主要結構體是 struct file_operations,蠻多操作可以用 seq_* 家族的函數來實現。而 sysfs 則用到比較簡單一些的 struct global_attr 結構體。對於提供給用戶空間的節點,都可以輕松實現讀寫操作。
在創建目錄方面,debugfs 和 procfs 類似,且比較簡單。而 sysfs 要創建一級目錄,需要先創建一個 kobject 對象。
為了簡化設備模型依據總線創建的訪問節點路徑,sysfs 提供了API用於創建更簡易的符號鏈接,可以創建到自己指定的目錄下,也可以用設備類(Class)提供的API創建到設備類所屬的目錄下。
對於 sysfs,由於 kobject 與 device 的一對一依存關系,也可以直接用 device_create_file 來創建節點。 

 

http://www.ibm.com/developerworks/cn/linux/l-cn-sysfs/#sysfs-rules.txt

是 Linux 內核中設計較新的一種虛擬的基於內存的文件系統,它的作用與 proc 有些類似,但除了與 proc
相同的具有查看和設定內核參數功能之外,還有為 Linux 統一設備模型作為管理之用。相比於 proc 文件系統,使用 sysfs
導出內核數據的方式更為統一,並且組織的方式更好,它的設計從 proc 中吸取了很多教訓。本文就 sysfs 的掛載點 /sys 目錄結構、其與
Linux 統一設備模型的關系、常見屬性文件的用法等方面對 sysfs 作入門介紹,並且就內核編程方面,以具體的例子來展示如何添加 sysfs
支持。
sysfs 本身並不是一項很新的技術,但筆者發現,雖然 sysfs 從2003年誕生至今已有5年,但人們對 sysfs
依然缺乏了解;一個很重要的原因可能是缺乏文檔, Linux 內核方面最重要的理論書籍“Linux 設備驅動第3版”和“理解 Linux
內核第2版”都誕生於2003年前后,並且從那以后尚未有再版過,其它一些重要文章則多對 sysfs 與 proc 相提並論且舉例常常只有
proc,這導致了 sysfs 的很多重要概念至今仍鮮為人知,因此有必要對 sysfs 作更多介紹,這是寫作本文的初衷。

sysfs文件系統總是被掛載在 /sys 掛載點上。雖然在較早期的2.6內核系統上並沒有規定 sysfs 的標准掛載位置,可以把 sysfs
掛載在任何位置,但較近的2.6內核修正了這一規則,要求 sysfs 總是掛載在 /sys 目錄上;針對以前的 sysfs
掛載位置不固定或沒有標准被掛載,有些程序從 /proc/mounts 中解析出 sysfs
是否被掛載以及具體的掛載點,這個步驟現在已經不需要了。

sysfs 與 proc 相比有很多優點,最重要的莫過於設計上的清晰。一個 proc 虛擬文件可能有內部格式,如 /proc/scsi/scsi,它是可讀可寫的,(其文件權限被錯誤地標記為了 0444!,這是內核的一個BUG),並且讀寫格式不一樣,代表不同的操作,應用程序中讀到了這個文件的內容一般還需要進行字符串解析,而在寫入時需要先用字符串
格式化按指定的格式寫入字符串進行操作;相比而言, sysfs 的設計原則是一個屬性文件只做一件事情, sysfs
屬性文件一般只有一個值,直接讀取或寫入。整個 /proc/scsi 目錄在2.6內核中已被標記為過時(LEGACY),它的功能已經被相應的 /sys 屬性文件所完全取代。新設計的內核機制應該盡量使用 sysfs 機制,而將 proc 保留給純凈的“進程文件系統”。

可以看到在 /sys 目錄下有 block, bus, class, dev, devices, firmware, fs, kernel, module, power這些子目錄,
在 /sys/devices下是所有設備的真實對象,包括如視頻卡和以太網卡等真實的設備,也包括 ACPI 等不那么顯而易見的真實設備、還有 tty, bonding等純粹虛擬的設備;在其它目錄如 class, bus 等中則在分類的目錄中含有大量對 devices 中真實對象引用的符號鏈接文件;
/sys/devices這是內核對系統中所有設備的分層次表達模型,也是 /sys 文件系統管理設備的最重要的目錄結構
/sys/dev這個目錄下維護一個按字符設備和塊設備的主次號碼 (major:minor)鏈接到真實的設備(/sys/devices下)的符號鏈接文件,它是在內核 2.6.26 首次引入
/sys/bus這是內核設備按總線類型分層放置的目錄結構,devices 中的所有設備都是連接於某種總線之下,在這里的每一種具體總線之下可以找到每一個具體設備的符號鏈接,它也是構成 Linux 統一設備模型的一部分
/sys/class這是按照設備功能分類的設備模型,如系統所有輸入設備都會出現在 /sys/class/input 之下,而不論它們是以何種總線連接到系統。它也是構成 Linux 統一設備模型的一部分
/sys/block這里是系統中當前所有的塊設備所在,按照功能來說放置在 /sys/class 之下會更合適,但只是由於歷史遺留因素而一直存在於/sys/block, 但從 2.6.22 開始就已標記為過時,只有在打開了 CONFIG_SYSFS_DEPRECATED配置下編譯才會有這個目錄的存在,並且在 2.6.26 內核中已正式移到 /sys/class/block, 舊的接口 /sys/block為了向后兼容保留存在,但其中的內容已經變為指向它們在 /sys/devices/ 中真實設備的符號鏈接文件
/sys/firmware這里是系統加載固件機制的對用戶空間的接口,關於固件有專用於固件加載的一套API
/sys/fs這里按照設計是用於描述系統中所有文件系統,包括文件系統本身和按文件系統分類存放的已掛載點,但目前只有 fuse,gfs2 等少數文件系統支持sysfs 接口,一些傳統的虛擬文件系統(VFS)層次控制參數仍然在 sysctl (/proc/sys/fs) 接口中
/sys/kernel這里是內核所有可調整參數的位置,目前只有 uevent_helper, kexec_loaded, mm, 和新式的 slab 分配器等幾項較新的設計在使用它,其它內核可調整參數仍然位於 sysctl (/proc/sys/kernel) 接口中
/sys/module這里有系統中所有模塊的信息,不論這些模塊是以內聯(inlined)方式編譯到內核映像文件(vmlinuz)中還是編譯為外部模塊(ko文件),都可能會出現在 /sys/module 中

    編譯為外部模塊(ko文件)在加載后會出現對應的 /sys/module//, 並且在這個目錄下會出現一些屬性文件和屬性目錄來表示此外部模塊的一些信息,如版本號、加載狀態、所提供的驅動程序等;
    編譯為內聯方式的模塊則只在當它有非0屬性的模塊參數時會出現對應的 /sys/module/, 這些模塊的可用參數會出現在 /sys/modules//parameters/ 中,
        如 /sys/module/printk/parameters/time 這個可讀寫參數控制着內聯模塊 printk 在打印內核消息時是否加上時間前綴;
        所有內聯模塊的參數也可以由
        ".="
        的形式寫在內核啟動參數上,如啟動內核時加上參數 "printk.time=1" 與向
        "/sys/module/printk/parameters/time" 寫入1的效果相同;
    沒有非0屬性參數的內聯模塊不會出現於此。

/sys/power這里是系統中電源選項,這個目錄下有幾個屬性文件可以用於控制整個機器的電源狀態,如可以向其中寫入控制命令讓機器關機、重啟等。 /sys/slab (對應 2.6.23 內核,在 2.6.24 以后移至 /sys/kernel/slab)從2.6.23
開始可以選擇 SLAB 內存分配器的實現,並且新的 SLUB(Unqueued Slab Allocator)被設置為缺省值;如果編譯了此選項,在 /sys 下就會出現 /sys/slab ,里面有每一個 kmem_cache
結構體的可調整參數。對應於舊的 SLAB 內存分配器下的 /proc/slabinfo 動態調整接口,新式的/sys/kernel/slab/ 接口中的各項信息和可調整項顯得更為清晰。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM