首页 > 代码库 > 【转】转 Linux调优方案,sysctl.conf的设置

【转】转 Linux调优方案,sysctl.conf的设置

 
http://blog.sina.com.cn/s/blog_541086000100skq0.html proc/sys/net/ipv4/下各项的意义
http://blog.chinaunix.net/space.php?uid=20423817&do=blog&id=1682374 网站加速:服务器篇 一些实用tips的整理

http://bbs.chinaunix.net/thread-2318039-1-1.html
问题表现就是epoll这个服务端对10000的并发请求处理特别慢,甚至还出现很多客户连接超时的情况!但是顺序的一个个请求却没有问题。

测试如下:
首先是1个进程,顺序10000个请求。服务端没问题,很快速完成。

然后是10000个进程,每个进程1个请求,开始都还正常,可是过一会服务端accept就阻塞了,大概有1-2s,之后又返回,有时候还会出现客户端连接超时的问题,但是这样测30章那个线程池(300个线程)的服务端代码,不管怎么测都不会有问题。

按理说accept应该能一直返回才对呀,为什么中途会阻塞呢?是内核参数问题?
之前也试过把listenfd也添加到epoll里,listenfd不是ET模式。也有这样的问题。

分析了很多可能:
?        epoll本身处理效率的问题(这个自己都不信)
?        服务端完成客户的处理请求太耗时,导致没有时间让accept返回其他客户连接(这是个最简单的处理,应该也不会)
?        单台机器测试,所以产生了太多的TIME_WAIT导致客户无法连接导致超时(之前以为是这个原因)
?        内核的一些限制问题,服务端不能同时处理太多连接(可能的原因)

最终才发现真正原因!!!
原来上面这个服务器代码listen指定的backlog连接完成队列参数太小,只有32,导致高并发的时候,服务器的连接完成队列在极短的时间内被填满 了,而accept的处理速度跟不上队列填满的速度,导致队列始终是满的,然后就不理会客户的其他连接请求,导致了客户connect超时,并且处理效率 低下。
而线程池的backlog有1024,不过受限于内核参数的默认值最大128,所以线程池这个的backlog实际是128(见man listen),再加上300个线程,每个线程独自accpet,所以能很快从完成队列中取得连接,客户的connect也不会超时了,如果把线程数改为 1个,客户连接也会超时。

详细信息可以man listen  同时man tcp 里面有很多限制对服务器来说需要改的。

一般设置:
1 #sudo vi /etc/sysctl.conf 
#在最后面编辑添加以下内容: 

#缺省socket写buffer,可参考的优化值:873200/1746400/3492800
net.core.wmem_default = 1746400

#最大socket写buffer,可参考的优化值:1746400/3492800/6985600
net.core.wmem_max = 3492800

#缺省socket读buffer,可参考的优化值:873200/1746400/3492800
net.core.rmem_default = 1746400

#最大socket读buffer,可参考的优化值:1746400/3492800/6985600
net.core.rmem_max = 3492800

#进入包的最大设备队列.默认是1000,对重负载服务器而言,该值太低,可调整到16384/32768/65535
net.core.netdev_max_backlog = 32768

#listen()的默认参数,挂起请求的最大数量.默认是128.对繁忙的服务器,增加该值有助于网络性能.可调整到8192/16384/32768
net.core.somaxconn = 16384

#每个socket buffer的最大补助缓存大小,默认10K(10240),也可调整到20k(20480),但建议保留
net.core.optmem_max = 10240

#表示用于向外连接的端口范围.缺省情况下过窄:32768到61000,改为1024到65535
net.ipv4.ip_local_port_range = 1024 65535

#TCP写buffer,可参考的优化值:873200/1746400/3492800/6985600
net.ipv4.tcp_wmem = 873200 1746400 3492800

#TCP读buffer,可参考的优化值:873200/1746400/3492800/6985600
net.ipv4.tcp_rmem = 873200 1746400 3492800

#net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力.
#net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段.
#net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket.
#上述内存单位是页,而不是字节.可参考的优化值是:78643200/104857600/157286400
net.ipv4.tcp_mem = 78643200 104857600 157286400

