Node.js SSL 服务器冻结,CPU 高,未崩溃但无连接

2023-12-30

我希望任何人都可以帮助我解决这个问题。

在我们公司,我们正在设置一个连接到 Java Push 服务器的 Node.js 服务器。

我使用 https 模块而不是 http 和 SLL 证书。

节点和客户端之间的连接是通过socket.io在服务器和客户端中建立的。

同时,node.js 服务器是 java 服务器的客户端,此连接是通过常规套接字(net.connect)建立的。

这个想法是,用户连接到服务器,加入一些频道,当一些数据从java服务器到达时,这些数据被分派给相应的用户。

一切似乎都工作正常,但过了一段时间,随机地,有 450 到 700 个用户之间,服务器的 CPU 达到 100%,所有连接都断开,但服务器并没有崩溃。问题是,如果你在浏览器中访问 https://...,你不会得到 404 或类似的东西,而是 SSL 连接错误,而且速度非常快。

我尝试在各处添加日志,但没有类似模式的东西,它就像随机的。

如果有人遇到同样的问题或者可以给我带来线索,或者更好地调试的技巧,我将不胜感激。

多谢。


好的,问题解决了。这是每个Linux服务器都会出现的问题。因此,如果您正在使用其中之一,则需要阅读本文。

原因是 Linux 服务器每个进程拥有的文件的默认限制。

似乎单个 Linux 服务器都有每个进程打开 1024 个文件的限制,您可以通过以下方式检查您的限制:

# ulimit -n

增加这个数字

# ulimit -n 5000 (for example)

每个套接字都会创建一个新的虚拟文件。

由于某种原因,我的服务器没有显示任何错误,服务器只是被冻结,停止日志并且没有任何信号或证据。当我在另一台机器上设置服务器的副本时,它开始发送

warn: error raised: Error: accept EMFILE
warn: error raised: Error: accept EMFILE
warn: error raised: Error: accept EMFILE
...

请小心,因为如果您不是 root,您只会为当前会话更改此设置,而不是永久更改。

技巧:如果您想计算文件数量,在本例中是节点进程打开的文件数量,请记下您的进程 ID 并调用此命令。

# ls -l /proc/XXXXX/fd | wc -l

其中 XXXXX 是进程 ID。这将帮助您知道这是否是您的问题,一旦您启动节点服务器,您可以使用此命令来检查它是否达到顶部,并且在冻结后停止增长。 (默认为 1024 或“ulimit -n”)。

如果您只想检查进程打开了哪些文件:

# ls -l /proc/XXXXX/fd

希望这可以帮到你。无论如何,如果你正在设置一个 Node js 服务器,我很确定你想要这样做以确保它不会融化。

最后,如果您在未来没有日志的错误中需要帮助,您可以尝试straceing or dtruss加工过程

# strace -p <process-id> 

应该做这项工作。

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

Node.js SSL 服务器冻结,CPU 高,未崩溃但无连接 的相关文章

