增加 Linux 中 TCP/IP 连接的最大数量

2024-02-03

我正在对服务器进行编程,似乎我的连接数量受到限制,因为即使我将连接数量设置为“无限”,我的带宽也没有饱和。

如何增加或消除 Ubuntu Linux 机器一次可以打开的最大连接数?操作系统是否限制了这一点,或者是路由器或ISP?或者是别的什么?


最大连接数受到客户端和服务器端某些限制的影响,尽管略有不同。

在客户端:增加临时端口范围,并减少tcp_fin_timeout

要找出默认值:

sysctl net.ipv4.ip_local_port_range
sysctl net.ipv4.tcp_fin_timeout

临时端口范围定义主机可以从特定 IP 创建的出站套接字的最大数量。地址。这fin_timeout定义这些套接字停留的最短时间TIME_WAIT状态(使用一次后无法使用)。 通常的系统默认值是:

  • net.ipv4.ip_local_port_range = 32768 61000
  • net.ipv4.tcp_fin_timeout = 60

这基本上意味着您的系统无法始终保证超过(61000 - 32768) / 60 = 470每秒套接字数。如果您对此不满意,可以从增加port_range。将范围设置为15000 61000如今这很常见。您可以通过减少fin_timeout。假设您同时执行这两项操作,您应该会更容易地看到每秒超过 1500 个出站连接。

更改值:

sysctl net.ipv4.ip_local_port_range="15000 61000"
sysctl net.ipv4.tcp_fin_timeout=30

上述内容不应被解释为影响系统每秒进行出站连接的能力的因素。相反,这些因素会影响系统在长时间“活动”中以可持续的方式处理并发连接的能力。

典型 Linux 机器上的默认 Sysctl 值tcp_tw_recycle & tcp_tw_reuse将会

net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_tw_reuse=0

这些不允许来自“已使用”套接字(处于等待状态)的连接,并强制套接字持续完整的时间。time_wait循环。我建议设置:

sysctl net.ipv4.tcp_tw_recycle=1
sysctl net.ipv4.tcp_tw_reuse=1 

这允许套接字的快速循环time_wait状态并重新使用它们。但在进行此更改之前,请确保这不会与需要这些套接字的应用程序使用的协议冲突。请务必阅读帖子Vincent Bernat 的“应对 TCP TIME-WAIT” https://vincent.bernat.ch/en/blog/2014-tcp-time-wait-state-linux了解其中的含义。这net.ipv4.tcp_tw_recycle 该选项对于面向公众的服务器来说是相当有问题的,因为它无法处理来自同一 NAT 设备后面的两台不同计算机的连接,这是一个很难发现并等着咬你的问题。注意net.ipv4.tcp_tw_recycle已经removed https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4396e46187ca5070219b81773c4e65088dac50cc从Linux4.12开始。

在服务器端: The net.core.somaxconn价值有着重要的作用。它限制排队到侦听套接字的最大请求数。如果您确定服务器应用程序的功能,请将其从默认的 128 提高到 128 到 1024 之类的值。现在,您可以通过将应用程序的监听调用中的监听积压变量修改为相等或更大的整数来利用这一增加。

sysctl net.core.somaxconn=1024

txqueuelen以太网卡的参数也可以发挥作用。默认值为 1000,因此如果您的系统可以处理,请将它们提高到 5000 甚至更多。

ifconfig eth0 txqueuelen 5000
echo "/sbin/ifconfig eth0 txqueuelen 5000" >> /etc/rc.local

同样增加以下值net.core.netdev_max_backlog and net.ipv4.tcp_max_syn_backlog。它们的默认值分别是 1000 和 1024。

sysctl net.core.netdev_max_backlog=2000
sysctl net.ipv4.tcp_max_syn_backlog=2048

现在请记住通过在 shell 中增加 FD ulimts 来启动客户端和服务器端应用程序。

除了上述之外,程序员使用的一种更流行的技术是减少TCP写来电。我自己的偏好是使用缓冲区,其中我将希望发送到客户端的数据推送到客户端,然后在适当的时候将缓冲的数据写到实际的套接字中。这项技术允许我使用大数据包、减少碎片、降低用户态和内核级的 CPU 利用率。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

