困惑很多人的并发问题

在网络开发中,我发现有很多同学对一个基础问题始终是没有彻底搞明白。那就是一台服务器最大究竟能支持多少个网络连接?我想我有必要单独发一篇文章来好好说一下这个问题。

很多同学看到这个问题的第一反应是65535。原因是:“听说端口号最多有65535个,那长连接就最多保持65535个了”。是这样的吗?还有的人说:“应该受TCP连接里四元组的空间大小限制,算起来是200多万亿个!”

如果你对这个问题也是理解的不够彻底,那么今天讲个故事讲给你听!

一次关于服务器端并发的聊天

"TCP连接四元组是源IP地址、源端口、目的IP地址和目的端口。任意一个元素发生了改变,那么就代表的是一条完全不同的连接了。拿我的Nginx举例,它的端口是固定使用80。另外我的IP也是固定的,这样目的IP地址、目的端口都是固定的。剩下源IP地址、源端口是可变的。所以理论上我的Nginx上最多可以建立2的32次方(ip数)×2的16次方(port数)个连接。这是两百多万亿的一个大数字!!"

"进程每打开一个文件(linux下一切皆文件,包括socket),都会消耗一定的内存资源。如果有不怀好心的人启动一个进程来无限的创建和打开新的文件,会让服务器崩溃。所以linux系统出于安全角度的考虑,在多个位置都限制了可打开的文件描述符的数量,包括系统级、用户级、进程级。这三个限制的含义和修改方式如下:"

  • 系统级:当前系统可打开的最大数量,通过fs.file-max参数可修改
  • 用户级:指定用户可打开的最大数量,修改/etc/security/limits.conf
  • 进程级:单个进程可打开的最大数量,通过fs.nr_open参数可修改

"我的接收缓存区大小是可以配置的,通过sysctl命令就可以查看。"

$ sysctl -a | grep rmemnet.ipv4.tcp_rmem = 4096 87380 8388608net.core.rmem_default = 212992net.core.rmem_max = 8388608

"其中在tcp_rmem"中的第一个值是为你们的TCP连接所需分配的最少字节数。该值默认是4K,最大的话8MB之多。也就是说你们有数据发送的时候我需要至少为对应的socket再分配4K内存,甚至可能更大。"

"TCP分配发送缓存区的大小受参数net.ipv4.tcp_wmem配置影响。"

$ sysctl -a | grep wmemnet.ipv4.tcp_wmem = 4096 65536 8388608net.core.wmem_default = 212992net.core.wmem_max = 8388608

"在net.ipv4.tcp_wmem"中的第一个值是发送缓存区的最小值,默认也是4K。当然了如果数据很大的话,该缓存区实际分配的也会比默认值大。"

服务端百万连接达成记

“准备啥呢,还记得前面说过Linux对最大文件对象数量有限制,所以要想完成这个实验,得在用户级、系统级、进程级等位置把这个上限加大。我们实验目的是100W,这里都设置成110W,这个很重要!因为得保证做实验的时候其它基础命令例如ps,vi等是可用的。“

活动连接数量确实达到了100W:

$ ss -n | grep ESTAB | wc -l  1000024

当前机器内存总共是3.9GB,其中内核Slab占用了3.2GB之多。MemFree和Buffers加起来也只剩下100多MB了:

$ cat /proc/meminfoMemTotal:        3922956 kBMemFree:           96652 kBMemAvailable:       6448 kBBuffers:           44396 kB......Slab:          3241244KB kB

通过slabtop命令可以查看到densty、flip、sock_inode_cache、TCP四个内核对象都分别有100W个:

结语

互联网后端的业务特点之一就是高并发. 但是一台服务器最大究竟能支持多少个TCP连接,这个问题似乎却又在困惑着很多同学。希望今天过后,你能够将这个问题踩在脚下摩擦!

学习是一件痛苦的事情,尤其咱们号里很多读者朋友都是工作满一天了再来看我的技术号的文章的。我一直都在琢磨到底怎么样组织技术内容形式,能让大家理解起来更能省一点脑细胞呢。这篇服务器的最大并发数的文章是早就想发的,但是写了两三个版本都不满意。今天终于想出了一种让大家更容易理解的方式,算过了自己这关了。

