一台Linux服务器可以负载多少个连接?

首先我们来看如何标识一个TCP连接?系统是通过一个四元组来识别,(src_ip,src_port,dst_ip,dst_port)即源IP、源端口、目标IP、目标端口。比如我们有一台服务192.168.0.1,开启端口80.那么所有的客户端都会连接到这台服务的80端口上面。有一种误解,就是我们常说一台机器有65536个端口,那么承载的连接数就是65536个,这个说法是极其错误的,这就混淆了源端口和访问目标端口。我们做压测的时候,利用压测客户端,这个客户端的连接数是受到端口数的限制,但是服务器上面的连接数可以达到成千上万个,一般可以达到百万(4C8G配置),至于上限是多少,需要看优化的程度。具体做法如下:

我们在压测一台目标服务器,想看下负载的连接数,当我们压到一定数量的时候,控制台突然报"too many open files",这是因为linux系统创建一个TCP连接的时候,都会创建一个socket句柄,每个socket句柄就是一个文件句柄。操作系统对打开的文件句柄数量是有限制的。Unix/Linux 基本哲学之一就是 "一切皆文件",要提高TCP承载量,就需要调整文件句柄。

第一步:修改文件句柄数量限制

# 查看当前用户允许TCP打开的文件句柄最大数
ulimit -n # 修改文件句柄
vim /etc/security/limits.conf * soft nofile 655350
* hard nofile 655350

修改后,退出终端窗口,重新登录(不需要重启服务器),就能看到最新的结果了。这是优化的第一步,修改文件句柄限制。

注意:
soft nofile (软限制)是指Linux在当前系统能够承受的范围内进一步限制用户同时打开的文件数
hard nofile (硬限制)是根据系统硬件资源状况(主要是系统内存)计算出来的系统最多可同时打开的文件数量
通常软限制小于或等于硬限制

第二步:TCP参数调优

参数 默认配置 调整配置 说明
fs.file-max 1048576 9999999 所有进程打开的文件描述符数
fs.nr_open 1635590 1635590 单个进程可分配的最大文件数
net.core.rmem_default 124928 262144 默认的TCP读取缓冲区
net.core.wmem_default 124928 262144 默认的TCP发送缓冲区
net.core.rmem_max 124928 8388608 默认的TCP最大读取缓冲区
net.core.wmem_max 124928 8388608 默认的TCP最大发送缓冲区
net.ipv4.tcp_wmem 4096 16384 4194304 4096 16384 8388608 TCP发送缓冲区
net.ipv4.tcp_rmem 4096 87380 4194304 4096 87380 8388608 TCP读取缓冲区
net.ipv4.tcp_mem 384657 512877 769314 384657 512877 3057792 TCP内存大小
net.core.netdev_max_backlog 1000 5000 在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.optmem_max 20480 81920 每个套接字所允许的最大缓冲区的大小
net.core.somaxconn 128 2048 每一个端口最大的监听队列的长度,这是个全局的参数
net.ipv4.tcp_fin_timeout 60 30 对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间(秒)。对方可能会断开连接或一直不结束连接或不可预料的进程死亡
net.core.netdev_max_backlog 1000 10000 在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.ipv4.tcp_max_syn_backlog 1024 2048 对于还未获得对方确认的连接请求,可保存在队列中的最大数目。如果服务器经常出现过载,可以尝试增加这个数字
net.ipv4.tcp_max_tw_buckets 5000 5000 系统在同时所处理的最大timewait sockets数目
net.ipv4.tcp_tw_reuse 0 1 是否允许将TIME-WAIT sockets重新用于新的TCP连接
net.ipv4.tcp_keepalive_time 7200 900 表示TCP链接在多少秒之后没有数据报文传输时启动探测报文(发送空的报文)
net.ipv4.tcp_keepalive_intvl 75 30 表示前一个探测报文和后一个探测报文之间的时间间隔
net.ipv4.tcp_keepalive_probes 9 3 表示探测的次数

从上面的配置参数中我们可以知道,在Linux内核中为tcp发送和接收都做了缓冲队列,这样可以提高系统的吞吐量。
以上这些参数都是在 /etc/sysctl.conf 文件中定义的,有的参数在文件中可能没有定义,系统给定了默认值,需要修改的话,直接在文件中添加或修改,然后执行sysctl -p命令让其生效。

注意:
参数值并不是设置的越大越好,有的需要考虑服务器的硬件配置,参数对服务器上其它服务的影响等。

