每天进步一点点——Swift之操作系统性能优化


转载请说明出处:http://blog.csdn.net/cywosp/article/details/20528243

 

swift是基于RESTFul设计的分布式对象存储系统,其工作原理类似于一个web服务器。当上层大量的访问或者上传数据时其会产生大量的http链接,每一个链接都会消耗掉一个系统的端口(系统中默认最多有65536个端口,因此端口对操作系统来说是一个紧俏的稀缺资源),直到该链接断开且被系统回收后才能重复使用,如果所有端口都已被占用,那么新来的http链接就得等到有端口可以使用方能正常工作,这样就大大的拉升了请求的响应时间,从而导致系统资源的使用率降低。如果长时间不能得到可用的端口(Swift中proxy向account/container/object服务发起http连接默认等待时间是0.5秒,也就是说0.5秒之后,该链接如果还无法连上,则将会返回503给上层应用。在高压力之下,如果端口释放已被耗尽且不能及时的释放的话,这种情况是常会发生的)

  在http链接断开后,操作系统并不会立即回收对应的端口

构建高效稳定的Swift运行环境
    在Swift接受大量请求之后操作系统会产生大量处于tcp TIME_WAIT状态的连接不能快速的回收,从而导致系统的端口不能及时的被利用,后来的请求被阻塞无法等到及时的响应,最终导致系统处于有可能被拉死的危险情形。
    根据swift官方建议以及长时间使用Swift的经验,希望操作系统对/etc/sysctl.conf文件添加如下配置(如果/etc/sysctl.conf文件中已有和如下配置相同
的则可以不用更改,或者改为如下值)
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 32768
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 10240 65000
net.core.netdev_max_backlog = 3000
net.core.somaxconn = 10240

增加或者修改完保存之后使用命令sysclt -p来使其及时生效,同时也可以检测是否书写正确

注释:
#1表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
#开启有助于保护服务器免受SyncFlood攻击
net.ipv4.tcp_syncookies = 1 

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

#1表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭 。开启该选项对web服务器来说非常有用,
#能够减少由于大量TIME-WAIT造成的系统压力
net.ipv4.tcp_tw_reuse = 1

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

#表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为10240到65000 增加系统端口的随机可用个数,减少等待时间
net.ipv4.ip_local_port_range = 10240 65000

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

#系统socket操作中listen 函数的backlog的最大值,默认128 。当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。
#在Swift压力过大时128是远远不够的
net.core.somaxconn = 10240


/etc/sysctl.conf
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为1800秒,
#减少TCP KeepAlive连接侦测的时间,使系统可以处理更多的连接
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_orphan_retries = 3
#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
#net.ipv4.tcp_fin_timeout = 30  
#表示SYN队列的长度,默认为1024,加大队列长度为32768,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_syn_backlog = 32768
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
#开启有助于保护服务器免受SyncFlood攻击
net.ipv4.tcp_syncookies = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_tw_recycle = 1
#表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为20480到65000
net.ipv4.ip_local_port_range = 20480 65000
#减少超时前的探测次数 
net.ipv4.tcp_keepalive_probes = 5

#优化TCP接收/发送缓冲区
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
#每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.netdev_max_backlog = 3000
#该文件表示每个套接字所允许的最大缓冲区的大小
net.core.optmem_max = 81920
#该文件指定了发送套接字缓冲区大小的缺省值(以字节为单位)
net.core.wmem_default = 8388608
#指定了发送套接字缓冲区大小的最大值(以字节为单位)
net.core.wmem_max = 16777216
#指定了接收套接字缓冲区大小的缺省值(以字节为单位)
net.core.rmem_default = 8388608
#指定了接收套接字缓冲区大小的最大值(以字节为单位)
net.core.rmem_max = 16777216
#web 应用中listen 函数的backlog默认会给内核参数的net.core.somaxconn限制到128
net.core.somaxconn = 20480



相关内容