#进入SYN包的最大请求队列.默认1024.对重负载服务器,增加该值显然有好处.可调整到16384/32768/65535
net.ipv4.tcp_max_syn_backlog = 32768

#TCP失败重传次数,默认值15,意味着重传15次才彻底放弃.可减少到5,以尽早释放内核资源
net.ipv4.tcp_retries2 = 5

#以下3个参数与TCP KeepAlive有关.默认值是:
#tcp_keepalive_time = 7200 seconds (2 hours)
#tcp_keepalive_probes = 9
#tcp_keepalive_intvl = 75 seconds
#意思是如果某个TCP连接在idle 2个小时后,内核才发起probe.如果probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效
#对服务器而言,显然上述值太大.可调整到:
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 30

#表示开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
net.ipv4.tcp_syncookies = 1

#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
net.ipv4.tcp_fin_timeout = 30

#表示开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
#net.ipv4.tcp_tw_reuse = 1

#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
#net.ipv4.tcp_tw_recycle = 1

#表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息
#默认为180000,建议使用默认值,不建议调小
#net.ipv4.tcp_max_tw_buckets = 180000

#其它的一些设置
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2

保存退出:
2 #sudo /sbin/sysctl -p

***************************************************************************************

http://www.linuxidc.com/Linux/2007-08/6995.htm

Linux进行性能优化。
1)   Linux Proc文件系统,通过对Proc文件系统进行调整,达到性能优化的目的。
2)   Linux性能诊断工具,介绍如何使用Linux自带的诊断工具进行性能诊断。

1)     /proc/sys/kernel/ctrl-alt-del


2)     proc/sys/kernel/msgmax
该文件指定了从一个进程发送到另一个进程的消息的最大长度(bytes)。进程间的消息传递是在内核的内存中进行的,不会交换到磁盘上,所以如果增加该值,则将增加操作系统所使用的内存数量。
缺省设置:8192

3)     /proc/sys/kernel/msgmnb
该文件指定一个消息队列的最大长度(bytes)。
缺省设置:16384

4)     /proc/sys/kernel/msgmni
该文件指定消息队列标识的最大数目,即系统范围内最大多少个消息队列。
缺省设置:16

5)     /proc/sys/kernel/panic
该文件表示如果发生“内核严重错误(kernel panic)”,则内核在重新引导之前等待的时间(以秒为单位)。
零(0)秒,表示在发生内核严重错误时将禁止自动重新引导。
缺省设置:0

6)     proc/sys/kernel/shmall
该文件表示在任何给定时刻,系统上可以使用的共享内存的总量(bytes)。
缺省设置:2097152

7)     /proc/sys/kernel/shmmax
该文件表示内核所允许的最大共享内存段的大小(bytes)。
缺省设置:33554432
建议设置:物理内存 * 50%
实际可用最大共享内存段大小=shmmax * 98%,其中大约2%用于共享内存结构。
可以通过设置shmmax,然后执行ipcs -l来验证。

8)     /proc/sys/kernel/shmmni
该文件表示用于整个系统的共享内存段的最大数目(个)。
缺省设置:4096

9)     /proc/sys/kernel/threads-max
该文件表示内核所能使用的线程的最大数目。
缺省设置:2048
 

三、/proc/sys/vm/优化
1)     /proc/sys/vm/block_dump
该文件表示是否打开Block Debug模式,用于记录所有的读写及Dirty Block写回动作。
缺省设置:0,禁用Block Debug模式

2)     /proc/sys/vm/dirty_background_ratio
该文件表示脏数据到达系统整体内存的百分比,此时触发pdflush进程把脏数据写回磁盘。
缺省设置:10

3)     /proc/sys/vm/dirty_expire_centisecs
该文件表示如果脏数据在内存中驻留时间超过该值,pdflush进程在下一次将把这些数据写回磁盘。
缺省设置:3000(1/100秒)
 
4)     /proc/sys/vm/dirty_ratio
该文件表示如果进程产生的脏数据到达系统整体内存的百分比,此时进程自行把脏数据写回磁盘。
缺省设置:40

