Linux服务器在对应⽤程序进⾏优化配置的时候,经常使⽤到sysctl和PAM两个模块对服务器进⾏优化。
sysctl内核参数配置
使⽤“sysctl -a”命令可以查看所有正在使⽤的内核参数。内核参数⽐较多(⼀般多达500项),按照前缀主要分为以下⼏⼤类:net.ipv4、net.ipv6、、vm、fs、
dev.parport、dev.cdrom 、dev.raid、kernel等等。
注:安装的组件和使⽤的⽅式不⼀样,正在使⽤的内核参数是不⼀样的。所有的内核参数的说明⽂档是放到linux-source-code\Documentation\sysctl中的,如果想知道对内核参
数的说明,可以到该⽬录下查看相应的说明⽂档。
sysctl内核参数有两种修改⽅法
1) 命令设置的⽅式,对应内核运⾏配置参数
2) ⽂件设置的⽅式,对应内核静态配置参数
sysctl内核动态系统参数配置
其参数保存的主要位置为/proc/sys
使⽤“sysctl -w 参数名=值”的⽅式
例如:把net.ipv4.ip_forward的值修改为1,使⽤命令“sysctl -w net.ipv4.ip_forward=1”。
修改内核参数对应的proc⽂件
内核参数位于/proc/sys/之下,参数名称是以⽂件所在的路径,并将“/”以“.”来取代。举例来说,/proc/sys/net/ip_forward的参数名称为net.ipv4.ip_forward。
例如:把net.ipv4.ip_forward的值修改为1,使⽤命令“echo “1” > /proc/sys/net/ipv4/ip_forward”。
注意,这⾥proc⽂件跟普通的⽂件不⼀样。⼀般⼀个⽂件⽤echo写⼊内容之后,会变成⼀个⽂本⽂件,但echo修改proc⽂件之后还是个空⽂件。
sysctl内核静态系统参数配置
其参数保存的主要位置为/f,针对整个系统参数配置。⽂件⽅式的好处是内核参数设置的
值可以⽤⽂件保留下来。
内核参数默认保存在/f⽂件中。修改的时候可以直接⽤vi编辑f⽂件,增加要修改的内核参数内容,修改的格式为:参数名=值。
例如,把net.ipv4.ip_forward的值修改为1,在f中增加下⾯这⾏内容:
net.ipv4.ip_forward=1
⽂件修改好后,进⾏保存。
使⽤“sysctl -p 配置⽂件名”来使配置⽣效
如果配置⽂件是默认的,可以不⽤输配置⽂件名,即使⽤“sysctl -p”。
系统重启,通过配置⽂件启动内核⽣效
之前认为修改后的内核参数放在⽂件中,系统启动的时候会读这个⽂件,重启后设置应该不会失效。
但经过验证,⼀般会失效。需要把将默认的boot.sysctl服务打开,系统启动时就会执⾏这个⽂件的设置。
或者把修改参数的命令“/sbin/sysctl -e -p /f”写⼊启动执⾏脚本⽂件⾥/etc/rc.local,这样系统重启后配置就不会失效。
1./f 内核参数优化详解
以下为参考
kernel.shmall = 2043878        #共享内存总页数,计算公式,共享内存/4(KB)=N(页)。
kernel.shmmax = 17179869184    #单个共享内存段的最⼤值,Oracle中要⾜够⼤,应该>= sga_max_size,⼀般对于数据库系统影响⼤。
kernel.shmmni = 4096            #设置系统范围内共享内存段的最⼤数量,DB作⽤更明显。
kernel.sem = 25032000100128  #信号量,分别为,每个信号集中的最⼤信号量数⽬、表⽰系统范围内的最⼤信号量总数⽬、表⽰每个信号发⽣时的最⼤系统操作数⽬、表⽰系统范围内的最⼤信号集总数⽬。fs.file-max = 999999              #系统级能打开的⽂件句柄数量,是系统级限制
net.ipv4.ip_local_port_range = 100065534 #可分配的端⼝范围,⼀般不是性能瓶颈。
#接收缓存
p_rmem = 26214426214416777216 #接收区最⼩字节数/正常负载默认值/最⼤字节数
#发送区缓存
p_wmem = 26214426214416777216 #发送区最⼩字节数/正常负载默认值/最⼤字节数
p_keepalive_time = 30 #keepalive探测消息的间隔(s),⽤于确认TCP连接是否有效
p_synack_retries = 2 #控制内核向某个输⼊的SYN/ACK段重新发送相应的次数,默认5
p_syn_retries = 2 #设置放弃连接请求前,需要进⾏多少次重试,默认5
p_max_tw_buckets = 30000 #同时处理的TIME_WAIT数⽬,⼀般防⽌DoS
p_tw_recycle = 0 #禁⽌TW快速回收,NAT下禁⽤
p_timestamps = 1 #默认1,防⽌伪造seq从⽽防⽌DoS
p_tw_reuse = 1 #默认0,重新应⽤TW⽤于新的TCP连接
p_max_syn_backlog = 262144 #服务端参数,未经客户端确认的连接请求的队列⼤⼩,即SYN_RECV状态队列的⼤⼩,启⽤syncookies此参数⽆效。最终值=min(syn_backlog,somaxconn)。
p_max_orphans = 262144 #不⾪属于任何⽂件句柄的最⼤Socket数量,主要防⽌DoS。
2.某云⼚商ECS实⾏的参数优化配置
[root@xxx ~]# cat /f
vm.swappiness = 20
kernel.sysrq = 1
p_rmem = 8192873808388608
p_wmem = 8192655368388608
net.ipv4.udp_rmem_min = 16384
net.ipv4.udp_wmem_min = 16384
p_mem = 83886081258291216777216
net.ipv4.udp_mem = 83886081258291216777216
p_max_syn_backlog = 4096
net.ipv4.ip_local_port_range = 1024065000
kernel.sem = 2502560001001024
p_syncookies = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
f.all.accept_redirects = 0
##pvdriver<begin> do not change this comment
f.all.arp_notify = 1
f.default.arp_notify = 1
f.eth0.arp_notify = 1
f.lo.arp_notify = 1
###pvdriver<end>
p_max_tw_buckets =10000
p_tw_recycle = 0
p_tw_reuse = 0
/f 内核参数优化详解
>>>>
PAM插⼊式认证模块参数配置
其参数保存的主要位置为/etc/f,针对⽤户参数配置。
Linux PAM(插⼊式认证模块,Pluggable Authentication Modules)中pam_limits.so 的配置⽂件,突破系统的默认限制,对系统访问资源有⼀定保护作⽤。其⼯作原理为当⽤户访问服务器,服务程序将请求发送到PAM模块,PAM模块根据服务名称在/etc/pam.d⽬录下选择⼀个对应的服务⽂件,然后根
据服务⽂件的内容选择具体的PAM模块进⾏处理.注意:要使f⽂件配置⽣效,必须要确保pam_limits.so⽂件被加⼊到启动⽂件中。查看程序配置⽂件中有"session required /lib/security/pam_limits.so"
例如:限制admin⽤户登录到sshd的服务不能超过2个
在/etc/pam.d/sshd中添加:session required pam_limits.so
在/etc/f中添加:admin - maxlogins 2
注意:查看应⽤程序能否被PAM⽀持,⽤ldd查看链接关系。
$ ldd /usr/sbin/sshd
linux-vdso.so.1 => (0x00007fffcb5fe000)
libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007fa5412ce000)
libaudit.so.1 => /lib/x86_64-linux-gnu/libaudit.so.1 (0x00007fa5410aa000)
libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007fa540e9b000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fa540c78000)
libck-connector.so.0 => /usr/lib/x86_64-linux-gnu/libck-connector.so.0 (0x00007fa540a74000)
libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x00007fa54082e000)
libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fa540452000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fa54024f000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fa540035000)
libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007fa53fdfc000)
libgssapi_krb5.so.2 => /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007fa53fbb5000)
libkrb5.so.3 => /usr/lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007fa53f8e9000)
libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007fa53f6e5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa53f320000)
libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007fa53f105000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa53ef01000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fa53ecc3000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa5417b0000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa53eaa4000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fa53e89c000)
libk5crypto.so.3 => /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007fa53e66d000)
libkrb5support.so.0 => /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007fa53e461000)
libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007fa53e25d000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007fa53e042000)
PAM插⼊式认证模块配置格式
username|@groupname type resource limit
username|@groupname
设置需要被限制的⽤户名,组名前⾯加@和⽤户名区别。也可⽤通配符*来做所有⽤户的限制
type
类型有soft,hard 和 -,其中soft 指的是当前系统⽣效的设置值。hard表明系统中所能设定的最⼤值。soft的限制不能⽐har限制⾼。⽤ - 就表明同时设置了soft和hard的值。可以超出软规则的限制(警告),但不能超过硬规则的限制。
resource
表⽰要限制的资源
limit
表⽰资源数量
PAM插⼊式认证模块配置资源
1)core - 限制内核⽂件的⼤⼩,何谓core⽂件,当⼀个程序崩溃时,在进程当前⼯作⽬录的core⽂件中复制了该进程的存储图像。core⽂件仅仅是⼀个内存映象(同时加上调试信息),主要是⽤来调试的。core⽂件是个⼆进制⽂件,需要⽤相应的⼯具来分析程序崩溃时的内存映像,系统默认core⽂件的⼤⼩为0,所以没有被创建。可以⽤ulimit命令查看和修改core⽂件的⼤⼩。
2)date - 最⼤数据⼤⼩
3)fsize - 最⼤⽂件⼤⼩
4)memlock - 最⼤锁定内存地址空间
5)nofile - 打开⽂件的最⼤数⽬,对于需要做许多套接字连接并使它们处于打开状态的应⽤程序⽽⾔,最好通过使⽤ulimit -n,或者通过设置nofile参数,为⽤户把⽂件描述符的数量设置得⽐默认值⾼⼀些
6)rss - 最⼤持久设置⼤⼩
7)stack - 最⼤栈⼤⼩
8)cpu - 以分钟为单位的最多 CPU 时间
9)noproc - 进程的最⼤数⽬
10)as - 地址空间限制
11)maxlogins - 此⽤户允许登录的最⼤数⽬
PAM插⼊式认证模块配置⽅式
1)暂时⽣效
适⽤于通过ulimit命令登录shell会话期间,Ulimit命令参数
-a 显⽰所有限制
-c core⽂件⼤⼩的上限
-d 进程数据段⼤⼩的上限
-f shell所能创建的⽂件⼤⼩的上限
-m 驻留内存⼤⼩的上限
-s 堆栈⼤⼩的上限
-
t 每秒可占⽤的CPU时间上限
-p 管道⼤⼩
-n 打开⽂件数的上限大文件发送
-u 进程数的上限
-v 虚拟内存的上限
2)永久⽣效
通过将⼀个相应的ulimit语句添加到由登录shell读取的⽂件之⼀(例如 ~/.profile),即特定于shell的⽤户资源⽂件;或者通过编辑/etc/f
PAM插⼊式认证模块常⽤配置
1)建议设置成⽆限制(unlimited)
数据段长度:ulimit –d unlimited
最⼤内存⼤⼩:ulimit –m unlimited
堆栈⼤⼩:ulimit –s unlimited
CPU 时间:ulimit –t unlimited
虚拟内存:ulimit –v unlimited
2)套接字应⽤程序
对于需要做许多套接字连接并使它们处于打开状态的应⽤程序⽽⾔,最好通过使⽤ ulimit –n,或者通过设置/etc/f中的nofile 参数,为⽤户把⽂件描述符的数量设置得⽐默认值⾼⼀些。
3)应⽤程序开发调试
# ulimit -c 1000
-c 指定修改core⽂件的⼤⼩,1000指定了core⽂件⼤⼩。也可以对core⽂件的⼤⼩不做限制,如: ulimit -c unlimited
注意:如果想让修改永久⽣效,则需要修改配置⽂件,如 .bash_profile、/etc/profile或/etc/f
4)提⾼ Oracle ⽤户的 shell 限制
⾸先,修改/etc/f
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
其次,修改程序配置要求/etc/pam.d/login
session required /lib/security/pam_limits.so
最后,运⾏环境进⾏动态设置/etc/profile
if [ $USER = "oracle" ]; then if [ $SHELL = "/bin/ksh" ]; then ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi