单台服务器上并发TCP连接数
    
问题:一台服务器到底能够支持多少TCP并发连接呢?

1. 文件描述符限制:
    对于服务器来说,每一个TCP连接都要占用一个文件描述符,一旦文件描述符使用完,新的连接到来返回给我们的错误是"Socket/File:Can't open so many files"

这时,你需要明白操作系统可以打开最大文件数的限制。

进程限制(用户限制):
            执行 ulimit -n 输出1024,说明对于一个进程而言最多只能打开1024个文件,所以你要采用此默认配置最多也就可以并发上千个TCP连接。

临时修改:ulimit -n 1000000,但是这种临时修改只对当前登录的用户目前使用的环境有效,系统重启或用户退出会就失效。

永久生效:修改/etc/security/limits.conf 文件:

                *    soft    nofile    1000000
* hard nofile 1000000
ulimit -SHn 1000000 >> /etc/rc.local

全局限制:
            执行 cat /proc/sys/fs/file-nr  
                1216    0    187612
                (1) 1216:已经分配的文件描述符数
                (2) 0:已经分配但没有使用的文件描述符数,这里的意思是内核分配了1216,然后1216个都用光了,所以“分配了但没有使用的 句柄数目” 为 0 
                (3) 187612:最大文件句柄数
                注意:在kernel2.6 版本中第二项的值总为0,这并不是一个错误,它实际上意味着已经分配的文件描述符无一浪费的都已经
                被使用。

可以通过在/etc/sysctl.conf里定义fs.file-max = 1000000 来调整最后一个值的大小

2. 端口号范围限制:
    操作系统上端口号1024以下是系统保留的,从1024-65535是用户使用的,由于没有tcp连接都要占用一个端口号,所以我们最多可以使用
    60000多个并发连接,这是对客户端的理解。
    分析一下:
        (1) 如何标识一个TCP连接? 系统用一个4元组来标识一个TCP连接:(local ip,local port,remote ip, remote port) 对于accept来说,accept的sock不占新的端口 第一个local ip , local port 代表客户端的ip地址和端口号。
        而我们作为服务器实际只是使用了bind这一个端口
        说明端口65535并不是并发量的限制。
        (2) server最大tcp连接数:server通常固定在某一个本地端口上监听,等待client的连接请求。不考虑地址重用的情况下,即使多个ip
        本地监听端口也是独占的。因此server端tcp连接4元组中只有remote ip 和 remote port 是可变的,因此最大tcp连接为
        客户端ip数 * 客户端port数。 对于ipv4,不考虑ip地址等因素,最大tcp连接约为2的32次方(ip数) * 2的16次方(port数)
        也就是  server端:单机最大tcp连接数约为:2的48次方。

问题1:查看文件描述符使用 lsof查看到的句柄数和/proc/sys/fs/file-nr 值不一样,为什么?

        [root@localhost ~]# lsof | wc -l
710
[root@localhost ~]# !cat
cat /proc/sys/fs/file-nr
416 0 1000000

答案:一个文件可以被多个进程打开,lsof所列出来的是每个进程所打开的文件,所以lsof的数值比file-nr要大很正常。

问题2:关于文件句柄到底设置多大合适?

查看句柄数的方法:

        [root@node1 ~]# cat /proc/sys/fs/file-nr
832 0 97321
[root@node1 ~]# cat /proc/sys/fs/file-max
97321
默认最大句柄数为97321

这个值在kernel的文档里意思是file-max一般为内存大小(KB)的10%来计算,如果使用shell,可以这样计算:
        grep -r MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}'  计算出来的值一般和默认最大句柄数近似。

        echo "fs.file-max = 100133" >> /etc/sysctl.conf && sysctl -p