5)     /proc/sys/vm/dirty_writeback_centisecs
该文件表示pdflush进程周期性间隔多久把脏数据写回磁盘。
缺省设置:500(1/100秒)
 
6)     /proc/sys/vm/vfs_cache_pressure
该文件表示内核回收用于directory和inode cache内存的倾向;缺省值100表示内核将根据pagecache和swapcache,把directory和inode cache保持在一个合理的百分比;降低该值低于100,将导致内核倾向于保留directory和inode cache;增加该值超过100,将导致内核倾向于回收directory和inode cache。
缺省设置:100

7)     /proc/sys/vm/min_free_kbytes
该文件表示强制Linux VM最低保留多少空闲内存(Kbytes)。
缺省设置:724(512M物理内存)

8)     /proc/sys/vm/nr_pdflush_threads
该文件表示当前正在运行的pdflush进程数量,在I/O负载高的情况下,内核会自动增加更多的pdflush进程。
缺省设置:2(只读)

9)     /proc/sys/vm/overcommit_memory
该文件指定了内核针对内存分配的策略,其值可以是0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存(参照overcommit_ratio)。
缺省设置:0

四、/proc/sys/fs/优化
1)     /proc/sys/fs/file-max
该文件指定了可以分配的文件句柄的最大数目。如果用户得到的错误消息声明由于打开文件数已经达到了最大值,从而他们不能打开更多文件,则可能需要增加该值。
缺省设置:4096
建议设置:65536

2)     /proc/sys/fs/file-nr
该文件与 file-max 相关,它有三个值:
已分配文件句柄的数目
已使用文件句柄的数目
文件句柄的最大数目
该文件是只读的,仅用于显示信息。

3)     待续。。。
 
 

六、/proc/sys/net/ipv4/优化
1)     /proc/sys/net/ipv4/ip_forward
该文件表示是否打开IP转发。
0,禁止
1,转发
缺省设置:0

2)     /proc/sys/net/ipv4/ip_default_ttl
该文件表示一个数据报的生存周期(Time To Live),即最多经过多少路由器。
缺省设置:64
增加该值会降低系统性能。
 
3)     /proc/sys/net/ipv4/ip_no_pmtu_disc
该文件表示在全局范围内关闭路径MTU探测功能。
缺省设置:0

4)     /proc/sys/net/ipv4/route/min_pmtu
该文件表示最小路径MTU的大小。
缺省设置:552

5)     /proc/sys/net/ipv4/route/mtu_expires
该文件表示PMTU信息缓存多长时间(秒)。
缺省设置:600(秒)

6)     /proc/sys/net/ipv4/route/min_adv_mss
该文件表示最小的MSS(Maximum Segment Size)大小,取决于第一跳的路由器MTU。
缺省设置:256(bytes)

6.1 IP Fragmentation
1)     /proc/sys/net/ipv4/ipfrag_low_thresh/proc/sys/net/ipv4/ipfrag_low_thresh
两个文件分别表示用于重组IP分段的内存分配最低值和最高值,一旦达到最高内存分配值,其它分段将被丢弃,直到达到最低内存分配值。
缺省设置:196608(ipfrag_low_thresh)
     262144(ipfrag_high_thresh)

2)     /proc/sys/net/ipv4/ipfrag_time
该文件表示一个IP分段在内存中保留多少秒。
缺省设置:30(秒)

6.2 INET Peer Storage
1)     /proc/sys/net/ipv4/inet_peer_threshold
INET对端存储器某个合适值,当超过该阀值条目将被丢弃。该阀值同样决定生存时间以及废物收集通过的时间间隔。条目越多,存活期越低,GC 间隔越短。
缺省设置:65664

2)     /proc/sys/net/ipv4/inet_peer_minttl
条目的最低存活期。在重组端必须要有足够的碎片(fragment)存活期。这个最低存活期必须保证缓冲池容积是否少于 inet_peer_threshold。该值以 jiffies为单位测量。
缺省设置:120

3)     /proc/sys/net/ipv4/inet_peer_maxttl
条目的最大存活期。在此期限到达之后,如果缓冲池没有耗尽压力的话(例如:缓冲池中的条目数目非常少),不使用的条目将会超时。该值以 jiffies为单位测量。
缺省设置:600

