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,默认stack为8k,可通过降低stack大小或增加虚拟内存来调大每个进程可拥有的最大线程数;
对于支持多线程的程序如Java,有可能会遇到一个进程无法创建更多线程的情形,其原因多种多样,而OS端可能由此参数造成;
http://dustycodes.wordpress.com/2012/02/09/increasing-number-of-threads-per-process/
http://www.linuxidc.com/Linux/2011-12/48616.htm
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必须先激活APIC,SMP内核默认启动
该参数有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子系统,两者不能同时运行
http://slacksite.com/slackware/nmi.html
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
http://slacksite.com/slackware/oops.html
/proc/sys/kernel/slow-work
其实slow-work是个线程池机制,用于执行耗时相对较长的任务;
Linux中有slow-work的数据结构;
使用前需要调用int ret = slow_work_register_user();注册;
justin_$ ls
max-threads min-threads vslow-percentage