网上著名的C10K并发连接问题 具体是怎么回事?
常见的linux服务器参数优化有哪些?
C10K问题算是历史上的一个问题,在Linux上最早的开发模型里,只有线程编程模型,来一个用户就需要使用一个进程来处理。但随着互联网发展的井喷,服务器端要支持的并发数越来越高。如果还继续沿用这个模型的话,就需要投入巨量的服务器资源。所以C10K问题的提出,就是要处理如何让一台服务器同时处理1万个用户连接请求。在epoll诞生以后,C10K已经不是问题了。
第2个问题,sysctl -a 可以看到所有的linux内核提供的课配置参数。但是对于每一个参数,应该首先先了解它的工作原理。然后再优化的时候就能得心应手了。
1、C10K 问题是这样的:如何在一台物理机上同时服务 10000 个用户?这里 C 表示并发,10K 等于 10000。得益于操作系统、编程语言的发展,在现在的条件下,普通用户使用 Java Netty、Libevent 等框架或库就可以轻轻松松写出支持并发超过 10000 的服务器端程序,甚至于经过优化之后可以达到十万,乃至百万的并发,但在二十年前,突破 C10K 问题可费了不少的心思,是一个了不起的突破。
为了解决 C10K 问题,需要重点考虑两个方面的问题:
——参考链接。
2、系统内核相关优化参数,主要修改系统的 /etc/sysctl.conf 文件,内容如下:
#add by ethan
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
#修改系統默认的 TIMEOUT 时间
net.ipv4.tcp_timestamps = 0
# tcp时间戳,是为了提高tcp性能的扩展选项,用于计算RTT(TCP往返传输时间)和减少重复发包,2.6内核的Linux默认是打开的。设置为0解决服务器不响应SYN包的现象。
net.core.somaxconn = 4096
#限制socket监听队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制,默认的128。
net.ipv4.tcp_max_orphans = 3276800
#系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。这个限制仅仅是为了防止简单的 DoS攻击,缺省值是8192。
net.core.netdev_max_backlog = 262144
#排队传递给设备队列的输入报文最大数量。
net.ipv4.tcp_syn_retries = 5
#外向syn握手重试次数,对于一个新建连接,内核要发送多少个SYN连接请求才决定放弃,默认5
net.ipv4.tcp_synack_retries = 5
# syn-ack握手状态重试次数,相当于三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量,默认5
#add by wind
net.ipv4.tcp_max_tw_buckets = 60000
#系统在同时所处理的最大 timewait sockets 数目,默认是180000。
net.ipv4.tcp_max_syn_backlog = 262144
# SYN 队列长度,对于那些依然还未获得客户端确认的连接请求﹐需要保存在队列中最大数目。
net.ipv4.tcp_keepalive_time = 1200
#当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是7200秒。
net.ipv4.tcp_keepalive_probes = 3
# TCP发送keepalive探测以确定该连接已经断开的次数,缺省值是9。
net.ipv4.tcp_keepalive_intvl = 30
#探测消息发送的频率,缺省是75秒。
net.ipv4.tcp_mem = 94500000 915000000 927000000
# (3个INTEGER变量):low, pressure, high
#low:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。
#pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。
#high:允许所有tcp sockets 用于排队缓冲数据报的页面量,如果超过这个值,TCP 连接将被拒绝。
net.ipv4.ip_local_port_range = 1024 65000
#允许系统打开的端口范围,用于向外连接的端口范围。缺省情况下其实很小:1024到4999。
kernel.msgmnb = 65536
#每个消息队列的最大字节限制。
kernel.msgmax = 65536
#单个消息的最大大小。
kernel.shmmax = 68719476736
#单个共享内存段的最大大小。
kernel.shmall = 4294967296
#可分配的共享内存数量的系统级限制。
net.ipv4.tcp_sack = 1
#选择性确认,减少重传。
net.ipv4.tcp_window_scaling = 1
# tcp滑动窗口大小是否可变
net.ipv4.tcp_rmem = 4096 87380 4194304
# TCP socket 读缓冲区最小、默认、最大大小
net.ipv4.tcp_wmem = 4096 16384 4194304
# TCP socket 写缓冲区最小、默认、最大大小
net.core.wmem_default = 8388608
# socket写缓冲区全局默认大小
net.core.rmem_default = 8388608
# socket读缓冲区全局默认大小
net.core.rmem_max = 16777216
# socket读缓冲区全局最大大小
net.core.wmem_max = 16777216
# socket写缓冲区全局最大大小
——参考链接。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。