增加 Linux 中 TCP/IP 连接的最大数量 的相关文章

  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟
  • 如何根据 HTTP 请求使用 Python 和 Flask 执行 shell 命令并流输出?

    下列的这个帖子 https stackoverflow com questions 15092961 how to continuously display python output in a webpage 我能够tail f网页的日志
  • 树莓派的设备树驱动内核

    我想用设备树驱动的 Linux 内核启动树莓派 有什么特别的事情要做吗 谁能指出为树莓派设置基于设备树的内核启动需要什么 我可能需要有树莓派内核源代码 其中设备驱动程序应与设备树兼容 如果是这样 我在哪里可以找到 Raspberry Pi
  • 无法从 jenkins 作为后台进程运行 nohup 命令

    更新 根据下面的讨论 我编辑了我的答案以获得更准确的描述 我正在尝试从詹金斯运行 nohup 命令 完整的命令是 nohup java jar home jar server process 0 35 jar prod gt gt var
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • 为什么 h_addr_list (在 hostent 结构中)类型为 char** 而不是 void*?

    我试图找出一段构建 hostent 对象的代码 更具体地说 它的工作部分是填充 h addr list 数组 我对分配到数组中的值被强制转换为这一事实感到困惑char 据我所知 这个数组与字符串无关 我注意到h addr list数组实际上
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 尝试安装 LESS 时出现“请尝试以 root/管理员身份再次运行此命令”错误

    我正在尝试在我的计算机上安装 LESS 并且已经安装了节点 但是 当我输入 node install g less 时 出现以下错误 并且不知道该怎么办 FPaulMAC bin paul npm install g less npm ER
  • Pyaudio 安装错误 - “命令‘gcc’失败,退出状态 1”

    我正在运行 Ubuntu 11 04 Python 2 7 1 并想安装 Pyaudio 于是我跑了 sudo easy install pyaudio 在终端中 进程退出并显示以下错误消息 Searching for pyaudio Re
  • 如何在Linux内核源代码中打印IP地址或MAC地址

    我必须通过修改 Linux 内核源代码来稍微改变 TCP 拥塞控制算法 但为了检查结果是否正确 我需要记录 MAC 或 IP 地址信息 我使用 PRINTK 函数来打印内核消息 但我感觉很难打印出主机的MAC IP地址 printk pM
  • PHP 从命令行启动 gui 程序,但 apache 不启动

    首先 我阅读了有类似问题的人的一些帖子 但所有答案都没有超出导出 DISPLAY 0 0 和 xauth cookies 这是我的问题 提前感谢您的宝贵时间 我开发了一个小库 它使用 OpenGL 和 GLSL 渲染货架 过去几天我将它包装
  • CentOS:无法安装 Chromium 浏览器

    我正在尝试在 centOS 6 i 中安装 chromium 以 root 用户身份运行以下命令 cd etc yum repos d wget http repos fedorapeople org repos spot chromium
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M

