首页 > 系统相关 >提升linux下tcp服务器并发连接数限制

提升linux下tcp服务器并发连接数限制

时间:2022-09-03 20:57:34浏览次数:83  
标签:文件 限制 tcp TCP 修改 连接数 linux net ipv4

提升linux下tcp服务器并发连接数限制 - 星辰大海ゞ - 博客园  https://www.cnblogs.com/wjoyxt/p/6155672.html

1、修改用户进程可打开文件数限制
   在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。可使用ulimit命令查看系统允许当前用户进程打开的文件数限制:
   [speng@as4 ~]$ ulimit -n
   1024
   这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进程必然打开的标准输入,标准输出,标准错误,服务器监听 socket,进程间通讯的unix域socket等文件,那么剩下的可用于客户端socket连接的文件数就只有大概1024-10=1014个左右。也就是说缺省情况下,基于Linux的通讯程序最多允许同时1014个TCP并发连接。
   对于想支持更高数量的TCP并发连接的通讯处理程序,就必须修改Linux对当前用户的进程同时打开的文件数量的软限制(soft limit)和硬限制(hardlimit)。其中软限制是指Linux在当前系统能够承受的范围内进一步限制用户同时打开的文件数;硬限制则是根据系统硬件资源状况(主要是系统内存)计算出来的系统最多可同时打开的文件数量。通常软限制小于或等于硬限制。
   修改上述限制的最简单的办法就是使用ulimit命令:
   [speng@as4 ~]$ ulimit -n <file_num>
   上述命令中,在<file_num>中指定要设置的单一进程允许打开的最大文件数。如果系统回显类似于“Operation notpermitted”之类的话,说明上述限制修改失败,实际上是因为在<file_num>中指定的数值超过了Linux系统对该用户打开文件数的软限制或硬限制。因此,就需要修改Linux系统对用户的关于打开文件数的软限制和硬限制。
   第一步,修改/etc/security/limits.conf文件,在文件中添加如下行:

wjoyxt soft nofile 655360
   *      hard nofile 655360
   *      soft nproc 131072
   *      hard nproc 131072

   其中wjoyxt指定了要修改哪个用户的打开文件数限制,可用'*'号表示修改所有用户的限制;soft或hard指定要修改软限制还是硬限制;655360则指定了想要修改的新的限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。修改完后保存文件。

   第二步,修改/etc/pam.d/login文件,在文件中添加如下行:
   session required /lib/security/pam_limits.so
   这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。修改完后保存此文件。
   第三步,解决完单一进程的文件句柄数量受限问题后,还要解决整个系统的文件句柄数量受限问题。我们可通过以下命令查看Linux系统级的最大打开文件数限制:

[root@localhost ~]# cat /proc/sys/fs/file-max

98957

file-max表示系统所有进程最多允许同时打开的文件句柄数,是Linux系统级硬限制。通常,这个系统硬限制是Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制。

要修改它,需要对 /etc/sysctl.conf 文件,增加一行内容:

fs.file-max = 3240808

保存成功后,需执行下面命令使之生效:

[root@localhost ~]# sysctl -p




2、修改网络内核对TCP连接的有关限制
   在Linux上编写支持高并发TCP连接的客户端通讯处理程序时,有时会发现尽管已经解除了系统对用户同时打开文件数的限制,但仍会出现并发TCP连接数增加到一定数量时,再也无法成功建立新的TCP连接的现象。出现这种现在的原因有多种。
   内核编译时默认设置的本地端口号范围可能太小,因此需要修改此本地端口范围限制。

   第一步,修改/etc/sysctl.conf文件,在文件中添加如下行:
   net.ipv4.ip_local_port_range = 1024 65000
   这表明将系统对本地端口范围限制设置为1024~65000之间。请注意,本地端口范围的最小值必须大于或等于1024;而端口范围的最大值则应小于或等于65535。修改完后保存此文件。

   第二步,执行sysctl命令:
   [speng@as4 ~]$ sysctl -p
   如果系统没有错误提示,就表明新的本地端口范围设置成功。如果按上述端口范围进行设置,则理论上单独一个进程最多可以同时建立60000多个TCP客户端连接。
   第二种无法建立TCP连接的原因可能是因为Linux网络内核的IP_TABLE防火墙对最大跟踪的TCP连接数有限制。此时程序会表现为在 connect()调用中阻塞,如同死机,如果用tcpdump工具监视网络,也会发现根本没有TCP连接时客户端发SYN包的网络流量。由于 IP_TABLE防火墙在内核中会对每个TCP连接的状态进行跟踪,跟踪信息将会放在位于内核内存中的conntrackdatabase中,这个数据库的大小有限,当系统中存在过多的TCP连接时,数据库容量不足,IP_TABLE无法为新的TCP连接建立跟踪信息,于是表现为在connect()调用中阻塞。此时就必须修改内核对最大跟踪的TCP连接数的限制,方法同修改内核对本地端口号范围的限制是类似的:

   第一步,修改/etc/sysctl.conf文件,在文件中添加如下行:
   net.ipv4.ip_conntrack_max = 8553600
   这表明将系统对最大跟踪的TCP连接数限制设置为8553600。请注意,此限制值要尽量小,以节省对内核内存的占用。

   第二步,执行sysctl命令:
   [speng@as4 ~]$ sysctl -p
-----------------------------------------------------------------------------------------------------------

/etc/sysctl.conf 优化追加以下内容:

复制代码
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.netdev_max_backlog = 10000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 8192 87380 16777216
net.ipv4.tcp_wmem = 8192 65536 16777216
net.ipv4.tcp_mem = 8388608 12582912 16777216
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_synack_retries = 2
net.ipv4.ip_conntrack_max = 8553600
net.ipv4.netfilter.ip_conntrack_max = 8553600
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 60
复制代码

标签:文件,限制,tcp,TCP,修改,连接数,linux,net,ipv4
From: https://www.cnblogs.com/jmbt/p/16653617.html

相关文章

  • 正确配置Linux系统ulimit值的方法
    正确配置Linux系统ulimit值的方法-爱开卷360-博客园 https://www.cnblogs.com/ibook360/archive/2012/05/11/2495405.html在Linux下面部署应用的时候,有时候会遇上So......
  • 正确配置Linux系统ulimit/nproc值的方法
    正确配置Linux系统ulimit/nproc值的方法_wkwanglei的博客-CSDN博客_linuxnproc https://blog.csdn.net/wkwanglei/article/details/44199891在Linux下面部署应用的时候......
  • Linux top命令的用法详细详解
    Linuxtop命令的用法详细详解_xiaoL_clo的博客-CSDN博客_linuxtop命令的用法详细详解 https://blog.csdn.net/dxl342/article/details/53507673查看多核CPU命令mpstat......
  • linux市场常用的防火墙区别
    nftables新的包过滤工具目的是代替iptablesNetfilter是引入的一个子系统,作为一个通用的、抽象的框架,提供一整套的hook函数的管理机制iptables是Linux应用......
  • linux挂载硬盘
    1查看硬盘fdisk-l 2查看目前硬盘挂载情况df-h 3格式化硬盘 mkfs.ext4/dev/xxx 4创建挂载点mkdir/data_dir1 5挂载硬盘mount/dev/xxx......
  • linux常用命令详解
    一、常用linux命令的基本使用命令对应英文作用lslist查看当前文件夹下的内容pwdprintworjdirectory查看当前所在文件夹cd[目录名]changedirectory......
  • [ Linux ] column 简明用法
    https://www.cnblogs.com/yeungchie/选项-c指定每一行输出的宽度。-t判断列来输出,对齐所有列。主要用到的就是这个选项。-s指定分隔符,默认为空白符。-o指定用于......
  • linux 下安装openjdk后,jps -ml 不启作用
    [root@node1jvm]#jps-bash:jps:commandnotfound其实安装这个命令也很简单,yum安装即可。先安装jdk,我安装的jdk8yuminstalljava-1.8.0-openjdk.x86_64安装完jdk8......
  • Linux 文件属性概说
    linux文件属性详细说明-张曼-博客园 https://www.cnblogs.com/Theladyflower/archive/2011/07/26/2117102.html1、Linux文件属性概说;Linux文件或目录的属性主......
  • linux grep命令详解
    linuxgrep命令详解-ggjucheng-博客园 https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856896.html简介grep(globalsearchregularexpression(RE)and......