“ab”程序在收到大量请求后冻结,为什么?

2023-12-25

每当我使用“ab”对 Web 服务器进行基准测试时,它会在发送大量请求后冻结一段时间,直到 20 秒左右后才会继续。

考虑以下用 Ruby 编写的 HTTP 服务器模拟器:

require 'socket'

RESPONSE = "HTTP/1.1 200 OK\r\n" +
           "Connection: close\r\n" +
           "\r\n" +
           "\r\n"

buffer = ""
server = TCPServer.new("127.0.0.1", 3000)  # Create TCP server at port 3000.
server.listen(1024)                        # Set backlog to 1024.
while true
    client = server.accept             # Accept new client.
    client.write(RESPONSE)             # Write a stock "HTTP" response.
    client.close_write                 # Shutdown write part of the socket.
    client.read(nil, buffer)           # Read all data from the socket.  
    client.close                       # Close it.
end

然后我按如下方式运行 ab:

ab -n 45000 -c 10 http://127.0.0.1:3000/

在最初的几秒钟内,ab 按预期完成其工作并使用 100% CPU:

Benchmarking 127.0.0.1 (be patient)
Completed 4500 requests
Completed 9000 requests
Completed 13500 requests

大约 13500 个请求后,系统 CPU 使用率降至 0%。 ab 似乎被什么东西冻结了。问题不在服务器上,因为此时服务器正在调用accept()。大约20秒后,ab就像什么都没发生一样继续运行,并且将再次使用100%的CPU,只是在几秒后再次冻结。

我怀疑内核中的某些东西正在限制连接,但是是什么以及为什么?我正在使用 OS X Leopard。我在 Linux 上也看到过类似的行为,尽管冻结发生在大量请求的情况下,而且发生的频率并不高。

这个问题使我无法运行大型 HTTP 基准测试。


听起来你已经用完了临时端口 http://www.ncftp.com/ncftpd/doc/misc/ephemeral_ports.html。要检查,请使用netstat http://developer.apple.com/documentation/Darwin/Reference/ManPages/man1/netstat.1.html命令并查找数千个端口TIME_WAIT http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html#ss2.7 state.

在 Mac OS X 上,默认临时端口范围是 49152 到 65535,总共 16384 个端口。您可以使用以下命令检查这一点sysctl http://developer.apple.com/documentation/Darwin/Reference/ManPages/man8/sysctl.8.html命令:



$ sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last
net.inet.ip.portrange.first: 49152
net.inet.ip.portrange.last: 65535
  

一旦用完临时端口,您通常需要等到TIME_WAIT状态将过期(2 * 最大段生命周期),直到您可以重用特定端口号。您可以通过将范围更改为从 32768 开始(Linux 和 Solaris 上的默认值)来将端口数量加倍。 (最大端口号为 65535,因此您无法增加高端端口号。)



$ sudo sysctl -w net.inet.ip.portrange.first=32768
net.inet.ip.portrange.first: 49152 -> 32768
  

请注意,IANA 指定的官方范围 http://www.iana.org/assignments/port-numbers是 49152 到 65535,某些防火墙可能会假定动态分配的端口属于该范围。您可能需要重新配置防火墙才能使用本地网络之外的更大范围。

还可以减少最大段寿命(sysctl net.inet.tcp.msl在 Mac OS X 上),它控制TIME_WAIT状态,但这很危险,因为它可能会导致旧连接与使用相同端口号的新连接混淆。还有一些技巧涉及使用以下命令绑定到特定端口SO_REUSEADDR选项,或以SO_LINGER选项,但这些也可能导致新旧连接混淆,因此通常被认为是坏主意。

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

“ab”程序在收到大量请求后冻结,为什么? 的相关文章

  • Xamarin:“框架不在模块中”- VS 2013&2015

    我对 XAMARIN 支持感到非常失望 那么 我将从头开始 过去几个月一切都很好 直到我更新了 xamarin 的最新版本 4 0 3 214 结果是我现在无法调试 我收到以下消息 框架不在模块中 我向 Xamarin 支持发送了一封电子邮
  • 内存转储格式类似于 gdb 中的 xxd

    我正在尝试检查一个缓冲区 其中包含二进制格式的消息 但也包含字符串数据 作为示例 我正在使用以下 C 代码 int main void char buf 100 x01 x02 x03 x04String Data xAA xBB xCC
  • java BufferedReader 特定长度返回NUL字符

    我有一个 TCP 套接字客户端从服务器接收消息 数据 消息的类型为长度 2 个字节 数据 长度字节 由 STX 和 ETX 字符分隔 我使用 bufferedReader 检索前两个字节 解码长度 然后再次从同一个 bufferedRead
  • 处理rails应用程序中的rack_throttle异常

    当超出速率限制时 如何处理由rack throttle gem 生成的错误 现在我只收到包含以下内容的回复 Internal Server Error undefined method each for 403 Forbidden Rate
  • 在pycharm中调试python代码

    这个问题类似于this https stackoverflow com questions 10240018 how to use pycharm to debug python script一 我正在尝试调试pyethapp https
  • 使用 GDB 远程调试 MPI

    我正在尝试从 pi 的远程访问组中调试我使用 MPI 编写的代码 我无法直接访问 Pi 以便能够使用 GUI 来调试代码 我已经尝试过使用屏幕显示的内容question https stackoverflow com questions 3
  • 它们是“相同的”吗?代码大战

    这是完整的问题描述 给定两个数组 a 和 b 编写一个函数 comp a b Clojure 中的 compSame a b 来检查这两个数组是否具有 相同 元素以及相同的重数 这里 相同 意味着 b 中的元素是 a 平方中的元素 无论顺序
  • Git在Windows中的克隆比在Linux中慢得多

    我一直在追寻 Windows 上 github 克隆速度极慢的问题 Linux kali 没有这个问题 我的下行连接速度为 100 40 megabit s 我可以获得接近 8mb s 的下载速度 没有问题 我已将电脑直接插入互联网插座 无
  • 调试客户端时使用 Chrome/Firefox

    我正在使用带有 getUserMedia 的相机 但出现了一些需要修复的错误 问题是 Visual Studio 只允许我使用 IE 调试 JavaScript 我的意思是命中断点 而 IE 不支持 getUserMedia 如果您想在 I
  • Docker 容器是否有自己的 TCP/IP 堆栈?

    我试图了解来自连接到主机的线路并定向到 Docker 容器内的应用程序的网络数据包在幕后发生了什么 如果它是一个经典的 VM 我知道到达主机的数据包将由虚拟机管理程序 例如 VMware VBox 等 传输到 VM 的虚拟 NIC 并从那里
  • 如何在节点soap中查看请求和响应数据?

    我正在尝试使用肥皂API节点肥皂 https github com vpulim node soap 我的响应无法解析 我想知道如何查看控制台的请求和响应数据以简化错误查找过程 由于 Node Soap 使用请求库 因此可以通过以下方式对其
  • 什么会导致“IO错误java.net.SocketException:选择失败”?

    我的笔记本电脑上运行一个服务器程序 相同的路由器和相同的代码 它工作正常 客户端可以连接 然而 当我将工作区复制到我的电脑并运行它时 我得到了这样的废话 IO错误java net SocketException 选择失败 这是代码 publ
  • 有没有办法在调试 JavaScript 时更改变量值?

    我在这段代码上有一个断点 使用 Firebug if validator formValidate dom forumid 我怎样才能跳过这个验证部分并进入if条款即使我的dom forumid无效 即调用formValidate 回报fa
  • IRC 机器人:错误 - 注册超时

    我正在用 C 语言制作一个简单的 IRC 机器人 我终于让机器人连接并接收信息 我的代码也应该发送 但服务器表现得好像没有发送任何内容 当机器人连接时 我收到以下信息 收到 roc esper net 通知授权 查找您的主机名 收到 roc
  • 以 C 语言编程设置 MTU

    客户端请求 MTU 限制为 1492 有没有办法在源代码 C 程序 中做到这一点 一般情况下还有其他方法吗 如果配置 为什么有人需要将 MTU 修改到一定的限制 有什么好处 而最 重要提示 更改 MTU 是否存在破解代码的风险 使用C编程方
  • 调试 xslt 的工具

    我有一个 Java servlet 它生成 XML 使用 XSLT 样式表对其进行翻译 然后显示生成的 HTML 这是我第一次使用 XSLT 调试 XSLT 的好方法是什么 我也有 或可以获得 一些示例 XML 文件来应用转换 但我什至不确
  • 在 win32/cygwin 上编译 haskell 模块网络

    我正在尝试编译 Network HTTP http hackage haskell org package network http hackage haskell org package network 在 win32 cygwin 上
  • socketcan如何处理仲裁?

    我非常了解 CAN 协议的工作原理 当两个节点尝试同时使用网络时 较低 id 的 CAN 帧会获得优先级 而另一个节点会检测到这一点并停止 当使用 socketcan 时 这似乎被抽象化了 我们只需像任何文件描述符一样写入和读取 我可能误解
  • WCF:如何诊断故障通道?

    我正在为我的实验室进行一项更改 希望能够帮助诊断我们所看到的一些奇怪的通道故障现象 有一个测试应用程序使用 DuplexChannelFactory 连接到几个 Windows 服务 并且由于某种原因 该测试应用程序上的通道似乎出现了很多故
  • Visual Studio 2013 调试器显示 std::string 的奇怪值

    我有一个大型的 cmake 生成的解决方案 其中包含许多项目 由于某种原因 我无法查看字符串的内容 因为根据调试器 Bx Buf含有一些垃圾 text c str 正确返回 Hello 该问题不仅仅发生在本地字符串上 返回的函数std st