4)     /proc/sys/net/ipv4/inet_peer_gc_mintime
废物收集(GC)通过的最短间隔。这个间隔会影响到缓冲池中内存的高压力。 该值以 jiffies为单位测量。
缺省设置:10

5)     /proc/sys/net/ipv4/inet_peer_gc_maxtime
废物收集(GC)通过的最大间隔,这个间隔会影响到缓冲池中内存的低压力。 该值以 jiffies为单位测量。
缺省设置:120

6.3 TCP Variables
1)     /proc/sys/net/ipv4/tcp_syn_retries
该文件表示本机向外发起TCP SYN连接超时重传的次数,不应该高于255;该值仅仅针对外出的连接,对于进来的连接由tcp_retries1控制。
缺省设置:5

2)     /proc/sys/net/ipv4/tcp_keepalive_probes
该文件表示丢弃TCP连接前,进行最大TCP保持连接侦测的次数。保持连接仅在SO_KEEPALIVE套接字选项被打开时才被发送。
缺省设置:9(次)

3)     /proc/sys/net/ipv4/tcp_keepalive_time
该文件表示从不再传送数据到向连接上发送保持连接信号之间所需的秒数。
缺省设置:7200(2小时)

4)     /proc/sys/net/ipv4/tcp_keepalive_intvl
该文件表示发送TCP探测的频率,乘以tcp_keepalive_probes表示断开没有相应的TCP连接的时间。
缺省设置:75(秒)

5)     /proc/sys/net/ipv4/tcp_retries1
该文件表示放弃回应一个TCP连接请求前进行重传的次数。
缺省设置:3

6)     /proc/sys/net/ipv4/tcp_retries2
该文件表示放弃在已经建立通讯状态下的一个TCP数据包前进行重传的次数。
缺省设置:15

7)     /proc/sys/net/ipv4/tcp_orphan_retries
在近端丢弃TCP连接之前,要进行多少次重试。默认值是 7 个,相当于 50秒–16分钟,视 RTO 而定。如果您的系统是负载很大的web服务器,那么也许需
要降低该值,这类 sockets 可能会耗费大量的资源。另外参考tcp_max_orphans。

8)     /proc/sys/net/ipv4/tcp_fin_timeout
对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能
会断开连接或一直不结束连接或不可预料的进程死亡。默认值为 60 秒。过去在2.2版本的内核中是 180 秒。您可以设置该值,但需要注意,如果您的机器为负载很重的web服务器,您可能要冒内存被大量无效数据报填满的风险,FIN-WAIT-2 sockets 的危险性低于 FIN-WAIT-1,因为它们最多只吃 1.5K的内存,但是它们存在时间更长。另外参考 tcp_max_orphans。
缺省设置:60(秒)

9)     /proc/sys/net/ipv4/tcp_max_tw_buckets系统在同时所处理的最大timewait sockets 数目。如果超过此数的话,time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制,纯粹为了抵御那些简单的 DoS 攻击,千万不要人为的降低这个限制,不过,如果网络条件需要比默认值更多,则可以提高它(或许还要增加内存)。
缺省设置:180000
 
 

29) /proc/sys/net/ipv4/tcp_adv_win_scale
该文件表示计算缓冲开销bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale >; 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale <= 0)。
缺省设置:2

6.4 IP Variables
1)     /proc/sys/net/ipv4/ip_local_port_range
该文件表示TCP/UDP协议打开的本地端口号。
缺省设置:1024 4999
建议设置:32768 61000

2)     /proc/sys/net/ipv4/ip_nonlocal_bind
该文件表示是否允许进程邦定到非本地地址。
缺省设置:0

3)     /proc/sys/net/ipv4/ip_dynaddr
该参数通常用于使用拨号连接的情况,可以使系统动能够立即改变ip包的源地址为该ip地址,同时中断原有的tcp对话而用新地址重新发出一个syn请求 包,开始新的tcp对话。在使用ip欺骗时,该参数可以立即改变伪装地址为新的ip地址。该文件表示是否允许动态地址,如果该值非0,表示允许;如果该值 大于1,内核将通过log记录动态地址重写信息。
缺省设置:0