随机推荐

  • 重写onDraw()还是draw()?

    我的项目基于 SurfaceView 到目前为止 我已经在 onDraw 中进行了所有渲染 我正在覆盖它 一切似乎都很好 然而 我刚刚更新了我的 SDK 现在它给我一个错误告诉我 可疑的方法调用 可能应该调用 draw 而不是 onDraw
  • JQuery UI:如何使用其命名空间调用小部件函数

    我创建了两个具有相同名称但具有不同命名空间的自定义 JQuery UI 小部件 如下所示 第一个小部件 widget finance dialog this was created in the file jquery finance di
  • webpack 引用不带变量的类型

    running yarn run webpack dev 没问题 但是 yarn run webpack prod 产生这个错误 ERROR in Illegal State referring to a type without a va
  • OpenCV 将 Mat 保存为二进制(1 位深度)TIFF

    假设我们有一个Mat应用OpenCv后Imgproc adaptiveThreshold Mat srcImage Mat binaryImage new Mat Imgproc adaptiveThreshold srcImage bin
  • 将 JSON 转换为 .csv

    我发现有人正在将一些数据下载到 JSON 文件中 我想 我是新手 该文件包含近 600 名足球运动员的数据 这是文件 https raw githubusercontent com llimllib fantasypl stats f944
  • 如何获取当前键盘布局的代码页?

    我的非 Unicode 应用程序需要能够处理 Unicode 键盘输入 WM CHAR 等 从而接收 8 位字符代码 然后在内部将其转换为 Unicode 需要 9x 兼容性 因此不能选择使用大多数 Unicode API 目前 它查看 P
  • iOS FFT 绘制频谱

    我读过这些问题 使用 Apple FFT 和加速框架 https stackoverflow com questions 3398753 using the apple fft and accelerate framework 使用 Acc
  • 选择 Firefox 附加目录中的文件

    为了简单起见 我将基于 XUL 的 Firefox 插件转换为基于 SDK 的版本 我在基于 XUL 的版本中使用的 XPCOM 模块似乎可以工作 但 ci nsIFile 的行为不同 我不知道如何导航到当前位于目录最高层的 smartPr
  • ASP.NET MVC MultiSelectList 的选定值未正确选择

    我知道其他人也问过这个问题 但我对此完全困惑 这将显示未选择任何值的下拉列表 这将显示下拉列表 其中包含我在 Model items 中传递的值 这些值已正确选择 就像我所期望的那样
  • 使用 gdb 调试 C++11 右值引用

    我刚刚注意到我无法调试rvalue参考文献与gdb 7 7 1适当地 void simple int i 当我输入这个简约函数时 我无法获得任何有意义的信息i It s type and value are unknown to gdb s
  • 当我实现自定义 Lint 检测器时如何调试 java 源代码?

    我是一名 Android 开发者 我已经通过实现新的 XXXDetector 和 XXXIssueRegistry 设计了自己的 lint 规则 这是我的源代码片段 我的 XXXIssueRegistry 文件 public class M
  • 关闭 Windows 8 超级按钮栏

    我有一台 Surface Pro 我需要将其 锁定 为一种 Kiosk 模式 我知道 信息亭模式 的更新正在进行中 但是我需要在此之前执行此操作 我在互联网上进行了搜索 但似乎您无法通过滑动来禁用超级按钮栏screen 我找到了禁用触控板的
  • C 静态库的包装

    我有一个用于相机的 C 静态库 现在计划为 Windows 8 开发 C WPF UI 它将使用 C 静态库来捕获视频 音频 我的想法是 C Static 会有 C CLI 包装器 包装器将是托管 Dll C WPF UI 将使用此 Dll
  • 在克隆期间更改内部元素 id

    我正在单击按钮时克隆 DIV 元素 我可以更改正在克隆的 DIV 元素的 ID 值 但是是否可以更改内部元素的 id 在下面的代码中 我更改了 Id selection克隆时 我需要动态更改 id select div div class
  • 使用 Spring RestTemplate 访问 Https Rest 服务

    谁能给我提供一个代码示例来使用 Spring Rest 模板访问通过 HTTPS 保护的其余服务 URL 我有证书 用户名和密码 基本身份验证用于服务器端 我想创建一个可以使用提供的证书 用户名和密码 如果需要 连接到该服务器的客户端 Ke
  • 头部内有多个 RSS 链接标签,标记是否有效?

    在 RSS feed 中包含多个 RSS feed 是否有效 tag 我的意思是 标签如下 etc 我们有一小部分 总共五个 RSS 提要 我们已经拥有了一段时间 但只在头标签中包含了 主要 提要 可以将它们全部包括在内吗 是的 这是完全有
  • jquery UI - 将日期添加到选定日期

    这看起来很简单 但我无法解决它 我真的需要这个 如何通过 SelectedDate 事件将日期添加到选定日期 我需要对 2 个日期选择器执行日期范围限制 一旦用户设置了一个日期选择器 另一个日期选择器只需要允许日期等于第一个日期选择器的所选
  • WHERE 子句中的动态条件

    我有一个存储过程 想知道是否可以建立一个动态的where基于参数的条件 假设我有这个查询 SELECT FROM tbl Users 现在 我有一个名为 username 我想用它来建立一个动态的where条件 通过我的程序可能是 1 个或
  • 从文件读取/写入 std::unordered_map 的更快方法

    我正在与一些非常大的公司合作std unordered maps 数亿个条目 并且需要将它们保存到文件中或从文件中加载它们 我目前执行此操作的方法是迭代映射并一次读取 写入每个键和值对 std unordered map
  • 增加 Linux 中 TCP/IP 连接的最大数量

    我正在对服务器进行编程 似乎我的连接数量受到限制 因为即使我将连接数量设置为 无限 我的带宽也没有饱和 如何增加或消除 Ubuntu Linux 机器一次可以打开的最大连接数 操作系统是否限制了这一点 或者是路由器或ISP 或者是别的什么