随机推荐

  • Git 子模块 — 排除特定文件/目录

    我正在尝试使用 Git 的 子模块 功能在项目中包含第 3 方代码 我只需要子模块中的几个文件 并希望排除它附带的所有文档等 我怎样才能做到这一点 在我的子模块中我有一个 examples我想删除的文件夹locally防止自动生成的 mak
  • Polymer 1.0:如何将参数从属性传递给 Polymer 函数?

    有没有办法将参数从 Polymer 函数内部的元素属性传递给 Polymer 函数
  • 如何使用nodejs动态创建Mongodb模式

    我想知道是否可以使用 Mongoose 模式 Node js 和 Angular 在 mongodb 中动态创建表 创建模式的基本方法是在 Node js 中显式创建模型 如下所示 import mongoose from mongoose
  • 在TFS中使用Tortoise SVN diff

    我想将 Tortoise SVN diff 实用程序与 TFS 一起使用 我知道如何在 TFS 中配置用户工具 我需要的是 Tortoise SVN diff 实用程序的安装程序 我想我需要安装完整的 Tortoise SVN 才能获取 S
  • 将数据源动态绑定到应用程序制造商弹出窗口

    我需要有一个通用的 删除确认 弹出窗口 并使用弹出窗口出现之前触发的事件将数据源动态绑定到弹出窗口 单击 位置 页面上的删除图标时 将出现弹出窗口 截图如下 我需要同时设置弹出窗口的数据源 当用户单击此删除图标时 并且当用户单击弹出窗口上的
  • Rcmd 检查:“:::”调用导入的未导出对象

    这个问题与Rcmd check在 R Devel 3 1 0 中 我正在维护一个包 称之为 A 它 依赖于 另一个包 让我称之为第二个包 B 出于以下原因 我使用 依赖 而不是 导入 大多数使用 A 包的人也使用 B 包 包 A 广泛使用包
  • WebRTC 无法在 iOS Safari 上的 Angular 5 中工作

    我正在使用 WebRTC 构建一个应用程序 但它无法在 iOS Safari 上的 Angular 5 中运行 我使用原生 WebRTC API 没有框架 首先没有 Angular 为了证明我的观点 Angular 是问题所在 我使用纯 h
  • 空接口允许任何对象吗?

    为什么空接口不要求对象为空 interface A const a A a 1 console log a 是有效的代码并将输出 a 1 我认为添加可选属性应该可以正常工作 但是 interface A interface B extend
  • R 2.XX.Y 中的核心包

    我想知道如何知道哪些包是核心的R 2 XX Y 假设我安装了 R 2 14 1那么这个版本会附带哪些软件包 谢谢 1 您可以查看来源 2 问题甚至不清楚included也受到推崇的图书馆 大多数人会理解你的问题是要求两组 3 在 Debia
  • 如何获取 Emacs lisp 非交互式函数的列表?

    如何获取可在 Emacs Lisp 中使用的非交互式函数的完整列表 交互式功能很容易在帮助系统中找到 但我想要我可以使用的所有其他功能的完整列表 例如concat car cdr等等 最好有文档 Thanks Ed 编辑 感谢 Jouni
  • .net 中的事件签名模式

    net 中事件委托的标准模式有什么意义 IE EventHandler 预定义委托 为什么不直接选择最适合需求的签名呢 编辑 此外 是否有必要在所有情况下都盲目追随微软的榜样 在 C 1 0 中 该约定没有多大意义 在 C 2 0 中 存在
  • 如何在 Google Colab 中交互式绘制 matplotlib 绘图?

    我正在使用 Python 和 matplotlib 并尝试在 Google Colab 中创建交互式绘图 我可以制作情节 但它是静态的 我当前的代码如下 matplotlib notebook config InlineBackend fi
  • 如何将输入文本字段内的一些文本设置为粗体?

    我正在尝试在输入文本字段内获取粗体特定文本 我不知道如何去做 因为 html 代码不会在文本字段内解释 所以类似 b 行不通的 是否可以仅将某些文本加粗 像bold 这样的方法只添加 b 围绕字符串 Thanks 这是一个技巧 INPUT
  • 检查超时是否已清除?

    我想知道是否有办法判断是否仍然设置了超时 var t setTimeout alertMsg 3000 我认为当你清除它时 t 会像未定义一样 但似乎有一些 id 没有被清除 不是直接的 但您可以创建一个包装对象来提供该功能 一个粗略的实现
  • 需要帮助在命令按钮中显示图标图像

    只是基本需求 但无法使其发挥作用 我想要一个 primefaces 按钮来显示我的图像 而不需要任何文本 但我得到的是一个只包含一个按钮 字符并且不显示图像 图像大小仅为 16x16 所以 这是 primefaces 按钮
  • 实现 i18n 使用 java 的最佳实践是什么? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 使用 java 实现 i18n 的最
  • 通过java代码配置Spring Security的自定义403错误页面

    有人知道如何在 Spring Security 中配置自定义 403 页面吗 在网上查看 我得到的所有结果都是使用 XML 配置 而我使用的是 Java 配置 这是我的安全配置 Configuration ComponentScan val
  • QTreeWidgetItem 内的 QComboBox

    有没有类似于 PyQT 的东西QTreeWidgetItem setCheckState 0 Qt Checked 但对于组合框呢 我在参考中看不到任何内容 那么如何插入自定义 QComboBox 作为 QTreeWidgetItem 中的
  • Linux - Yum 安装 GCC - 缺少内核头文件

    当我尝试在我的 linux centos 上安装 GCC 时 它会丢失 更新中的 glibc headers 2 5 58 el5 6 4 x86 64 有 depsolving 问题 gt 缺少依赖项 包 glibc headers 2
  • “ab”程序在收到大量请求后冻结,为什么?

    每当我使用 ab 对 Web 服务器进行基准测试时 它会在发送大量请求后冻结一段时间 直到 20 秒左右后才会继续 考虑以下用 Ruby 编写的 HTTP 服务器模拟器 require socket RESPONSE HTTP 1 1 20