开发者社区> 问答> 正文

网上著名的C10K并发连接问题 具体是怎么回事? 常见的linux服务器参数优化有哪些?

网上著名的C10K并发连接问题 具体是怎么回事?

常见的linux服务器参数优化有哪些?

展开
收起
OSC开源社区 2024-05-11 22:54:53 87 0
2 条回答
写回答
取消 提交回答
  • C10K问题算是历史上的一个问题,在Linux上最早的开发模型里,只有线程编程模型,来一个用户就需要使用一个进程来处理。但随着互联网发展的井喷,服务器端要支持的并发数越来越高。如果还继续沿用这个模型的话,就需要投入巨量的服务器资源。所以C10K问题的提出,就是要处理如何让一台服务器同时处理1万个用户连接请求。在epoll诞生以后,C10K已经不是问题了。
    第2个问题,sysctl -a 可以看到所有的linux内核提供的课配置参数。但是对于每一个参数,应该首先先了解它的工作原理。然后再优化的时候就能得心应手了。

    2024-05-13 22:20:16
    赞同 展开评论 打赏
  • 1、C10K 问题是这样的:如何在一台物理机上同时服务 10000 个用户?这里 C 表示并发,10K 等于 10000。得益于操作系统、编程语言的发展,在现在的条件下,普通用户使用 Java Netty、Libevent 等框架或库就可以轻轻松松写出支持并发超过 10000 的服务器端程序,甚至于经过优化之后可以达到十万,乃至百万的并发,但在二十年前,突破 C10K 问题可费了不少的心思,是一个了不起的突破。
    image.png

    为了解决 C10K 问题,需要重点考虑两个方面的问题:

    • 如何和操作系统配合,感知 I/O 事件的发生?
    • 如何分配和使用进程、线程资源来服务上万个连接?

    ——参考链接

    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写缓冲区全局最大大小
    

    ——参考链接

    2024-05-12 08:12:14
    赞同 1 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
如何运维千台以上游戏云服务器 立即下载
网站/服务器取证 实践与挑战 立即下载
ECS块储存产品全面解析 立即下载