linux参数之/proc/sys/kernel详解

时间:2021-05-24 16:25:23

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://dustycodes.wordpress.com/2012/02/09/increasing-number-of-threads-per-process/   

http://www.linuxidc.com/Linux/2011-12/48616.htm  

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子系统,两者不能同时运行

 

http://publib.boulder.ibm.com/infocenter/lnxinfo/v3r0m0/index.jsp?topic=%2Fliaai%2Fcrashdump%2Fliaaicrashdumpnmiwatch.htm

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