天天看點

Linux調優之分析 /proc

參考資料

http://www.linuxfocus.org/ChineseGB/January2004/article324.shtml

先來了解下什麼是/proc

Linux 核心提供了一種通過 /proc 檔案系統,在運作時通路核心内部資料結構、 改變核心設定的機制。

/proc 是一個虛拟的檔案系統:

/proc 檔案系統是一種核心和核心子產品用來向程序 (process) 發送資訊的機制 (是以叫做 /proc)。這個僞檔案系統讓你可以和核心内部資料結構進行互動,擷取 有關程序的有用資訊,在運作中 (on the fly) 改變設定 (通過改變核心參數)。 與其他檔案系統不同,/proc 存在于記憶體之中而不是硬碟上。如果你察看檔案 /proc/mounts (和 mount 指令一樣列出所有已經加載的檔案系統),你會看到其中 一行是這樣的:

1

2

<code>[root@localhost ~]</code><code># grep proc /proc/mounts</code>

<code>proc</code><code>/proc</code><code>proc rw,relatime 0 0</code>

/proc 是由核心控制的,是以沒有所謂挂載proc的裝置,/proc主要是存放核心控制的狀态資訊,是以大部分這些資訊的邏輯位置位于核心控制的記憶體。對 /proc 進行 一次 'ls -l' 可以看到大部分檔案都是 0 位元組大的;不過察看這些檔案的時候,确 實可以看到一些資訊。這怎麼可能?這是因為 /proc 檔案系統和其他正常的檔案系 統一樣把自己注冊到虛拟檔案系統層 (VFS) 了。然而,直到當 VFS 調用它,請求 檔案、目錄的 i-node 的時候,/proc 檔案系統才根據核心中的資訊建立相應的檔案 和目錄。

檢視/proc 檔案系統, 我們可以通過如:“cat”、“less”、“more”等指令來檢視,當然了可以配合一些管道指令有如“grep”、“awk”、“sed”等來選取資料

當編輯程式試圖打開一個虛拟檔案時,這個檔案就通過核心 中的資訊被憑空地 (on the fly) 建立了。這是一些我從我的系統中得到的一些有趣 結果:

cpu資訊檔案 "/proc/cpuinfo"

執行cat檢視:

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

<code>[root@localhost proc]</code><code># cat /proc/cpuinfo</code>

<code>processor: 0</code>

<code>vendor_id: GenuineIntel</code>

<code>cpu family: 6</code>

<code>model: 58</code>

<code>model name: Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz</code>

<code>stepping: 9</code>

<code>cpu MHz: 2195.013</code>

<code>cache size: 6144 KB</code>

<code>physical</code><code>id</code><code>: 0</code>

<code>siblings: 3</code>

<code>core</code><code>id</code><code>: 0</code>

<code>cpu cores: 3</code>

<code>apicid: 0</code>

<code>initial apicid: 0</code>

<code>fpu:</code><code>yes</code>

<code>fpu_exception:</code><code>yes</code>

<code>cpuid level: 13</code>

<code>wp:</code><code>yes</code>

<code>flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology tsc_reliable nonstop_tsc aperfmperf unfair_spinlock pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes xsave avx hypervisor lahf_lm ida arat epb xsaveopt pln pts dts</code>

<code>bogomips: 4390.02</code>

<code>clflush size: 64</code>

<code>cache_alignment: 64</code>

<code>address sizes: 40 bits physical, 48 bits virtual</code>

<code>power management:</code>

<code>processor: 1</code>

<code>core</code><code>id</code><code>: 1</code>

<code>apicid: 1</code>

<code>initial apicid: 1</code>

<code>processor: 2</code>

<code>core</code><code>id</code><code>: 2</code>

<code>apicid: 2</code>

<code>initial apicid: 2</code>

<code>processor: 3</code>

<code>physical</code><code>id</code><code>: 1</code>

<code>apicid: 4</code>

<code>initial apicid: 4</code>

<code>processor: 4</code>

<code>apicid: 5</code>

<code>initial apicid: 5</code>

<code>processor: 5</code>

<code>apicid: 6</code>

<code>initial apicid: 6</code>

上述大部分的資訊十厘清楚地給出了這個系 統的有用的硬體資訊。有些 /proc 的檔案是經過編碼的,不同的工具可以被用來解釋 這些編碼過的資訊并輸出成可讀的形式。這樣的工具包括:'top', 'ps', 'apm' 等。

我們試試一些有趣的指令,

檢視邏輯CPU個數:

<code>cat</code><code>/proc/cpuinfo</code><code>|</code><code>grep</code><code>'processor'</code><code>|</code><code>wc</code><code>-l</code>

檢視實體CPU個數:

<code>cat</code><code>/proc/cpuinfo</code><code>|</code><code>grep</code><code>'physical id'</code><code>|</code><code>sort</code><code>|</code><code>uniq</code><code>|</code><code>wc</code><code>-l</code>

檢視每個實體CPU中Core的個數:

<code>cat</code><code>/proc/cpuinfo</code><code>|</code><code>grep</code><code>'cpu cores'</code><code>|</code><code>wc</code><code>-l</code>

感覺還不錯吧?通過這樣我們可以擷取一些關于這台計算機的一些配置資訊等,由此可以針對性進行分析優化。

proc 檔案系統可以被用于收集有用的關于系統和運作中的核心的資訊。下面是一些重要 的檔案:

/proc/cpuinfo - CPU 的資訊 (型号, 家族, 緩存大小等)

/proc/meminfo - 實體記憶體、交換空間等的資訊

/proc/mounts - 已加載的檔案系統的清單

/proc/devices - 可用裝置的清單

/proc/filesystems - 被支援的檔案系統

/proc/modules - 已加載的子產品

/proc/version - 核心版本

/proc/cmdline - 系統啟動時輸入的核心指令行參數

proc 中的檔案遠不止上面列出的這麼多。想要進一步了解的讀者可以對 /proc 的每一個 檔案都'more'一下或讀參考文獻[1]擷取更多的有關 /proc 目錄中的檔案的資訊。我建議 使用'more'而不是'cat',除非你知道這個檔案很小,因為有些檔案 (比如 kcore) 可能 會非常長。

舉個例子,檢視核心的版本

可以看到上面的資訊幾乎和“uname -a”輸出的資訊相同

/proc 檔案系統可以用于擷取運作中的程序的資訊。在 /proc 中有一些編号的子目錄。每個編号的目錄對應一個程序 id (PID)。這樣,每一個運作中的程序 /proc 中都有一個用它的 PID 命名的目錄。這些子目錄中包含可以提供有關程序的狀态和環境的重要細節資訊的檔案。讓我們試着查找一個運作中的程序。

在這裡我讓vim程式在背景運作

執行

<code>ps</code><code>-aef |</code><code>grep</code><code>vim</code>

我們看到了背景vim程式的pid号是 "2015"

我們來看下在/proc中pid為2015的資訊:

檔案 "cmdline" 包含啟動程序時調用的指令行。"envir" 程序的環境變兩。 "status" 是程序的狀态資訊,包括啟動程序的使用者的使用者ID (UID) 群組ID(GID) , 父程序ID (PPID),還有程序目前的狀态,比如"Sleelping"和"Running"。 每個程序的目錄都有幾個符号連結,"cwd"是指向程序目前工作目錄的符号 連結,"exe"指向運作的程序的可執行程式,"root"指向被這個程序看作是 根目錄的目錄 (通常是"/")。目錄"fd"包含指向程序使用的檔案描述符的連結。 "cpu"僅在運作 SMP 核心時出現,裡面是按 CPU 劃分的程序時間。

/proc/self 是一個有趣的子目錄,它使得程式可以友善地使用 /proc 查找本程序地資訊。/proc/self 是一個連結到 /proc 中通路 /proc 的程序所對應的 PID 的目錄的符号連結。

上面讨論的大部分 /proc 的檔案是隻讀的。而實際上 /proc 檔案系統通過 /proc 中可讀寫的檔案提供了對核心的互動機制。寫這些檔案可以改變核心 的狀态,因而要慎重改動這些檔案。/proc/sys 目錄存放所有可讀寫的檔案 的目錄,可以被用于改變核心行為。

/proc/sys/kernel - 這個目錄包含反通用核心行為的資訊。 /proc/sys/kernel/{domainname, hostname} 存放着機器/網絡的域名和主機名。 這些檔案可以用于修改這些名字。

我們通過了cat檢視了/proc中的hostname與domainname的資訊,然後通過 echo 把/proc中的資訊修改并且/proc會在核心中做相對應的修改

這樣,通過修改 /proc 檔案系統中的檔案,我們可以修改主機名。很多其 他可配置的檔案存在于 /proc/sys/kernel/。這裡不可能列出所有這些檔案, 讀者可以自己去這個目錄檢視以得到更多細節資訊。

另一個可配置的目錄是 /proc/sys/net。這個目錄中的檔案可以 用于修改機器/網絡的網絡屬性。比如,簡單修改一個檔案,你可以在網絡 上瘾藏匿的計算機。

<code>[root@localhost ~]</code><code># echo 1 &gt; /proc/sys/net/ipv4/icmp_echo_ignore_all</code>

這将在網絡上瘾藏你的機器,因為它不響應 icmp_echo。主機将不會響應其 他主機發出的 ping 查詢。

要改回預設設定,隻要

<code>[root@localhost ~]</code><code># echo 0 &gt; /proc/sys/net/ipv4/icmp_echo_ignore_all</code>

/proc 檔案系統提供了一個基于檔案的 Linux 内部接口。它可以用于确定系統 的各種不同裝置和程序的狀态。對他們進行配置。因而,了解和應用有關這個 檔案系統的知識是了解你的 Linux 系統的關鍵。

上一篇: Add Two Numbers
下一篇: Same Tree

繼續閱讀