4)     /proc/sys/net/ipv4/icmp_echo_ignore_all/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
该文件表示内核是否忽略所有的ICMP ECHO请求,或忽略广播和多播请求。
0, 响应请求
1, 忽略请求
缺省设置:0
建议设置:1

5)     /proc/sys/net/ipv4/icmp_ratelimit

6)     /proc/sys/net/ipv4/icmp_ratemask

7)     /proc/sys/net/ipv4/icmp_ignore_bogus_error_reponses
某些路由器违背RFC1122标准,其对广播帧发送伪造的响应来应答。这种违背行为通常会被以告警的方式记录在系统日志中。如果该选项设置为True,内核不会记录这种警告信息。
缺省设置:0

8)     /proc/sys/net/ipv4/igmp_max_memberships
该文件表示多播组中的最大成员数量。
缺省设置:20
 
6.5 Other Configuration
1)     /proc/sys/net/ipv4/conf/*/accept_redirects
如果主机所在的网段中有两个路由器,你将其中一个设置成了缺省网关,但是该网关在收到你的ip包时发现该ip包必须经过另外一个路由器,这时这个路由器就 会给你发一个所谓的“重定向”icmp包,告诉将ip包转发到另外一个路由器。参数值为布尔值,1表示接收这类重定向icmp 信息,0表示忽略。

2)     /proc/sys/net/ipv4/*/accept_source_route
是否接受含有源路由信息的ip包。参数值为布尔值,1表示接受,0表示不接受。在充当网关的linux主机上缺省值为1,在一般的linux主机上缺省值为0。从安全性角度出发,建议关闭该功能。
 
3)     /proc/sys/net/ipv4/*/secure_redirects
其实所谓的“安全重定向”就是只接受来自网关的“重定向”icmp包。该参数就是用来设置“安全重定向”功能的。

4)     /proc/sys/net/ipv4/*/proxy_arp
设置是否对网络上的arp包进行中继。参数值为布尔值,1表示中继,0表示忽略,
缺省值为0。该参数通常只对充当路由器的linux主机有用。
 
七、性能优化策略
7.1 基本优化
1)      关闭后台守护进程
系统安装完后,系统会默认启动一些后台守护进程,有些进程并不是必需的;因此,关闭这些进程可以节省一部分物理内存消耗。以root身份登录系统,运行ntsysv,选中如下进程:
iptables
network
syslog
random
apmd

2)      减少终端连接数
系统默认启动6个终端,而实际上只需启动3个即可;以root身份登录系统,运行vi /etc/inittab,修改成如下:
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6
如上所述,注释掉4、5、6终端。
 
3)      待续。。。
 
7.2 网络优化
1)      优化系统套接字缓冲区
net.core.rmem_max=16777216
net.core.wmem_max=16777216

2)      优化TCP接收/发送缓冲区
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216

3)      优化网络设备接收队列
net.core.netdev_max_backlog=3000

4)      关闭路由相关功能
net.ipv4.conf.lo.accept_source_route=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.eth0.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0
 
net.ipv4.conf.lo.accept_redirects=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.eth0.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
 
net.ipv4.conf.lo.secure_redirects=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.eth0.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0
 
net.ipv4.conf.lo.send_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.eth0.send_redirects=0
net.ipv4.conf.default.send_redirects=0

5)      优化TCP协议栈
打开TCP SYN cookie选项,有助于保护服务器免受SyncFlood攻击。
net.ipv4.tcp_syncookies=1
 
打开TIME-WAIT套接字重用功能,对于存在大量连接的Web服务器非常有效。
net.ipv4.tcp_tw_recyle=1
net.ipv4.tcp_tw_reuse=1
 
减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接。
net.ipv4.tcp_fin_timeout=30
 
减少TCP KeepAlive连接侦测的时间,使系统可以处理更多的连接。
net.ipv4.tcp_keepalive_time=1800
 
增加TCP SYN队列长度,使系统可以处理更多的并发连接。
net.ipv4.tcp_max_syn_backlog=8192

【转】转 Linux调优方案,sysctl.conf的设置