"proc文件系統是一個僞文件系統,它只存在內存當中,而不佔用外存空間。它以文件系統的方式爲訪問系統內核數據的操作提供接口。用戶和應用程序可以通過proc得到系統的信息,並可以改變內核的某些參數。"
這裏將介紹如何從/proc文件系統中獲取與防火牆相關的一些性能參數,以及如何通過/proc文件系統修改內核的相關配置。
1、從/proc文件系統獲取相關的性能參數
cpu使用率: /proc/stat
內存使用情況: /proc/meminfo
網絡負載信息: /proc/net/dev
相應的計算方法:(摘自:什麼是proc文件系統,見參考資料)
(1) 處理器使用率
(2) 內存使用率
(3) 流入流出數據包
(4) 整體網絡負載
這些數據分別要從/proc/stat、/proc/net/dev、/proc/meminfo三個文件中提取。如裏有問題或對要提取的數據不太清楚,可以使用man proc來查看proc文件系統的聯機手冊。
(1) 處理器使用率
這裏要從/proc/stat中提取四個數據:用戶模式(user)、低優先級的用戶模式(nice)、內核模式(system)以及空閒的處理器時間(idle)。它們均位於/proc/stat文件的第一行。CPU的利用率使用如下公式來計算。
CPU利用率 = 100 *(user + nice + system)/(user + nice + system + idle)
(2) 內存使用率
這裏需要從/proc/meminfo文件中提取兩個數據,當前內存的使用量(cmem)以及內存總量(amem)。
內存使用百分比 = 100 * (cmem / umem)
(3)網絡利用率
爲了得到網絡利用率的相關數據,需要從/proc/net/dev文件中獲得兩個數據:從本機輸出的數據包數,流入本機的數據包數。它們都位於這個文件的第四行。
性能收集程序開始記錄下這兩個數據的初始值,以後每次獲得這個值後均減去這個初始值即爲從集羣啓動開始從本節點通過的數據包。
利用上述數據計算出網絡的平均負載,方法如下:
平均網絡負載 = (輸出的數據包+流入的數據包) / 2
2. 通過/proc文件系統調整相關的內核配置
允許ip轉發 /proc/sys/net/ipv4/ip_forward
禁止ping /proc/sys/net/ipv4/icmp_echo_ignore_all
可以在命令行下直接往上述兩個“文件”裏頭寫入"1"來實現相關配置,如果寫入"0"將取消相關配置。不過在系統重啓以後,這些配置將恢復默認設置,所以,如果想讓這些修改生效,可以把下面的配置直接寫入/etc/profile文件,或者其他隨系統啓動而執行的程序文件中。
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
如果需要獲取其他的性能參數,或者需要對內核進行更多的配置,可以參考下面鏈接中的proc文件系統介紹,也可以直接通過man proc查看相關的信息。
在這裏我給大家分享一個CPU使用率的源代碼xml文件非常簡單就不上了
看代碼- import java.io.IOException;
- import java.io.RandomAccessFile;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.TextView;
- public class TextActivity extends Activity {
- private TextView mytext;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mytext = (TextView)findViewById(R.id.text);
- String sysv = "您手機的CPU使用率爲:"+readUsage();
- mytext.setText(sysv);
- }
-
-
- private float readUsage() {
-
- try { RandomAccessFile reader = new RandomAccessFile("/proc/stat", "r");
-
- String load = reader.readLine();
-
- String[] toks = load.split(" ");
-
- long idle1 = Long.parseLong(toks[5]);
-
- long cpu1 = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[4]) + Long.parseLong(toks[6]) + Long.parseLong(toks[7]) + Long.parseLong(toks[8]);
-
- try { Thread.sleep(360);
-
- } catch (Exception e) {}
-
- reader.seek(0);
-
- load = reader.readLine();
-
- reader.close();
-
- toks = load.split(" ");
-
- long idle2 = Long.parseLong(toks[5]);
-
- long cpu2 = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[4]) + Long.parseLong(toks[6]) + Long.parseLong(toks[7]) + Long.parseLong(toks[8]);
-
- return (int)(100*(cpu2 - cpu1) / ((cpu2 + idle2) - (cpu1 + idle1)));
-
- } catch (IOException ex) { ex.printStackTrace();
-
- }
-
- return 0; }
-
- }