【 Linux 】单台服务器上并发TCP连接数(转)的更多相关文章

  1. 【 Linux 】单台服务器上并发TCP连接数

    单台服务器上并发TCP连接数    问题:一台服务器到底能够支持多少TCP并发连接呢? 1. 文件描述符限制:    对于服务器来说,每一个TCP连接都要占用一个文件描述符,一旦文件描述符使用完,新的 ...

  2. 网络编程释疑之:单台服务器上的并发TCP连接数可以有多少

    曾几何时我们还在寻求网络编程中C10K问题的解决方案,但是现在从硬件和操作系统支持来看单台服务器支持上万并发连接已经没有多少挑战性了.我们先假设单台服务器最多只能支持万级并发连接,其实对绝大多数应用来 ...

  3. socket跟TCP/IP 的关系,单台服务器上的并发TCP连接数可以有多少

    常识一:文件句柄限制 在Linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是"Socket/File ...

  4. Linux两台服务器上互传文件

    主服务器:192.168.100.30: 文件所在服务器:192.168.100.31: 1. 在主服务上拷贝文件: #scp root@192.168.100.31:/home/a.txt /hom ...

  5. 高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少

    高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少     阅读(81374) | 评论(9)收藏16 淘帖1 赞3   JackJiang Lv.9    1 年前 | 前言 曾几何时我 ...

  6. 单台服务器最大tcp连接

    如果对服务器进行压力测试,常常出现这种情况 tcp连接数过多 netstat   -an    windows查看tcp连接数 那么怎么增加单台服务器的最大连接数呢?       最简单的办法,增加内 ...

  7. Linux课程---16、apache虚拟主机设置(如何在一台服务器上配置三个域名)

    Linux课程---16.apache虚拟主机设置(如何在一台服务器上配置三个域名) 一.总结 一句话总结:有三个网站www.lampym.com,bbs.lampym.com,mysql.lampy ...

  8. 不要将缓存服务器与Tomcat放在单台机器上,否则出现竞争内存问题

    缓存分为本地缓存和远程分布式缓存,本地缓存访问速度更快但缓存数据量有限,同时存在与应用程序争用内存的情况. 1.不要将缓存服务器与Tomcat放在单台机器上,否则出现竞争内存问题 2.不要将缓存服务器 ...

  9. [转]linux将一个服务器上的文件或者文件夹复制到另一台服务器上

    本文转载自<linux 将一个服务器上的文件或者文件夹复制到另一台服务器上>,有时间实践一把 使用scp将一个Linux系统中的文件或文件夹复制到另一台Linux服务器上 复制文件或文件夹 ...

随机推荐

  1. 在Mac系统上安装Tomcat

    到 apache官方主页 下载 Mac 版本的完整 .gz文件包.解压拷贝到 /Library目录下.   1.Mac中 Finder打开 Library的方法 新建 Finder窗口   按下 sh ...

  2. 小程序setData工作原理理解图

    优化建议:1.频繁的去setData--我曾经用这个弄过动画效果,当然后来发现JS动画不适合小程序,CSS3动画才是王道2.每次setData都传递大量新数据--这个大量还真不好理解,暂时定为排行榜类 ...

  3. 水平ListView

    /* * HorizontalListView.java v1.5 * * * The MIT License * Copyright (c) 2011 Paul Soucy (paul@dev-sm ...

  4. asp.net Core 中间件Hello world

    虽然在ASP.NET 5中,微软没有再强调OWIN(Open Web Interface for .NET)及其微软官方的OWIN实现Katana,但是其中涉及到一些原则和设计思想依然被ASP.NET ...

  5. 海思hi3518 opencv测试

    2.4.9的opencv 安装好交叉编译后,用Cmake 配置opencv 修改CMakeCache.txtCMAKE_EXE_LINKER_FLAGS:STRING=-lpthread -lrt - ...

  6. 完全理解Gson(2):Gson序列化

    通过调用 Gson API 可以把 Java 对象转换为 JSON 格式的字符串(项目主页).在这篇文章中,我们将会讲到如何通过 Gson 默认实现和自定义实现方式,将 Java  对象转换为 JSO ...

  7. shell执行时文件命名导致的错误

    1.脚本check_nginx.sh的内容如下: #!/bin/bash count=$(ps -ef | grep nginx | grep -v grep | wc -l) echo $count ...

  8. 实用Linux命令

    lsof -i:6379 查看某个端口的程序有没有起起来. netstat -tnlp 可以查看监听的端口,其中l是listening, p是显示program, n是显示ip而不是name, t看起 ...

  9. Java 命名小技巧

    存储信息: xxxStorage 映射: xxxMapping 通过参数获取某个对象: getxxxFor 处理器: xxxHanlder handle 检索: xxxretriever 验证器: x ...

  10. 关于Javascript你可能不知道的事

    NaN表示一个不能产生正常结果的运算结果.它不等于任何值,包括它自己.可以用isNaN(number)来检测. 同Java中的字符串一样,JS中的字符串是不可变的.也就是说一旦字符串被创建,就无法改变 ...