物理机内核调优

内核调优

ulimit 优化(系统资源限制设置)

vim /etc/security/limits.conf

注:①一般soft的值会比hard小,也可相等。

​ ②/etc/security/limits.d/里面配置会覆盖/etc/security/limits.conf的配置

​ ③只有root用户才有权限修改/etc/security/limits.conf

​ ④如果limits.conf没有做设定,则默认值是1024

该文件中添加

* soft nproc 65535
* hard nproc 65535
* soft nofile 65535 
* hard nofile 65535 
* soft memlock unlimited 
* hard memlock unlimited

网友的版本

*           soft  core   unlimit
*           hard  core   unlimit
*           soft  fsize  unlimited
*           hard  fsize  unlimited
*           soft  data   unlimited
*           hard  data   unlimited
*           soft  nproc  65535
*           hard  nproc  63535
*           soft  stack  unlimited
*           hard  stack  unlimited
*           soft  nofile  409600
*           hard  nofile  409600

nproc 最大进程数

nofile 最大文件打开数

* 表示修改所有用户的限制

设置限制数量,第一列表示用户,* 表示所有用户

soft nproc :单个用户可用的最大进程数量(超过会警告);
hard nproc:单个用户可用的最大进程数量(超过会报错);
soft nofile :可打开的文件描述符的最大数(超过会警告);
hard nofile :可打开的文件描述符的最大数(超过会报错);

ulimit -a #查看当前系统的所有限制值

ulimit -n # 查看用户同时打开的文件数

cat /proc/sys/fs/file-max 查看Linux系统级的最大打开文件数限制

“soft” 和 “hard” 的区别

soft  xxx  : 代表警告的设定,可以超过这个设定值,但是超过后会有警告。
hard  xxx  : 代表严格的设定,不允许超过这个设定的值。

如:soft 设为1024,hard设为2048 ,则当你使用数在11024之间时可以随便使用,10242048时会出现警告信息,大于2048时,就会报错。

“nproc” 和 "nofile"的区别

nproc  : 是操作系统级别对每个用户创建的进程数的限制
nofile : 是每个进程可以打开的文件数的限制

内核优化

vim /etc/sysctl.conf

在该文件中添加:

vm.swappiness = 0 fs.file-max = 655360 
vm.max_map_count = 262144 
net.ipv6.conf.all.disable_ipv6 = 1 
net.ipv4.icmp_echo_ignore_broadcasts = 1 
net.ipv4.icmp_ignore_bogus_error_responses = 1 
net.ipv4.tcp_max_orphans = 409600 
net.core.netdev_max_backlog = 40960 
net.ipv4.tcp_timestamps = 0  
net.ipv4.tcp_tw_recycle = 0  
net.ipv4.tcp_tw_reuse = 1 
net.ipv4.ip_local_port_range = 1000 65000 
net.ipv4.tcp_fin_timeout = 15  
net.ipv4.tcp_keepalive_time = 1200 
net.ipv4.tcp_keepalive_probes = 3  
net.ipv4.tcp_keepalive_intvl = 30 
net.ipv4.tcp_synack_retries = 2 
net.ipv4.tcp_retries1 = 3 
net.ipv4.tcp_retries2 = 5 
net.ipv4.tcp_syn_retries = 2 
net.ipv4.tcp_syncookies = 1 
net.core.somaxconn = 40960 
net.ipv4.tcp_max_syn_backlog = 8192 
net.ipv4.tcp_max_tw_buckets = 8192
net.netfilter.nf_conntrack_max = 655350  
net.netfilter.nf_conntrack_tcp_timeout_established = 1200 
net.core.rmem_max = 8388608  
net.core.rmem_default = 65536  
net.core.wmem_max = 8388608 
net.core.wmem_default = 65536 
net.ipv4.tcp_mem = 8388608 8388608 8388608  
net.ipv4.tcp_rmem = 4096 87380 8388608  
net.ipv4.tcp_wmem = 4096 65536 8388608
net.ipv4.ip_conntrack_max = 65536
net.ipv4.netfilter.ip_conntrack_max = 65536
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
sysctl -p   #  保存退出之后执行,使参数永久生效

解释

vm.swappiness = 0 
fs.file-max = 655360 		    
#系统打开最大文件句柄的数量。 
vm.max_map_count = 262144 		
#最大内存映射区域数。 
net.ipv6.conf.all.disable_ipv6 = 1 	
#关闭ipv6 
net.ipv4.icmp_echo_ignore_broadcasts = 1 
net.ipv4.icmp_ignore_bogus_error_responses = 1 
net.ipv4.tcp_max_orphans = 409600 	
#系统中允许存在多少tcp套接字不被关联到任何一个用户文件 句柄上,可防止Dos。 
net.core.netdev_max_backlog = 40960 	
#接口接收数据包速率大于内核处理包速率时,允许发送到队 列的数据包的最大数目。 
net.ipv4.tcp_timestamps = 0 	
#时间戳,可以避免序列号的卷绕, 0表示关闭。 
net.ipv4.tcp_tw_recycle = 0 	
#表示开启TCP连接快速回收, 0表示关闭。 
net.ipv4.tcp_tw_reuse = 1 		
#表示开启重用。 
net.ipv4.ip_local_port_range = 1000 65000 	
#tcp/udp可用的本地端口的范围。 
net.ipv4.tcp_fin_timeout = 15 	
#保持在FIN-WAIT-2状态的时间。 
net.ipv4.tcp_keepalive_time = 1200 	
#TCP发送keepalive消息的频率 .秒。 
net.ipv4.tcp_keepalive_probes = 3 	
#确定该连接已经断开的次数。 
net.ipv4.tcp_keepalive_intvl = 30 	
#内核向远程主机发送探测指针的时间间隔。 
net.ipv4.tcp_synack_retries = 2 	
#对于远端的连接请求SYN,内核会发送SYN+ACK数据包,以确认 收到上一个SYN连接请求包。 
net.ipv4.tcp_retries1 = 3 
net.ipv4.tcp_retries2 = 5 
net.ipv4.tcp_syn_retries = 2 	
#对于本机应用程序主动发起的连接超时后内核发送SYN包的重试次 数。
net.ipv4.tcp_syncookies = 1 	
#开启SYN Cookies,可防范少量SYN攻击。 
net.core.somaxconn = 40960 		
#服务端所能处理数据的最大客户端数量,即完成连接上限。 
net.ipv4.tcp_max_syn_backlog = 8192 	
#SYN同步包的最大客户端数量,即半连接上限。 
net.ipv4.tcp_max_tw_buckets = 8192 		
#当TIME_WAIT状态的连接超出参数值的部分TCP连接导致会 服务不可用。 
net.netfilter.nf_conntrack_max = 655350 	
#最大跟踪连接个数。 
net.netfilter.nf_conntrack_tcp_timeout_established = 1200 	
#连接状态保留时间。 
net.core.rmem_max = 8388608 	
#最大接收缓冲大小。 
net.core.rmem_default = 65536 	
#默认接收缓冲大小。 
net.core.wmem_max = 8388608 	
#最大发送缓冲大小。 
net.core.wmem_default = 65536 	
#默认发送缓冲大小。 
net.ipv4.tcp_mem = 8388608 8388608 8388608 	
#定义tcp协议使用的内存空间。 
net.ipv4.tcp_rmem = 4096 87380 8388608 	
#定义tcp协议用于接收缓冲的内存空间。 
net.ipv4.tcp_wmem = 4096 65536 8388608 	
#定义tcp协议用于发送缓冲的内存空间。

内核参数说明

/proc/sys下内核文件与配置文件sysctl.conf中变量存在着对应关系。
配置说明:

        内核参数	                   参数说明
net.inet.tcp.sendspace=65536		最大的待发送TCP数据缓冲区空间
net.inet.tcp.recvspace=65536		最大的接受TCP缓冲区空间
net.inet.udp.sendspace=65535		最大的接受UDP缓冲区大小
net.inet.udp.maxdgram=65535			最大的发送UDP数据缓冲区大小
net.local.stream.sendspace=65535	本地套接字连接的数据发送空间
net.inet.tcp.rfc1323=1
net.inet.tcp.rfc1644=1
net.inet.tcp.rfc3042=1
net.inet.tcp.rfc3390=1			加快网络性能的协议
kern.ipc.maxsockbuf=2097152		最大的套接字缓冲区
kern.maxfiles=65536				系统中允许的最多文件数量
kern.maxfilesperproc=32768		每个进程能够同时打开的最大文件数量
net.inet.tcp.delayed_ack=0		当一台计算机发起TCP连接请求时,系统会回应ACK应答数据包。该选项设置是否延迟ACK应答数据包,把它和包含数据的数据包一起发送,在高速网络和低负载的情况下会略微提高性能,但在网络连接较差的时候,对方计算机得不到应答会持续发起连接请求,反而会降低性能。
net.inet.icmp.drop_redirect=1
net.inet.icmp.log_redirect=1
net.inet.ip.redirect=0
net.inet6.ip6.redirect=0		屏蔽ICMP重定向功能
net.inet.icmp.bmcastecho=0
net.inet.icmp.maskrepl=0		防止ICMP广播风暴
net.inet.icmp.icmplim=100		限制系统发送ICMP速率
net.inet.icmp.icmplim_output=0
net.inet.tcp.drop_synfin=1			安全参数,编译内核时加了options TCP_DROP_SYNFIN才可以用。
net.inet.tcp.always_keepalive=1		设置为1会帮助系统清除没有正常断开的TCP连接,这增加了一些网络带宽的使用,但是一些死掉的连接最终能被识别并清除。死的TCP连接是被拨号用户存取的系统的一个特别的问题,因为用户经常断开modem而不正确的关闭活动的连接
net.inet.ip.intr_queue_maxlen=1000		若看到net.inet.ip.intr_queue_drops在增加,就要调大net.inet.ip.intr_queue_maxlen,net.inet.ip.intr_queue_drops为0时最好。
net.inet.tcp.msl=7500		防止DOS攻击,默认为30000
net.inet.tcp.blackhole=2	接收到一个已经关闭的端口发来的所有包,直接drop,如果设置为1则是只针对TCP包
net.inet.udp.blackhole=1	接收到一个已经关闭的端口发来的所有UDP包直接drop
net.inet.tcp.inflight.enable=1	为网络数据连接时提供缓冲
net.inet.ip.fastforwarding=0	如果打开的话每个目标地址一次转发成功以后它的数据都将被记录进路由表和arp数据表,节约路由的计算时间,但会需要大量的内核内存空间来保存路由表。
kern.polling.enable=1		kernel编译打开options POLLING功能,高负载情况下使用低负载不推荐SMP不能和polling一起用。
kern.ipc.somaxconn=32768			并发连接数,默认为128,推荐在1024-4096之间,数字越大占用内存也越大。
security.bsd.see_other_uids=0		禁止用户查看其他用户的进程
kern.securelevel=0		设置kernel安全级别
net.inet.tcp.log_in_vain=1	记录下任何TCP连接
net.inet.udp.log_in_vain=1	记录下任何UDP连接
net.inet.udp.checksum=1		防止不正确的udp包的攻击
net.inet.tcp.syncookies=1	防止DOS攻击
kern.ipc.shm_use_phys=1		仅为线程提供物理内存支持,需要256兆以上内存
kern.ipc.shmmax=67108864	线程可使用的最大共享内存
kern.ipc.shmall=32768		最大线程数量
kern.coredump=0			程序崩溃时不记录
net.local.stream.recvspace=65536
net.local.dgram.maxdgram=16384
net.local.dgram.recvspace=65536		lo本地数据流接收和发送空间
net.inet.tcp.mssdflt=1460		数据包数据段大小,ADSL为1452。
net.inet.tcp.inflight_enable=1		为网络数据连接时提供缓冲
net.inet.tcp.minmss=1460		数据包数据段最小值,ADSL为1452
net.inet.raw.maxdgram=65536		本地数据最大数量
net.inet.raw.recvspace=65536	本地数据流接收空间
net.inet.ip.fw.dyn_max=65535	ipfw防火墙动态规则数量,默认为4096,增大该值可以防止某些病毒发送大量TCP连接,导致不能建立正常连接
net.inet.ipf.fr_tcpidletimeout=864000	设置ipf防火墙TCP连接空闲保留时间,默认8640000(120小时)
net.ipv4.tcp_syncookies = 1		表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1		表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1		表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30	表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 1200	表示当启用keepalive时,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 1024 65000	表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192		表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000		表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为 5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。
net.ipv4.tcp_timestamps	开启tcp时间戳

常用内核参数参考值(需要根据系统配置进行调优)

# 最大socket写buffer,可参考的优化值:873200
/proc/sys/net/core/wmem_max

# 最大socket读buffer,可参考的优化值:873200
/proc/sys/net/core/rmem_max

# TCP写buffer,可参考的优化值: 8192 436600 873200
/proc/sys/net/ipv4/tcp_wmem

# TCP读buffer,可参考的优化值: 32768 436600 873200
/proc/sys/net/ipv4/tcp_rmem

/proc/sys/net/ipv4/tcp_mem
包含3个值,分别是:
net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力.
net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段.
net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket.
上述内存单位是页,而不是字节.可参考的优化值是:786432 1048576 1572864

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

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

# socket buffer的最大初始化值,默认10K.
$ /proc/sys/net/core/optmem_max

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

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

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

# 指定端口范围的一个配置,默认是32768 61000,已够大.
/proc/sys/net/ipv4/ip_local_port_range

查看内核参数

查看所有内核参数
sysctl -a

查看特定内核参数
cat /proc/sys/net/ipv4/icmp_echo_ignore_all
或
sysctl net.ipv4.tcp_syncookies

修改内核参数

使用命令进行修改(当前有效,重启后无效)
echo "1" >  /proc/sys/net/ipv4/icmp_echo_ignore_all
或
sysctl -w net.ipv4.icmp_echo_ignore_all=1 
说明:sysctl的参数名与等于文件路径去掉/proc/sys/,并且"/ “改成”."


修改配置文件(永久生效)
vim /etc/sysctl.conf
添加:net.ipv4.icmp_echo_ignore_all=1
让修改立即生效:
sysctl -p 或 sysctl --system
说明:这个命令会重新加载 /etc/sysctl.conf 的配置。
sysctl --system与sysctl -p的区别在于:
sysctl --system会重新加载以下所有配置文件的配置:

/run/sysctl.d/*.conf
/etc/sysctl.d/*.conf
/usr/local/lib/sysctl.d/*.conf
/usr/lib/sysctl.d/*.conf
/lib/sysctl.d/*.conf
/etc/sysctl.conf

参数迁移

1、保存当前主机所有配置

sysctl -a > mysys.conf
1
2、拷贝到其他主机并执行

sysctl -p -f mysys.conf
1

内核参数调优

6.1 高并发Web服务器内核参数调优
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1 (不推荐,NAT下会产生大量的timeout)
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_syn_backlog=65536
net.core.somaxconn=32768
net.core.netdev_max_backlog=65536
sysctl -w net.ipv4.ip_conntrack_max=65536
6.2 其他调优参数
#设置是否响应 icmp echo 请求广播
#net.ipv4.icmp_echo_ignore_broadcasts = 1

#设置之后,可以忽略由网络中的那些声称回应地址是广播地址的主机生成的ICMP错误。
#net.ipv4.icmp_ignore_bogus_error_responses = 1

#开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理
net.ipv4.tcp_syncookies = 1

#Default should work for all interfaces
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1

#禁用所有IP源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

#打开反向路径过滤功能,防止ip地址欺骗
net.ipv4.conf.all.rp_filter = 1

#启用源路由核查功能,减少DDoS攻击,防止IP Spoofing
net.ipv4.conf.default.rp_filter = 1

#禁止接收路由重定向报文,防止路由表被恶意更改
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

#只接受来自网关的“重定向”icmp报文
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0

#禁止转发重定向报文
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

net.ipv4.tcp_window_scaling = 1
#表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_syn_backlog = 8192

#timewait的数量,默认是180000。(Deven:因此如果想把timewait降下了就要把tcp_max_tw_buckets值减小)
net.ipv4.tcp_max_tw_buckets = 4096

#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.tcp_keepalive_time = 20

#禁用路由转发,只有在服务器上个开启了 ip_forward后,到达服务器的请求才会被iptables转发出去
net.ipv4.ip_forward = 0

#当TCP使用了该值的内存页面数时
net.ipv4.tcp_mem = 192000 300000 732000

 TCP读buffer
net.ipv4.tcp_rmem = 51200 131072 204800

#min4096(4K)为TCP socket预留用于发送缓冲的内存最小值,default 16384(16K) max131072(128K)
net.ipv4.tcp_wmem = 51200 131072 204800

#探测消息未获得响应时,重发该消息的间隔时间(秒)(默认75)
net.ipv4.tcp_keepalive_intvl = 20

#在认定TCP连接失效之前,最多发送多少个keepalive探测消息。(默认9)
net.ipv4.tcp_keepalive_probes = 2

#对孤立的socket重试的最大次数
net.ipv4.tcp_orphan_retries = 3

#在内核放弃建立连接之前发送SYN包的数量
net.ipv4.tcp_syn_retries = 3

#为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量
net.ipv4.tcp_synack_retries = 3

#在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试。默认值为15
net.ipv4.tcp_retries2 = 5

#如果套接字由本端要求关闭,这个参数 决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些
net.ipv4.tcp_fin_timeout = 30

#系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量,那么不属于任何进程的连接会被立即reset,并同时显示警告信息
net.ipv4.tcp_max_orphans = 200000

#开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接
net.ipv4.tcp_tw_reuse = 1

#启用timewait快速回收
net.ipv4.tcp_tw_recycle = 1

#表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为10000到65000
net.ipv4.ip_local_port_range = 10000 65000

#每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.netdev_max_backlog = 4096

#在所有标记的二进制程序中被启用。
kernel.exec-shield = 1

#参数值为2时,表示启用随机地址功能;0表示关闭;
kernel.randomize_va_space = 1

#增加系统文件描述符限制
#fs.file-max = 65535

#PID分配限制值。当内核下一个PID值到达这个值,它会回到最低的PID值。PID的最大的pid_max未分配,默认值为32768
kernel.pid_max = 65536

#该文件表示强制Linux VM最低保留多少空闲内存
vm.min_free_kbytes=409600
#该项表示内核回收用于directory和inode cache内存的倾向
vm.vfs_cache_pressure=200

#缺省60,减少这个参数会使系统尽快通过swapout不使用的进程资源来释放更多的物理内存
vm.swappiness = 40

#缺省是3000,也就是30秒,如果系统写操作压力很大,可以适当减小该值,但也不要太小;建议设置为
vm.dirty_expire_centisecs = 1500

#这个参数控制内核的脏数据刷新进程pdflush的运行间隔。单位是 1/100 秒。缺省数值是500,持续的写入降低,短期的写入并且数据不打并且内存多,应该增大数值
vm.dirty_writeback_centisecs = 1000

#单个进程的脏页数量达到系统总内存的多大比例后,就会触发pdflush/flush/kdmflush等后台回写进程运行。
vm.dirty_ratio = 20

#所有全局系统进程的脏页数量达到系统总内存的多大比例后,就会触发pdflush/flush/kdmflush等后台回写进程运行
vm.dirty_background_ratio = 10
6.3 tcp_tw_recycle内核参数说明
服务器端打开tcp_tw_recycle参数时,必须要非常小心,因为它依赖于客户机的时间戳。这可能会导致共享套接字的NAT系统出现问题,从而导致服务器端内核丢弃SYN包并忽略连接尝试,造成客户端connection refused,这将导致客户端发生随机连接故障。
当客户端访问一个net.ipv4.tcp_tw_recycle打开的服务器时,客户端连接可能会被有规律的丢弃,因为NAT后面的主机没有同步的TCP时钟。
如果客户端没有启用net.ipv4.tcp_timestamps内核参数,则服务端net.ipv4.tcp_tw_recycle内核参数无法正常工作。

磁盘IO优化

1、cfq是一种比较通用的调度算法,是一种以进程为出发点考虑的调度算法,保证尽量公平。 

2、deadline是一种以提高机械硬盘吞吐量为思考出发点的调度算法,只有当有IO请求达到最终期限的时候 才进行调度,非常适合业务比较单一并且IO压力比较重的业务,比如数据库。 

3、noop在固态硬盘这种场景下,使用noop是最好的,deadline次之,而cfq由于复杂度的原因,效率最 低。

1.改变调度器
echo noop > /sys/block/sdX/queue/scheduler 

2.增加请求队列 
#参数可以大幅提升磁盘的吞吐量,缺点会牺牲一定的内存。 
echo 4096 > /sys/block/sdX/queue/nr_requests 

3.增加预读数 
#针对读大文件时可减少查找次数。 
echo 4096 > /sys/block/sdX/queue/read_ahead_kb 


IO内核参数 
/proc/sys/vm/dirty_ratio 
这个参数控制文件系统的文件系统写缓冲区的大小,单位是百分比,表示系统内存的百分比,表示当写缓冲使 用到系统内存多少的时候,开始向磁盘写出数 据。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大 提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值,一般启动上缺省是 10。 

/proc/sys/vm/dirty_background_ratio 
这个参数控制文件系统的pdflush进程,在何时刷新磁盘。单位是百分比,表示系统内存的百分比,意思是当 写缓冲使用到系统内存多少的时候, pdflush开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写 缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值,一般启动 上缺省是 5。 

/proc/sys/vm/dirty_writeback_centisecs 
这个参数控制内核的脏数据刷新进程pdflush的运行间隔。单位是 1/100 秒。缺省数值是500,也就是 5 秒。如果你的系统是持续地写入动作,那么实际上还是降低这个数值比较好,这样可以把尖峰的写操作削平成 多次写操作。如果你的系统是短期地尖峰式的写操作,并且写入数据不大(几十M/次)且内存有比较多富裕, 那么应该增大此数值。 

/proc/sys/vm/dirty_expire_centisecs 
这个参数声明Linux内核写缓冲区里面的数据多"旧"了之后,pdflush进程就开始考虑写到磁盘中去。单位是 1/100秒。缺省是 30000,也就是 30 秒的数据就算旧了,将会刷新磁盘。对于特别重载的写操作来说,这 个值适当缩小也是好的,但也不能缩小太多,因为缩小太多也会导致IO提高太快。建议设置为 1500,也就是 15秒算旧。 

echo 1500 > /proc/sys/vm/dirty_expire_centisecs 
当然,如果你的系统内存比较 大,并且写入模式是间歇式的,并且每次写入的数据不大(比如几十M),那么这个值还是大些的好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值