您好,登錄后才能下訂單哦!
目錄
一、sysctl簡介
二、sysctl命令使用
三、sysctl配置文件/etc/sysctl.conf詳解
四、/proc目錄簡介
五、/proc/sys下內核文件與配置文件sysctl.conf中變量的對應關系
一、sysctl簡介
sysctl 是一個用來在系統運作中查看及調整系統參數的工具。有的sysctl參數只是用來查看目前的系統狀況,例如查看目前已開機時間、所使用的操作系統版本、核心名稱等等;而有的可以讓我們修改參數以調整系統運作的行為,例如網絡暫存內存的大小、最大的上線人數等等。
/etc/sysctl.conf就是sysctl的配置文件,而這些可以調整的參數中必須在一開機系統執行其它程序前就設定好,有的可以在開機完后任意調整。同大多數配置文件一樣,我們可以對sysctl.conf進行配置來優化系統的性能.
二、sysctl命令使用
[root@www ~]# sysctl --help usage: sysctl [-n] [-e] variable ... sysctl [-n] [-e] [-q] -w variable=value ... sysctl [-n] [-e] -a sysctl [-n] [-e] [-q] -p <file> (default /etc/sysctl.conf) sysctl [-n] [-e] -A
常用參數:
-w 臨時改變某個指定參數的值,如
sysctl -w net.ipv4.ip_forward=1
-a 顯示所有的系統參數
-p 從指定的文件加載系統參數,如不指定即從/etc/sysctl.conf中加載
三、sysctl配置文件/etc/sysctl.conf
[root@ElementServer ~]# cat /etc/sysctl.conf|grep -v '^#\|^$' net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0 kernel.msgmnb = 5368760912 kernel.msgmax = 16777216 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 kernel.shmmni = 8192 fs.file-max = 6553560
解釋一下sysctl.conf文件中參數的意義:
net.ipv4.ip_forward = 0:
出于安全考慮,Linux系統默認是禁止數據包轉發的。所謂轉發即當主機擁有多于一塊的網卡時,其中一塊收到數據包,根據數據包的目的ip地址將包發往本機另一網卡,該網卡根據路由表繼續發送數據包。這通常就是路由器所要實現的功能。
配置Linux系統的ip轉發功能,首先保證硬件連通,然后打開系統的轉發功能
less /proc/sys/net/ipv4/ip_forward,該文件內容為0,表示禁止數據包轉發,1表示允許,將其修改為1。可使用命令echo "1" > /proc/sys/net/ipv4/ip_forward 修改文件內容,重啟網絡服務或主機后效果不再。若要其自動執行,可在/etc/sysctl.conf中net.ipv4.ip_forward = 1
捉著命令echo "1" > /proc/sys/net/ipv4/ip_forward 寫入腳本/etc/rc.d/rc.local
或者 在/etc/sysconfig/network腳本中添加 FORWARD_IPV4="YES"
kernel.shmmax:
是核心參數中最重要的參數之一,用于定義單個共享內存段的最大值。設置應該足夠大,能在一個共享內存段下容納下整個的SGA ,設置的過低可能會導致需要創建多個共享內存段,這樣可能導致系統性能的下降。至于導致系統下降的主要原因為在實例啟動以及ServerProcess創建的時候,多個小的共享內存段可能會導致當時輕微的系統性能的降低(在啟動的時候需要去創建多個虛擬地址段,在進程創建的時候要讓進程對多個段進行“識別”,會有一些影響),但是其他時候都不會有影響。
官方建議值:
32位linux系統:可取最大值為4GB(4294967296bytes)-1byte,即4294967295。建議值為多于內存的一半,所以如果是32為系統,一般可取值為4294967295。32位系統對SGA大小有限制,所以SGA肯定可以包含在單個共享內存段中。
64位linux系統:可取的最大值為物理內存值-1byte,建議值為多于物理內存的一半,一般取值大于SGA_MAX_SIZE即可,可以取物理內存-1byte。例如,如果為12GB物理內存,可取12*1024*1024*1024-1=12884901887,SGA肯定會包含在單個共享內存段中。
kernel.shmall:
該參數控制可以使用的共享內存的總頁數。Linux共享內存頁大小為4KB,共享內存段的大小都是共享內存頁大小的整數倍。一個共享內存段的最大大小是16G,那么需要共享內存頁數是16GB/4KB=16777216KB /4KB=4194304(頁),也就是64Bit系統下16GB物理內存,設置kernel.shmall = 4194304才符合要求(幾乎是原來設置2097152的兩倍)。這時可以將shmmax參數調整到16G了,同時可以修改SGA_MAX_SIZE和SGA_TARGET為12G(您想設置的SGA最大大小,當然也可以是2G~14G等,還要協調PGA參數及OS等其他內存使用,不能設置太滿,比如16G)
kernel.shmmni:
該參數是共享內存段的最大數量。shmmni缺省值4096,一般肯定是夠用了。
fs.file-max:
該參數決定了系統中所允許的文件句柄最大數目,文件句柄設置代表linux系統中可以打開的文件的數量。
fs.aio-max-nr:
此參數限制并發未完成的請求,應該設置避免I/O子系統故障。
推薦值是:1048576 其實它等于 1024*1024 也就是 1024K 個。
kernel.sem:
以kernel.sem = 250 32000 100 128為例:
250是參數semmsl的值,表示一個信號量集合中能夠包含的信號量最大數目。
32000是參數semmns的值,表示系統內可允許的信號量最大數目。
100是參數semopm的值,表示單個semopm()調用在一個信號量集合上可以執行的操作數量。
128是參數semmni的值,表示系統信號量集合總數。
net.ipv4.ip_local_port_range:
表示應用程序可使用的IPv4端口范圍。
net.core.rmem_default:
表示套接字接收緩沖區大小的缺省值。
net.core.rmem_max:
表示套接字接收緩沖區大小的最大值。
net.core.wmem_default:
表示套接字發送緩沖區大小的缺省值。
net.core.wmem_max:
表示套接字發送緩沖區大小的最大值
四、/proc目錄簡介
大家都知道進程都 是在內存中,而內存中的數據都寫入到了/proc/目錄中的文件中去了,所以很有必要分析這個文件夾內的內容。由于系統的信息,如進程,是動態改變的,所以用戶或應用程序讀取proc文件時,proc文件系統是動態從系統內核讀出所需信息并提交的。
1、proc文件系統總覽
在類Unix系統中體現了一種良好的抽象哲學,就是幾乎所有的數據實體都被抽象成一個統一的接口--文件來看待,這樣我們就可以用一些簡單的基本工具完成大量復雜的操作。
在Linux中存在著一類特殊的偽文件系統,用于使用與文件接口統一的操作來完成各種功能,例如ptyfs、devfs、sysfs和procfs。而procfs就是其中應用最廣泛的一種偽文件系統。
procfs是Linux內核信息的抽象文件接口,大量內核中的信息以及可調參數都被作為常規文件映射到一個目錄樹中,這樣我們就可以簡單直接的通過echo或cat這樣的文件操作命令對系統信息進行查取和調整了。同時procfs也提供了一個接口,使得我們自己的內核模塊或用戶態程序可以通過procfs進行參數的傳遞。在當今的Linux系統中,大量的系統工具也通過procfs獲取內核參數,例如ps、lspci等等,沒有procfs它們將可能不能正常工作。
procfs的使用如同常規的文件系統一樣,例如加載一個procfs (首先確定你的內核已經支持procfs默認如此):
# mount -t proc none /proc
也可以在/etc/fstab中加入如下一行使系統在啟動時自動加載procfs(大多數系統中也是默認如此):
none /proc proc defaults 0 0
在proc文件系統中,主要包含三大類內容,進程相關部分,系統信息部分,以及系統子系統部分。
在下面我們可以看到一個典型的procfs布局:
[root@www ~]# ls /proc 1 1230 147 2198 283 41 750 cpuinfo ipmi misc slabinfo vmstat 10 1238 148 22 284 42 8 crypto irq modules softirqs zoneinfo 1007 1249 15 2265 29 5 8958 devices kallsyms mounts stat 1037 1262 156 22958 293 586 9 diskstats kcore mpt swaps 1046 1264 157 22966 3 6 9271 dma keys mtd sys 1047 1266 158 23 30 7 935 driver key-users mtrr sysrq-trigger 1076 1268 16 23062 31 705 951 execdomains kmsg net sysvipc 1091 1271 17 23215 32 706 acpi fb kpagecount pagetypeinfo timer_list 11 1273 18 24 33 707 asound filesystems kpageflags partitions timer_stats 1110 1274 19 25 369 708 buddyinfo fs loadavg sched_debug tty 1198 1275 2 26 38 709 bus interrupts locks schedstat uptime 12 13 20 27 39 710 cgroups iomem mdstat scsi version 1222 14 21 28 4 72 cmdline ioports meminfo self vmallocinfo
在上面中我們可以看到procfs包含的內容:
* 進程相關部分 (只讀)
這部分文件都是以數字為名的子目錄,這個數字就是相關進程的進程ID,在后面中會詳細介紹進程相關子目錄的結構和信息。
需要注意的是procfs中進程子系統部分的一個特殊點,就是/proc/self,它是指向當前執行進程的符號連接,或者說--是指向未來你將要執行指令的心靈感應:
> cat self/cmdline
catself/cmdline
在這個命令中,我們希望它顯示當前進程的cmdline參數,它恰恰就顯示了當前進程--我們所執行的這條命令,cat self/cmdline。幸好這條指令顯示出的信息會忽略空格,導致顯示略微的不正常,否則我們倒是可以很容易的使用`cat self/cmdline`這樣的命令制造出永遠循環執行的進程來。;>
* 內核信息部分 (只讀)
這部分文件同樣處于/proc的頂層目錄,不過它們大部分都是常規、只讀的文本文件,可以直接用cat查看信息。作為系統內核執行體的抽象,我們也可以把它看作內核"進程"的信息部分,當然雖然并不存在這個進程實體。這里比較特別的一個文件是 /proc/cmdline :
>cat cmdline
ro root=/dev/hda2
在這個文件中存放的是系統內核引導時的命令行參數。
* 內核各子系統相關部分 (部分可調)
這部分是系統內核參數調整的重頭戲,在procfs中,除去上面所述的兩部分內容外,還有很大一部分信息文件被存放在了一些并非以數字命名的特殊目錄中,這些目錄下的信息就是內核各個重要子系統的信息和可調參數,
主要有:
bus 總線信息(只讀)
drivers 驅動信息(只讀)
fs 文件系統特別信息(只讀)
ide IDE接口信息(只讀)
irq IRQ信息(只讀)
net 網絡子系統信息(只讀)
scsi SCSI系統信息(只讀)
sysvipc IPC子系統信息(只讀)
tty tty子系統信息(只讀)
sys 系統內核可調參數 (可調)
作為Linux系統內核參數的抽象文件接口,Linux內核的大部分默認可調參數都被放在了 /proc/sys目錄下,這些參數都以常規文件的形式體現,并且可以用echo/cat等文件操作命令進行調整,調整的效果是即時的,并且在系統運行的整個生命周期之間都有效(直到再次改變它們或者系統重啟)。
當然Linux也提供了另外一種途徑sysctl來調整這些參數,sysctl是從BSD系統繼承而來的一種系統參數動態調整方法,sysctl的使用更為簡單,并且可以使用/etc/sysctl.conf保存配置以在下次啟動時自動加載這些設置
在/proc/sys目錄下存放著大多數的內核參數,并且設計成可以在系統運行的同時進行更改, 可以通過更改/proc/sys中內核參數對應的文件達到修改內核參數的目的(修改過后,保存配置文件就馬上自動生效),不過重新啟動機器后之前修改的參數值會失效,所以只能是一種臨時參數變更方案。(適合調試內核參數優化值的時候使用,如果設置值有問題,重啟服務器還原原來的設置參數值了。簡單方便。)
但是如果調試內核參數優化值結束后,需要永久保存參數值,就要通過修改/etc/sysctl.conf內的內核參數來永久保存更改。但只是修改sysctl文件內的參數值,確認保存修改文件后,設定的參數值并不會馬上生效,如果想使參數值修改馬上生效,并且不重啟服務器,可以執行下面的命令:
#sysctl –p
五、/proc/sys下內核文件與配置文件sysctl.conf中變量的對應關系
由于可以修改的內核參數都在/proc/sys目錄下,所以sysctl.conf的變量名省略了目錄的前面部分(/proc/sys)。
即將/proc/sys中的文件轉換成sysctl中的變量依據下面兩個簡單的規則:
1.去掉前面部分/proc/sys
2.將文件名中的斜杠變為點
這兩條規則可以將/proc/sys中的任一文件名轉換成sysctl中的變量名。
例如:
/proc/sys/net/ipv4/ip_forward =》 net.ipv4.ip_forward
/proc/sys/kernel/hostname =》 kernel.hostname
可以使用下面命令查詢所有可修改的變量名
# sysctl –a
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。