Author:Skate
Time:2018/08/09
先扔两个小问题
在回答上面问题前,先简单理解一个服务请求完整过程
1.服务启动时创建监听scoket
2.创建的监听socket与对外服务的端口绑定
3.服务开始监听
4.客户端开始连接服务器对应的port
5.服务端接受客户端的请求并产生新的socket,基于这个新的socket与客户端交换数据
从以上流程来看,“端口号”这个重要的东东,我们只用了一次,就是执行bind的时候!而以后创建的socket,说白了就是一个可以进行网络IO操作的HANDLE而已,
它跟端口号的牵扯仅限bind以及作为客户端连接服务器的识别端口号的时候,一旦服务产生了新socket,这个端口号,对服务器和新客户端的通信而言就不再有任何意义
我们知道一个socket是可以进行网络IO操作的HANDLE(linux系统任何设备都用多文件来表示的),服务器可承载的连接数最大量,不就是能产生多少个客户端的socket吗。
1.linux系统创建一个socket多大呢?
1.1.TCP发送缓冲区,单位为字节(最小、默认、最大)
/proc/sys/net/ipv4/tcp_wmem
# cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 4194304
1.2.TCP读取缓冲区,单位为字节(最小、默认、最大)
/proc/sys/net/ipv4/tcp_rmem
# cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 4194304
2.linux供TCP使用内存大小
调整TCP的内存大小,其单位是页,1页等于4096字节
/proc/sys/net/ipv4/tcp_mem(最小、默认、最大)
# cat /proc/sys/net/ipv4/tcp_mem
12383040 16510720 24766080
tcp_mem三个变量说明:
low:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。
pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。
high:允许所有tcp sockets用于排队缓冲数据报的页面量,当内存占用超过此值,系统拒绝分配socket,后台日志输出“TCP: too many of orphaned sockets”。
3.linux系统任何设备都用文件来表示的,那创建socket的总数还受linux的句柄数控制
fs.file_nr ---单进程句柄数控制
fs.file_max ---系统级别句柄数控制
总结下,要增大linux系统的并发,取决如下:
1.需要根据自己的业务减少每个socket的大小(tcp_wmem,tcp_rmem),
2.增加rcp使用总内存(tcp_rmem),
3.增加系统句柄数量(fs.file_max,fs.file_nr)
4.tcp其他参数优化(tcp_tw_reuse、tcp_tw_recycle、tcp_keepalive_time、tcp_fin_timeout、.tcp_max_tw_buckets、net.core.somaxconn、tcp_max_syn_backlog)
5.硬件给力(cpu核越多越好,网卡要快)
最后再回答前面的问题
1.port和socket的区别
port:是一个有16bit表示的,可允许有 65536 ( 2的16次方) 个不同的端口号,范围在 0 ~ 65535 之间
socket:socket可以理解为服务的寻址方式,用于定位服务的
2.单机系统的最大并发多大?和65535有什么关系?
理论linux系统的最大并发取决与硬件极限,而我们日常有时会误解最大并发数65535,是因为受限句柄限制导致的
参考:
https://www.cnblogs.com/276815076/p/6992352.html
http://www.blogjava.net/yongboy/archive/2013/04/11/397677.html