一台Linux服务器(4C8G配置)可以负载百万个连接?的更多相关文章

  1. 一条shell命令让多台Linux服务器执行

    1.环境 局域网环境有3台Linux服务器,配置host文件 [root@master1 ~]# vim /etc/hosts 192.168.8.201 master1 192.168.8.202 ...

  2. [亲测]ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问

    前言 ASP.NET Core 2.0 怎么发布到Ubuntu服务器?又如何在服务器上配置使用ASP.NET Core网站绑定到指定的域名,让外网用户可以访问呢? 步骤 第1步:准备工作 一台Liun ...

  3. [亲测]七步学会ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问

    前言 ASP.NET Core 2.0 怎么发布到Ubuntu服务器?又如何在服务器上配置使用ASP.NET Core网站绑定到指定的域名,让外网用户可以访问呢? 步骤 第1步:准备工作 一台Liun ...

  4. 两台linux服务器之间实现挂载

    https://blog.csdn.net/lpp_dd/article/details/78743862 两台linux服务器之间实现挂载: 服务端: 1.首先需要在主机上设置允许挂载的目录 (1) ...

  5. 在一台Linux服务器上安装多个MySQL实例(一)--使用mysqld_multi方式

    (一)MySQL多实例概述 实例是进程与内存的一个概述,所谓MySQL多实例,就是在服务器上启动多个相同的MySQL进程,运行在不同的端口(如3306,3307,3308),通过不同的端口对外提供服务 ...

  6. 用rsync备份一台linux服务器上的数据

    rsync是安装完linux后都会自带的,在机器上运行rsync命令看是否有安装即可 备份到远程服务器 这里介绍的rsync的用途是备份一台linux服务器上的数据到另外一台机器 环境 将需要备份机器 ...

  7. 在Linux服务器上配置phpMyAdmin

    使用php和mysql开发网站的话,phpmyadmin是一个非常友好的mysql管理工具,并且免费开源,国内很多虚拟主机都自带这样的管理工具,配置很简单,接下来在linux服务器上配置phpmyad ...

  8. 本地Linux服务器上配置Git

    当我们需要拉取远程服务器代码到本地服务器时,我们首先要确定已经配置了正确的Git账号,可以从~/.gitconfig文件(为隐藏文件,需要使用ls -a查看),以及~/.ssh下的id_rsa.pub ...

  9. linux服务器上配置多个svn仓库

    linux服务器上配置多个svn仓库 1.在指定目录建立仓库保存总目录,本文示例目录设定为:/usr/local/svn/svnrepos # mkdir -p /usr/local/svn/svnr ...

随机推荐

  1. oracle 10 升级补丁

    Ooacle 10g补丁安装方法 Windows 平台 方法: 1.  备份数据库:关闭数据库,拷贝,安装软件目录,数据文件拷到另一个地方 2.  关闭停止所有oracle 服务+Distribute ...

  2. Natasha V1.3.6.0 的升级日志

    开源库满足于个人,而完善于大众. Natasha 自稳定版发布之后,众多老铁参与增强改进,感谢如下老铁的反馈: 1. 异常搜集 在 wenjq0911 建议下,添加了异常捕获,现 Natasha 的编 ...

  3. 使用xdebug对php做性能分析调优

    作为PHP程序员我们或多或少都了解或使用过xdebug.此文章记录安装和配置xdebug,以及如何使用它来分析php程序. 我的机器环境: mac, php 安装 xdebug 推荐使用 pecl 安 ...

  4. 1-Consul系列文章

    使用Consul做服务发现的若干姿势 Consul的反熵 [Consul]Consul架构-简介

  5. Mybatis逆向工程的使用。

    指定配置文件与main运行生成 public class GeneratorSqlmap { public void generator() throws Exception { List<St ...

  6. 浅聊标签<include>和<viewStub>

    在开发中我们往往会遇到这种情况,当一个布局文件比较复杂时,我们一个劲地往里面拖各种控件button,textView,imageView阿等等,等过了一段时间后,出现bug,自己都把自己搞懵比啦,特别 ...

  7. MySQL复制技术

    MySQL高可用方案 投票选举机制,较复杂 MySQL本身没有提供replication failover的解决方案,自动切换需要依赖MHA脚本 可以有多台从库,从库可以做报表和备份 MySQL复制技 ...

  8. 将qemu使用的设备树dump出来

    像下面的qemu启动命令: sudo qemu-system-aarch64 \ -M virt \ -cpu cortex-a53 \ -smp \ -m 4096M \ -kernel ./lin ...

  9. Python 模拟伯努利试验和二项分布

    1.模拟 27 次投掷硬币的伯努利试验 代码: from scipy import stats import numpy as np p = 0.5 # 生成冻结分布函数 bernoulliDist ...

  10. seq2seq模型详解及对比(CNN,RNN,Transformer)

    一,概述 在自然语言生成的任务中,大部分是基于seq2seq模型实现的(除此之外,还有语言模型,GAN等也能做文本生成),例如生成式对话,机器翻译,文本摘要等等,seq2seq模型是由encoder, ...