linux 清tcp缓存 命令_漫画 | 一台Linux服务器最多能支撑多少个TCP连接?相关推荐

  1. mysql最多多少个索引_漫画 | 一台Linux服务器最多能支撑多少个TCP连接?

    来自公众号:开发内功修炼 困惑很多人的并发问题 在网络开发中,我发现有很多同学对一个基础问题始终是没有彻底搞明白.那就是一台服务器最大究竟能支持多少个网络连接?我想我有必要单独发一篇文章来好好说一下这 ...

  2. 服务器tcp连接占满_漫画 | 一台Linux服务器最多能支撑多少个TCP连接?

    困惑很多人的并发问题 在网络开发中,我发现有很多同学对一个基础问题始终是没有彻底搞明白.那就是一台服务器最大究竟能支持多少个网络连接?我想我有必要单独发一篇文章来好好说一下这个问题. 很多同学看到这个 ...

  3. 漫画 | 一台 Linux 服务器最多能支撑多少个 TCP 连接?

    作者 | 张彦飞allen 来源 | 开发内功修炼(ID:kfngxl) 困惑很多人的并发问题 在网络开发中,我发现有很多同学对一个基础问题始终是没有彻底搞明白.那就是一台服务器最大究竟能支持多少个网 ...

  4. linux编译lnx文件命令_(完整word版)Linux常用命令手册大全,推荐文档

    NO 分类 PS 1 命令名 用法及参数 功能注解 对应章节 1 文件管理 # ls ls -a 列出当前目录下的所有文件,包括以 . 头的隐含文件 文件管理 # ls ls -l 或 ll 列出当前 ...

  5. linux执行多个命令_您必须知道的前50多个Linux命令

    linux执行多个命令 Using Linux command on a regular basis? Today we'll look at 50+ Linux commands you must ...

  6. windows命令行下访问linux,Windows支持直接访问Linux子系统文件:你的下一台Linux何必是Linux...

    原标题:Windows支持直接访问Linux子系统文件:你的下一台Linux何必是Linux 晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 微软,致力于做最好的Linux发行版. 今天, ...

  7. linux清除网络缓存命令,如何清空linux的DNS缓存

    一.Linux下清空DNS缓存 Linux下DNS缓存实现通常有两种方式: 一种是用DNS缓存程序NSCD(name service cache daemon)负责管理DNS缓存. 一种实现DNS缓存 ...

  8. linux中清理缓存命令,linux清理缓存的命令

    查看缓存的命令 free -m 清理缓存的命令 echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches ec ...

  9. sudo dpkg 找不到命令_【干货】Linux中实用但很小众的11个炫酷终端命令

    关注我,你的眼睛会怀孕 今天给大家分享Linux总结出来的11个炫酷的Linux终端命令大全,通过今天这篇文章将向大家展示一系列的Linux命令.工具和技巧,我希望一开始就有人告诉我这些,而不是曾在我 ...

最新文章

  1. AI 产品经理:别让你的智能对话产品变“智障”
  2. jQuery 源码分析第一篇之入口源码
  3. 详解英伟达三大专业视觉解决方案,覆盖数据中心和边缘计算
  4. android重启应用
  5. CardView的那点事儿
  6. 内存映射MMAP和DMA【转】
  7. sqlite数据库备份还原、导出导入
  8. c# 获取路径的盘符_c#获取驱动器盘符
  9. 快速上手Google C++ 测试框架googletest
  10. (2)网络基础之IP
  11. Linux下安装whl文件
  12. DivCss 布局应用案例实践总结
  13. 爆品思维——TRIZ创新方法在工作中的运用--张维明老师--沪师刘建
  14. 红外热成像技术的应用与发展
  15. STM32F103_study43_The punctual atoms(STM32 Echo experiment based on serial communication )
  16. UniDAC 基础 英文 原文【就不传其中的图片了】
  17. Java读写txt文件案例-统计学生名单
  18. C# 以MP3的格式将录制的音频数据写入文件流
  19. 【翻译】Dremel: Interactive Analysis of WebScale Datasets
  20. 找不到bridge.dll文件

热门文章

  1. .vue的文件在vscode里面是白色?
  2. redmine 自己定义字段mysql表结构
  3. 对于employees表中,给出奇数行的first_name
  4. 单调栈 BZOJ2364 城市美化
  5. 2Sigma OA prepare: Friends Circle
  6. c语言,指针与数组--指针与二维数组2
  7. 看懂别人的代码,和自己能写代码是两回事
  8. spring学习笔记(六)
  9. [转载] python日期时间使用详解和定时器使用讲解
  10. [转载] 6.3 cmath--数学函数