随机推荐

  • SpecFlow:ClassInitialize 和 TestContext

    首先 我是 SpecFlow 的新手 我有一个功能文件 我已经 想要使用 MSTest 自动运行它作为功能测试 涉及完全设置的服务器 数据访问 为此 我必须使用 SpecFlow 的 Given 块中的数据配置服务器 然后启动它 我还必须将
  • 是否可以强制 Hibernate 嵌入实体?

    在我的用例中 我想 Embedded一类C在一个实体中 另一个实体指的是C with OneToMany协会 因此C注释为 Entity 我知道这似乎是糟糕的设计 但我相信这对我的情况来说非常有意义 是否可以强制 Hibernate 嵌入实
  • Jest 测试中的“requestAnimationFrame”polyfill 错误

    升级到 React 后运行 Jest 单元测试时出现此错误 React depends on requestAnimationFrame Make sure that you load a polyfill in older browser
  • 从中心和半径创建 SqlGeography 多边形圆

    我想使用 C 在 sql server 2008 地理字段中保存一个圆圈 在 C 中 我有纬度 经度和半径 但我找不到一种方法来计算代表圆的多边形并创建一个SqlGeography从中 我尝试使用以下函数来创建多边形 private Lis
  • 使用数据收集器 UDC 的替代品?

    由于 UDC 是不再支持 http wiki eclipse org UDC或者 Eclipse 的一部分 我想知道是否有替代品 我想获得有关我们的用户组如何实际使用 Eclipse 的更多信息 以便积极主动地尝试改善他们的环境 我想收集的
  • 使用小米5 MIUI 8 Android Studio进行调试

    我无法从 Android Studio 启动应用程序 当我单击 运行 时 我选择我的设备 并且出现以下消息 但事实并非如此 该应用程序未安装在设备中 在 运行 控制台中 出现以下内容 04 22 15 53 08 Launching app
  • WScript.Shell Exec 的实时控制台输出

    我花了一天的大部分时间寻找解决方案 我开始认为这可能无法满足我的要求 我的基本设置是运行从 Excel VBA 代码调用的 vbscript vbs vba 代码必须继续运行并保持 vbscript 运行 但会不时使用以下命令对其进行监视E
  • 每次进行更改时回收应用程序池

    我制作了一个多语言网站 其中在同一网站上包含 4 个域 因此也包含 4 种不同的语言和网站树 但是 每次我需要发布对网站的新更改或其他更改 例如更新模板 脚本等 时 我都必须回收应用程序池 以使更改在以访问者身份查看网站时显示 我该如何解决
  • 如何在 athena 上的字符串数据类型上提取月份名称

    SELECT sales invoice date MONTH DATE TRUNC month CASE WHEN TRIM sales invoice date THEN DATE 1999 12 31 ELSE DATE PARSE
  • 复制表更改 1 列的值并将其插入到同一个表中

    标题基本上概括了所有内容 以及我在这里想要完成的任务 更多信息 我得到了一个有 4 列的表格 我需要它的精确副本 但只需要更改一列的值 假设该列名为客户编号 即 123456 其他值并不重要 如何复制整个表并将客户编号更改为 123457
  • TPL 数据流:将传入集合展平为顺序项目

    我正在使用 TPL 数据流构建一个应用程序 实际上我有以下问题 我有一个变换块var tfb1 new TranformBlock
  • 在 Scala 中扫描巨大的 JSON 文件以获取可反序列化的数据

    我需要能够处理大型 JSON 文件 在文件中迭代 流式传输时从可反序列化的子字符串实例化对象 例如 我没有使用 JSON 完成此操作 我希望有人能为您提供交钥匙解决方案 而是使用 XML 完成此操作 这里是一种处理方法 它基本上是一个借助流
  • 我可以重新解释 constexpr 函数的参数吗?

    我想编写一个在编译时求值的函数 它需要一个指向 4 字节数组的指针 并输出一个与该数组具有相同位模式的 int 所以我想出了 constexpr int f const char p return reinterpret cast
  • 在java中计算日期/时间差[重复]

    这个问题在这里已经有答案了 我想要计算2个日期之间的差异以小时 分钟 秒为单位 我的代码有一个小问题 String dateStart 11 03 14 09 29 58 String dateStop 11 03 14 09 33 43
  • 如何显示来自 PHP 的 JavaScript 警报?

    我不用 PHP 编写代码 但我有一个从网上下载的表单 它工作得很好 我想做的是在这里添加一些代码 可以启动 JS 脚本 简单的警报框 说 谢谢您的表单已提交 此 mailer php 文件收到表单后
  • 循环位 C

    我试图循环遍历 unsigned char 的位 但我不确定从哪里开始 最终 我将对这些位执行其他按位操作 例如 和 xor 等 可以通过多种方式循环位 当您移动值时 您可以执行破坏性循环 并测试初始位或最终位 具体取决于您想要枚举位的顺序
  • Airflow - 无法在 Kubernetes Pod Operator 任务中对资源使用 jinja 模板

    Airflow 无法在 Kubernetes Pod Operator 任务中对资源使用 jinja 模板 能够使用 jinja 模板作为环境变量 镜像 但无法使用资源来指定 CPU 和内存 请求和限制 For apache airflow
  • 从 shell 脚本 cron 调用 python 脚本

    我有一个 shell 脚本 cron 它从同一目录调用 python 脚本 但是当这个 cron 执行时 我没有从 python 脚本中获得预期的输出 当我手动执行它时 我的 python 脚本的输出是预期的 我提供了 python 脚本路
  • 有更好的普通 JS 方法来查找嵌套对象中的任何错误值吗?

    如果我有一个对象 例如 const obj field1 subfield1 true subfield2 true field2 subfield3 true field3 subfield4 false subfield5 true 然
  • Node.js SSL 服务器冻结,CPU 高,未崩溃但无连接

    我希望任何人都可以帮助我解决这个问题 在我们公司 我们正在设置一个连接到 Java Push 服务器的 Node js 服务器 我使用 https 模块而不是 http 和 SLL 证书 节点和客户端之间的连接是通过socket io在服务