LINUX调优方法总结.docx
《LINUX调优方法总结.docx》由会员分享,可在线阅读,更多相关《LINUX调优方法总结.docx(17页珍藏版)》请在冰豆网上搜索。
LINUX调优方法总结
LINUX调优方法总结.
作者:
李靖
-------------------------------------------------------------------------------
大多数Linux发布版都定义了适当的缓冲区和其他TransmissionControlProtocol(TCP)参数。
可以修改这些参数来分配更多的内存,从而改进网络性能。
设置内核参数的方法是通过proc接口,也就是通过读写/proc中的值。
幸运的是,sysctl可以读取/etc/sysctl.conf中的值并根据需要填充/proc,这样就能够更轻松地管理这些参数。
清单2展示在互联网服务器上应用于Internet服务器的一些比较激进的网络设置。
#UseTCPsyncookieswhenneeded
net.ipv4.tcp_syncookies=1
#EnableTCPwindowscaling
net.ipv4.tcp_window_scaling:
=1
#IncreaseTCPmaxbuffersize
net.core.rmem_max=16777216
net.core.wmem_max=16777216
#IncreaseLinuxautotuningTCPbufferlimits
net.ipv4.tcp_rmem=40968738016777216
net.ipv4.tcp_wmem=40966553616777216
#Increasenumberofportsavailable
net.ipv4.ip_local_port_range=102465000
将这些设置添加到/etc/sysctl.conf的现有内容中。
第一个设置启用TCPSYNcookie。
当从客户机发来新的TCP连接时,数据包设置了SYN位,服务器就为这个半开的连接创建一个条目,并用一个SYN-ACK数据包进行响应。
在正常操作中,远程客户机用一个ACK数据包进行响应,这会使半开的连接转换为全开的。
有一种称为SYN泛滥(SYNflood)的网络攻击,它使ACK数据包无法返回,导致服务器用光内存空间,无法处理到来的连接。
SYNcookie特性可以识别出这种情况,并使用一种优雅的方法保留队列中的空间(细节参见参考资料一节)。
大多数系统都默认启用这个特性,但是确保配置这个特性更可靠。
启用TCP窗口伸缩使客户机能够以更高的速度下载数据。
TCP允许在未从远程端收到确认的情况下发送多个数据包,默认设置是最多64KB,在与延迟比较大的远程客户机进行通信时这个设置可能不够。
窗口伸缩会在头中启用更多的位,从而增加窗口大小。
后面四个配置项增加TCP发送和接收缓冲区。
这使应用程序可以更快地丢掉它的数据,从而为另一个请求服务。
还可以强化远程客户机在服务器繁忙时发送数据的能力。
最后一个配置项增加可用的本地端口数量,这样就增加了可以同时服务的最大连接数量。
在下一次引导系统时,或者下一次运行sysctl-p/etc/sysctl.conf时,这些设置就会生效。
----------------------------------------------------------------------------------------------------------------------------
磁盘子系统的调优
磁盘在LAMP架构中扮演着重要的角色。
静态文件、模板和代码都来自磁盘,组成数据库的数据表和索引也来自磁盘。
对磁盘的许多调优(尤其是对于数据库)集中于避免磁盘访问,因为磁盘访问的延迟相当高。
因此,花一些时间对磁盘硬件进行优化是有意义的。
首先要做的是,确保在文件系统上禁用atime日志记录特性。
atime是最近访问文件的时间,每当访问文件时,底层文件系统必须记录这个时间戳。
因为系统管理员很少使用atime,禁用它可以减少磁盘访问时间。
禁用这个特性的方法是,在/etc/fstab的第四列中添加noatime选项。
演示如何启用noatime的fstab示例
/dev/VolGroup00/LogVol00/ ext3 defaults,noatime 11
LABEL=/boot /boot ext3 defaults,noatime 12
devpts /dev/pts devpts gid=5,mode=620 00
tmpfs /dev/shm tmpfs defaults 00
proc /proc proc defaults 00
sysfs /sys sysfs defaults 00
LABEL=SWAP-hdb2 swap swap defaults 00
LABEL=SWAP-hda3 swap swap defaults 00
有多种磁盘硬件组合,而且Linux不一定能够探测出访问磁盘的最佳方式。
可以使用hdparm命令查明和设置用来访问IDE磁盘的方法。
hdparm-t/path/to/device执行速度测试,可以将这个测试结果作为性能基准。
为了使结果尽可能准确,在运行这个命令时系统应该是空闲的。
在/dev/hd上执行的速度测试
#hdparm-t/dev/hda
/dev/hda:
Timingbuffereddiskreads:
182MBin 3.02seconds= 60.31MB/sec
hdparm的常用选项
选项描述
-vi向磁盘查询它支持的设置以及它正在使用的设置。
-c查询/启用(E)IDE32位I/O支持。
hdparm-c1/dev/hda启用这个设置。
-m查询/设置每中断多扇区模式。
如果设置大于零,设置值就是每个中断可以传输的最大扇区数量。
-d1-X启用直接内存访问(DMA)传输并设置IDE传输模式。
hdparm手册页详细说明了在-X后面可以设置的数字。
只有在-vi说明目前并未使用最快速的模式的情况下,才需要进行这个设置。
不幸的是,对于FiberChannelandSmallComputerSystemsInterface(SCSI)系统,调优依赖于具体的驱动器。
必须将有帮助的设置添加到启动脚本中,比如rc.local。
----------------------------------------------------------------------------------------------------------------------------
TCP/IP子系统的调优
所有的TCP/IP调优参数都位于/proc/sys/net/目录.例如,下面是最重要的一些调优参数,后面是它们的含义:
1./proc/sys/net/core/rmem_max—最大的TCP数据接收缓冲
2./proc/sys/net/core/wmem_max—最大的TCP数据发送缓冲
3./proc/sys/net/ipv4/tcp_timestamps—时间戳在(请参考RFC1323)TCP的包头增加12个字节
4./proc/sys/net/ipv4/tcp_sack—有选择的应答
5./proc/sys/net/ipv4/tcp_window_scaling—支持更大的TCP窗口.如果TCP窗口最大超过65535(64K),必须设置该数值为1
6.rmem_default—默认的接收窗口大小
7.rmem_max—接收窗口的最大大小
8.wmem_default—默认的发送窗口大小
9.wmem_max—发送窗口的最大大小
/proc目录下的所有内容都是临时性的,所以重启动系统后任何修改都会丢失.
建议在系统启动时自动修改TCP/IP参数:
把下面代码增加到/etc/rc.local文件,然后保存文件,系统重新引导的时候会自动修改下面的TCP/IP参数:
echo256960>/proc/sys/net/core/rmem_default
echo256960>/proc/sys/net/core/rmem_max
echo256960>/proc/sys/net/core/wmem_default
echo256960>/proc/sys/net/core/wmem_max
echo0>/proc/sys/net/ipv4/tcp_timestamps
echo1>/proc/sys/net/ipv4/tcp_sack
echo1>/proc/sys/net/ipv4/tcp_window_scaling
TCP/IP参数都是自解释的,TCP窗口大小设置为256960,禁止TCP的时间戳(取消在每个数据包的头中增加12字节),支持更大的TCP窗口和TCP有选择的应答.
上面数值的设定是根据互连网连接和最大带宽/延迟率来决定.
注:
上面实例中的数值可以实际应用,但它只包含了一部分参数.
另外一个方法:
使用/etc/sysctl.conf在系统启动时将参数配置成您所设置的值:
net.core.rmem_default=256960
net.core.rmem_max=256960
net.core.wmem_default=256960
net.core.wmem_max=256960
net.ipv4.tcp_timestamps=0
net.ipv4.tcp_sack=1
net.ipv4.tcp_window_scaling=1
----------------------------------------------------------------------------------------------------------------------------
文件子系统的调优
ulimit-a用来显示当前的各种用户进程限制。
Linux对于每个用户,系统限制其最大进程数。
为提高性能,可以根据设备资源情况,
设置各linux用户的最大进程数,下面我把某linux用户的最大进程数设为10000个:
ulimit-u10000
对于需要做许多socket连接并使它们处于打开状态的Java应用程序而言,
最好通过使用ulimit-nxx修改每个进程可打开的文件数,缺省值是1024。
ulimit-n4096将每个进程可以打开的文件数目加大到4096,缺省为1024
其他建议设置成无限制(unlimited)的一些重要设置是:
数据段长度:
ulimit-dunlimited
最大内存大小:
ulimit-munlimited
堆栈大小:
ulimit-sunlimited
CPU时间:
ulimit-tunlimited
虚拟内存:
ulimit-vunlimited
暂时地,适用于通过ulimit命令登录shell会话期间。
永久地,通过将一个相应的ulimit语句添加到由登录shell读取的文件中,即特定于shell的用户资源文件,如:
1)、解除Linux系统的最大进程数和最大文件打开数限制:
vi/etc/security/limits.conf
#添加如下的行
*softnoproc11000
*hardnoproc11000
*softnofile4100
*hardnofile4100
说明:
*代表针对所有用户
noproc是代表最大进程数
nofile是代表最大文件打开数
2)、让SSH接受Login程式的登入,方便在ssh客户端查看ulimit-a资源限制:
a、vi/etc/ssh/sshd_config
把UserLogin的值改为yes,并把#注释去掉
b、重启sshd服务:
/etc/init.d/sshdrestart
3)、修改所有linux用户的环境变量文件:
vi/etc/profile
ulimit-u10000
ulimit-n4096
ulimit-dunlimited
ulimit-munlimited
ulimit-sunlimited
ulimit-tunlimited
ulimit-vunlimited
/**************************************
有时候在程序里面需要打开多个文件,进行分析,系统一般默认数量是1024,(用ulimit-a可以看到)对于正常使用是够了,但是对于程序来讲,就太少了。
修改2个文件。
1./etc/security/limits.conf
vi/etc/security/limits.conf
加上:
*softnofile8192
*hardnofile20480
2./etc/pam.d/login
sessionrequired/lib/security/pam_limits.so
**********
另外确保/etc/pam.d/system-auth文件有下面内容
sessionrequired/lib/security/$ISA/pam_limits.so
这一行确保系统会执行这个限制。
***********
3.一般用户的.bash_profile
#ulimit-n1024
重新登陆ok
----------------------------------------------------------------------------------------------------------------------------
内存子系统的调优
内存子系统的调优不是很容易,需要不停地监测来保证内存的改变不会对服务器的其他子系统造成负面影响。
如果要改变虚拟内存参数(在/proc/sys/vm),建议您每次只改变一个参数然后监测效果。
对与虚拟内存的调整包括以下几个项目:
配置Linux内核如何更新dirtybuffers到磁盘。
磁盘缓冲区用于暂存磁盘的数据。
相对于内存来讲,磁盘缓冲区的速度很慢。
因此,如果服务器使用这类内存,性能会成问题。
当缓冲区内的数据完全dirty,使用:
sysctl-wvm.bdflush="3050000500300060200"
vm.bdflush有9个参数,但是建议您只改变其中的3个:
1nfract,为排队写入磁盘前,bdflushdaemon允许的缓冲区最大百分比
2ndirty,为bdflush即刻写的最大缓冲区的值。
如果这个值很大,bdflush需要更多的时间完成磁盘的数据更新。
7nfract_sync,发生同步前,缓冲区变dirty的最大百分比
配置kswapddaemon,指定Linux的内存页数量
sysctl-wvm.kswapd="10243264"
三个参数的描述如下:
–tries_base相当于内核每次所的“页”的数量的四倍。
对于有很多交换信息的系统,增加这个值可以改进性能。
–tries_min是每次kswapdswaps出去的pages的最小数量。
–swap_cluster是kswapd即刻写如的pages数量。
数值小,会提高磁盘I/O的性能;数值大可能也会对请求队列产生负面影响。
如果要对这些参数进行改动,请使用工具vmstat检查对性能的影响。
其它可以改进性能的虚拟内存参数为:
_buffermem
_freepages
_overcommit_memory
_page-cluster
_pagecache
_pagetable_cache
----------------------------------------------------------------------------------------------------------------------------
网络子系统的调优
操作系统安装完毕,就要对网络子系统进行调优。
对其它子系统的影响:
影响CPU利用率,尤其在有大量TCP连接、块尺寸又非常小时,内存的使用会明显增加。
如何预防性能下降
如下的sysctl命令用于改变安全设置,但是它也可以防止网络性能的下降。
这些命令被设置为缺省值。
◆关闭如下参数可以防止黑客对服务器IP地址的攻击
sysctl-wnet.ipv4.conf.eth0.accept_source_route=0
sysctl-wnet.ipv4.conf.lo.accept_source_route=0
sysctl-wnet.ipv4.conf.default.accept_source_route=0
sysctl-wnet.ipv4.conf.all.accept_source_route=0
◆开启TCPSYNcookies,保护服务器避免受syn-flood攻击,包括服务取决denial-of-service(DoS)或者分布式服务拒绝distributeddenial-of-service(DDoS)(仅适用RedHatEnterpriseLinuxAS)
sysctl-wnet.ipv4.tcp_syncookies=1
◆以下命令使服务器忽略来自被列入网关的服务器的重定向。
因重定向可以被用来进行攻击,所以我们只接受有可靠来源的重定向。
sysctl-wnet.ipv4.conf.eth0.secure_redirects=1
sysctl-wnet.ipv4.conf.lo.secure_redirects=1
sysctl-wnet.ipv4.conf.default.secure_redirects=1
sysctl-wnet.ipv4.conf.all.secure_redirects=1
另外,你可以配置接受或拒绝任何ICMP重定向。
ICMP重定向是器传输信息的机制。
比如,当网关接收到来自所接网络主机的Internet数据报时,网关可以发送重定向信息到一台主机。
网关检查路由表获得下一个网关的地址,第二个网关将数据报路由到目标网络.关闭这些重定向得命令如下:
sysctl-wnet.ipv4.conf.eth0.accept_redirects=0
sysctl-wnet.ipv4.conf.lo.accept_redirects=0
sysctl-wnet.ipv4.conf.default.accept_redirects=0
sysctl-wnet.ipv4.conf.all.accept_redirects=0
◆如果这个服务器不是一台路由器,那么它不会发送重定向,所以可以关闭该功能:
sysctl-wnet.ipv4.conf.eth0.send_redirects=0
sysctl-wnet.ipv4.conf.lo.send_redirects=0
sysctl-wnet.ipv4.conf.default.send_redirects=0
sysctl-wnet.ipv4.conf.all.send_redirects=0
◆配置服务器拒绝接受广播风暴或者smurf攻击attacks:
sysctl-wnet.ipv4.icmp_echo_ignore_broadcasts=1
◆忽略所有icmp包或者pings:
sysctl-wnet.ipv4.icmp_echo_ignore_all=1
◆有些路由器针对广播祯发送无效的回应,每个都产生警告并在内核产生日志.这些回应可以被忽略:
sysctl-wnet.ipv4.icmp_ignore_bogus_error_responses=1
针对TCP和UDP的调优
下边的命令用来对连接数量非常大的服务器进行调优.
◆对于同时支持很多连接的服务器,新的连接可以重新使用TIME-WAIT套接字.这对于Web服务器非常有效:
sysctl-wnet.ipv4.tcp_tw_reuse=1
如果你使用该命令,还要启动TIME-WAIT套接字状态的快速循环功能:
sysctl-wnet.ipv4.tcp_tw_recycle=1
图Figure10-7显示出将这些功能启用,连接数量明显降低.因为每个TCP传输都包含远程客户端的信息缓存,所以有利于提高性能.缓存中存放round-trip时间、最大segment大小、拥塞窗口的信息。
◆参数tcp_fin_timeout是套接字关闭时,保持FIN-WAIT-2状态的时间。
一个TCP连接以three-segmentSYN序列开始,以three-segmentFIN序列结束.均不保留数据.通过改变tcp_fin_timeout的值,从FIN序列到内存可以空闲出来处理新连接的时间缩短了,使性能得到改进.改变这个值的前要经过认真的监测,避免因为死套接字造成内存溢出.
sysctl-wnet.ipv4.tcp_fin_timeout=30
◆服务器的一个问题是,同一时刻的大量TCP连接里有很多的连接被打开但是没有使用.TCP的keepalive功能检测到这些连接,缺省情况下,在2小时之后丢掉.2