linux引數之/proc/sys/kernel詳解

myownstars發表於2013-02-04

Modprobe/modules_disabled

前者包含一個路徑指向核心模組載入器(kernel module loader),用於載入核心模組;而後一個用於控制是否允許在系統啟動後熱插拔模組,即進行modprobe/rmmod操作,0表示不禁止;

justin_$ more modprobe

/sbin/modprobe

 

Linux啟動初始化時需執行/etc/rc.d/rc.sysinit,而該指令碼其中一項就是載入使用者自定義模組/etc/sysconfig/modules/*.modules

該系統在啟動時會自動載入nvram/floppy/parport/lp/snd-powermac系統

justin_$ ls

udev-stw.modules

justin_$ more udev-stw.modules

#!/bin/sh

MODULES="nvram floppy parport lp snd-powermac"

[ -f /etc/sysconfig/udev-stw ] && . /etc/sysconfig/udev-stw

for i in $MODULES ; do

        modprobe $i >/dev/null 2>&1

done

而執行完rc.sysinit後,則要啟動外掛模組/etc/modprobe.conf,該檔案用來修改模組的部分選項配置

justin_$ more /etc/modprobe.conf

alias scsi_hostadapter shpchp

alias bond0 bonding

alias eth0 bnx2

alias eth1 bnx2

alias eth2 bnx2

alias eth3 bnx2

alias eth4 be2net

alias eth5 be2net

alias scsi_hostadapter1 cciss

alias scsi_hostadapter2 ata_piix

alias scsi_hostadapter3 qla2xxx

alias net-pf-10 off

alias ipv6 off

options ipv6 disable=1

options bond0 mode=balance-alb miimon=100

 

系統支援的所有模組位於/lib/modules/`uname -r`/kernel

 

threads-max

系統允許的最大執行緒數

justin_$ more threads-max

774028

Linux無法直接控制單個程式可擁有的執行緒數,但有參考公式max = VM/stack_size,預設stack8k,可透過降低stack大小或增加虛擬記憶體來調大每個程式可擁有的最大執行緒數;

對於支援多執行緒的程式如Java,有可能會遇到一個程式無法建立更多執行緒的情形,其原因多種多樣,而OS端可能由此引數造成;

  

 

http://dimitrik.free.fr/blog/archives/2010/11/mysql-performance-hitting-error-cant-create-a-new-thread-errno-11-on-a-high-number-of-connections.html  

 

pid_max

系統最大pid值,在大型系統裡可適當調大

justin_$ more pid_max

32768

 

hung_task_panic/ softlockup_thresh

linux下每個CPU都有一個看門狗(watchdog)程式,可透過ps -ef | grep -i watchdog檢視,該程式每秒獲取其CPU的當前時間戳並儲存於per-CPU,而timer interrupt()會呼叫softlock_tick(),該函式比較CPU當前時間與per-CPU儲存的時間,若差值大於softlockup_thresh則系統產生一條告警資訊,

BUG: soft lockup - CPU#1 stuck for 15s! [swapper:0] Pid: 0

如遇到此情形可配置kdump自動產生vcore跟蹤檔案;

預設情況下,當出現soft lockup時系統僅產生告警資訊,而將hung_task_panic設定為1時系統會panic

justin_$ more hung_task_panic

0

justin_$ more softlockup_thresh

60

justin_$ ps -ef | grep -i watchdog

root         5     2  0  2012 ?        00:00:00 [watchdog/0]

root         8     2  0  2012 ?        00:00:00 [watchdog/1]

root        11     2  0  2012 ?        00:00:00 [watchdog/2]

root        14     2  0  2012 ?        00:00:00 [watchdog/3]

root        17     2  0  2012 ?        00:00:00 [watchdog/4]

root        20     2  0  2012 ?        00:00:00 [watchdog/5]

root        23     2  0  2012 ?        00:00:00 [watchdog/6]

root        26     2  0  2012 ?        00:00:00 [watchdog/7]

root        29     2  0  2012 ?        00:00:00 [watchdog/8]

root        32     2  0  2012 ?        00:00:00 [watchdog/9]

root        35     2  0  2012 ?        00:00:00 [watchdog/10]

root        38     2  0  2012 ?        00:00:00 [watchdog/11]

root        41     2  0  2012 ?        00:00:00 [watchdog/12]

root        44     2  0  2012 ?        00:00:00 [watchdog/13]

root        47     2  0  2012 ?        00:00:00 [watchdog/14]

root        50     2  0  2012 ?        00:00:00 [watchdog/15]

root        53     2  0  2012 ?        00:00:00 [watchdog/16]

root        56     2  0  2012 ?        00:00:00 [watchdog/17]

root        59     2  0  2012 ?        00:00:00 [watchdog/18]

root        62     2  0  2012 ?        00:00:00 [watchdog/19]

root        65     2  0  2012 ?        00:00:00 [watchdog/20]

root        68     2  0  2012 ?        00:00:00 [watchdog/21]

root        71     2  0  2012 ?        00:00:00 [watchdog/22]

root        74     2  0  2012 ?        00:00:00 [watchdog/23]

justin_$ /sbin/modinfo softdog

filename:       /lib/modules/2.6.32-100.26.2.el5/kernel/drivers/watchdog/softdog.ko

alias:          char-major-10-130

license:        GPL

description:    Software Watchdog Device Driver

author:         Alan Cox

srcversion:     C7E767DB59D650F969C7438

depends:       

vermagic:       2.6.32-100.26.2.el5 SMP mod_unload modversions

parm:           soft_margin:Watchdog soft_margin in seconds. (0 < soft_margin < 65536, default=60) (int)

parm:           nowayout:Watchdog cannot be stopped once started (default=0) (int)

parm:           soft_noboot:Softdog action, set to 1 to ignore reboots, 0 to reboot (default depends on ONLY_TESTING) (int)

 

http://h10025.www1.hp.com/ewfrf/wc/document?cc=ca&dlc=en&docname=c02675677&lc=en  

http://damntechnology.blogspot.co.uk/2010/04/linux-crash-debug-tips-i-have-soft.html   

http://www.mjmwired.net/kernel/Documentation/lockup-watchdogs.txt  

http://blog.kreyolys.com/2011/03/17/no-panic-its-just-a-kernel-panic/

 

 

nmi_watchdog

NMI watchdog(non maskable interrupt)又稱硬體watchdog,用於檢測OS是否hang,系統硬體定期產生一個NMI,而每個NMI呼叫核心檢視其中斷數量,如果一段時間(10)後其數量沒有顯著增長,則判定系統已經hung,接下來啟用panic機制即重啟OS,如果開啟了Kdump還會產生crash dump檔案;

APIC(advanced programmable interrupt controller):高階可程式設計中斷控制器,預設內建於各個x86CPU中,在SMP中用於CPU間的中斷;比較高檔的主機板配備有IO-APIC,負責收集硬體裝置的中斷請求並轉發給APIC

要使用NMI Watchdog必須先啟用APICSMP核心預設啟動

該引數有2個選項:0不啟用;1/2啟用,有的硬體支援1有的支援2

當前系統便沒有啟用;

justin_$ more nmi_watchdog

0

justin_$ grep NMI /proc/interrupts

 NMI:          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0   Non-maskable interrupts

 

小結:

watchdog啟動後,如果/dev/watchdog一定時間間隔內沒有被更新,則判定系統hang並根據相應引數決定是否重啟

Watchdog有兩種:軟體/硬體模式,前者基於hrtimer而後者基於perf子系統,兩者不能同時執行

 

 

Panic

當核心panic時是否重啟,0不重啟,非0值表示N秒後重啟

justin_$ more panic

0

 

panic_on_io_nmi

當核心收到因I/O錯誤導致的NMI時是否panic

0表示不

justin_$ more panic_on_io_nmi

0

 

panic_on_oops

核心oops不同於panic,後者會導致OS重啟,而裝置驅動引發的oops通常不會如此;

Oops是由於核心引用了無效指標;發生於使用者空間程式通常產生一個段錯誤segfault,而使用者態程式自身無法恢復;發生於核心空間時則稱作oops

由於X86架構限制,當linux系統panic 預設無法儲存crash dump,因為此時核心不工作無法儲存當前記憶體資訊,SPARC架構則可完成,而RedHat分別開發了NetDump/Diskdump從而做到此功能;

justin_$ more panic_on_oops

1

如下是一段oops資訊,oops號碼很重要,EIP顯示了程式碼段和當前正在執行的指令集地址

Unable to handle kernel NULL pointer dereference at virtual address 00000014

*pde = 00000000

Oops: 0000

CPU: 0

EIP: 0010:[]

EFLAGS: 00210213

eax: 00000000 ebx: c6155c6c ecx: 00000038 edx: 00000000

esi: c672f000 edi: c672f07c ebp: 00000004 esp: c6155b0c

ds: 0018 es: 0018 ss: 0018

Process tar (pid: 2293, stackpage=c6155000)

Stack: c672f000 c672f07c 00000000 00000038 00000060 00000000 c6d7d2a0

c6c79018

00000001 c6155c6c 00000000 c6d7d2a0 c017eb4f c6155c6c 00000000

00000098

c017fc44 c672f000 00000084 00001020 00001000 c7129028 00000038

00000069

Call Trace: [] [] [] [] []

[] []

[] [] [] [] []

[] []

Code: 8b 40 14 ff d0 89 c2 8b 06 83 c4 10 01 c2 89 16 8b 83 8c 01

 

 

 

/proc/sys/kernel/slow-work

其實slow-work是個執行緒池機制,用於執行耗時相對較長的任務;

Linux中有slow-work的資料結構;

使用前需要呼叫int ret = slow_work_register_user();註冊;

justin_$ ls

max-threads  min-threads  vslow-percentage

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-753890/,如需轉載,請註明出處,否則將追究法律責任。

相關文章