Node 连接到 Postgres 的速度比 .NET Core 快 20 倍

2024-01-11

我有两台服务器连接到PostgresSQL 9.6数据库托管在 Azure 上。服务器正在做一件事 - 使用 a 访问 Postgres 数据库SELECT 1每5秒查询一次。

连接到数据库并获取数据的典型时间:

  • Node: 25 MS
  • .NET Core 3.1 使用 Npsql 4.1.1(我也尝试过 4.1.2,没有差异):500 MS

My problem我的 .NET Core 应用程序是慢 20 倍比Node在获取数据方面。我believe由于某种原因,.NET Core 没有池化连接。在本地运行应用程序和在 Azure 应用服务上运行应用程序时都会出现这种缓慢情况 - 没有区别。我想解决 .NET --> Postgres 缓慢的问题。

请仅浏览相关细节,不要阅读超过此点的全部内容 - 我只相信.NET Core代码是相关的。

A PsPing从我的机器到数据库(在这两个机器上Node.NET Core应用程序正在运行:

Connecting to foobarPostGres:5432 (warmup): from someIp: 19.98ms
Connecting to foobarPostGres:5432: from someIp: 1.65ms
Connecting to foobarPostGres:5432 from someIp: 1.18ms
Connecting to foobarPostGres:5432: from someIp: 1.23ms
Connecting to foobarPostGres:5432: from someIp: 1.06ms

为了完整起见,提供了一个示例NODE时间看起来像这样(注意,第一次建立连接时,它也是“慢”):

Attempting to establish a connection...
Elapsed ms:  644.1334999799728
RESP:  { '?column?': 1 }
Elapsed ms:  22.76109904050827
RESP:  { '?column?': 1 }
Elapsed ms:  21.984400033950806
RESP:  { '?column?': 1 }
Elapsed ms:  26.043799996376038
RESP:  { '?column?': 1 }
Elapsed ms:  22.538798987865448
RESP:  { '?column?': 1 }

连接时间为.NET Core看起来像这样:

5:13:32 PM: SLOW QUERY, CONN TIME: 4153, QUERY TIME: 18 
5:13:53 PM: SLOW QUERY, CONN TIME: 707, QUERY TIME: 17 
5:14:14 PM: SLOW QUERY, CONN TIME: 589, QUERY TIME: 16
5:14:35 PM: SLOW QUERY, CONN TIME: 663, QUERY TIME: 18 
5:14:56 PM: SLOW QUERY, CONN TIME: 705, QUERY TIME: 16 

请注意,初始连接时间超慢,后续请求建立连接的时间也很长。

不管怎样,因为我很绝望,所以我现在要转储我所有的代码,并附上解释。连接字符串如下所示:

public static string CONNECTION_STRING {
  get {
    return $"Server={HOST}; User Id={USER}; Database={DB_NAME}; Port={PORT}; Password={PWD}; SSLMode=Prefer";
  }
}

据我了解,如果我使用此连接字符串,我应该立即使用连接池。请注意,我已经尝试过关闭SSL在数据库上并将该行取出 - 它没有帮助。

我的健康检查控制器如下所示:

// GET api/health/getdbhealthselectone
[HttpGet]
[Route("getdbhealthselectone")]
public async Task<IActionResult> GetDbHealthSelectOne()
{
  int testData = await _healthCheckRepo.RunHealthCheckSelectOne();
  return Ok(testData);
}

我的健康检查回购方法如下所示:

 public async Task<int> RunHealthCheckSelectOne()
    {

      await using var conn = new NpgsqlConnection(AzureDbConnectionInfo.CONNECTION_STRING);

      var connTimer = System.Diagnostics.Stopwatch.StartNew(); // TODO: Remove this testing line
      await conn.OpenAsync();
      connTimer.Stop(); // TODO: Remove this testing line
      var msToConnect = connTimer.ElapsedMilliseconds; // TODO: Remove this testing line

      int testData = 999;
      var jobsQueryTimer = System.Diagnostics.Stopwatch.StartNew(); // TODO: Remove this testing line0
      await using (var cmd = new NpgsqlCommand("SELECT 1", conn))
      await using (var reader = await cmd.ExecuteReaderAsync())
      while (await reader.ReadAsync()) {
        testData = reader.GetInt32(0);
      };

      jobsQueryTimer.Stop(); // TODO: Remove this testing line
      var msToQuery = jobsQueryTimer.ElapsedMilliseconds; // TODO: Remove this testing line

      LogQueryIfSlow(msToConnect, msToQuery, _logger); // TODO: Remove this testing line

      return testData;
    }

注意这里的计时器 -await conn.OpenAsync();到目前为止,这是花费大部分时间的原因,查询本身很快。另外,为了节省时间 - 我已经运行了这段代码而没有async以前,没有区别。

最后,为了防止存在依赖注入问题,存储库位于类库中,API 项目引用它,并且:

services.AddSingleton<IHealthCheckRepository, HealthCheckRepository>();

它是这么看的。

我相信这就是所有相关信息 - 我已经通过电话与 Azure 支持人员联系,他们发现数据库配置没有问题。 .NET Core 应用程序非常轻量,所以它并没有超载,并且正在测试中,所以除了我的测试之外没有流量。

额外:为了完整起见,这是我的整个节点应用程序,它访问数据库并获取发布的性能(取出连接数据)。

const { Pool, Client } = require('pg');
const { performance } = require('perf_hooks');

const pool = new Pool({
  user: 'SECRET',
  host: 'SECRET',
  database: 'SECRET',
  password: 'SECRET',
  port: 5432,
})


function runQuery(pool) {
  var t0 = performance.now();
  pool.query('SELECT 1', (err, res) => {
    if (err) {
      console.log('ERROR: ', err.stack)
    } else {
      console.log('RESP: ', res.rows[0])
    }
    var t1 = performance.now();
    console.log('Elapsed ms: ', t1-t0);
    //pool.end()
});

}

setInterval(() => {runQuery(pool)}, 5000);

编辑:对于后代,以下是修复连接池超时后 .NET Core 中的时间 - 它比节点更快,除了初始连接,这似乎需要一段时间,但我还没有检查一些默认值:

CONN: 1710 QUERY: 18
CONN: 0 QUERY: 16
CONN: 0 QUERY: 16
CONN: 0 QUERY: 17
CONN: 0 QUERY: 16
CONN: 0 QUERY: 23
CONN: 0 QUERY: 16
CONN: 0 QUERY: 16
CONN: 0 QUERY: 23
CONN: 0 QUERY: 16
CONN: 0 QUERY: 16

您需要设置最小池大小。这样做可以确保无论池使用情况如何,此数量的连接都对数据库保持打开状态。

默认情况下(至少对于NPGSQL http://www.npgsql.org/doc/connection-string-parameters.html),最小大小为0,因此如果连接一段时间没有使用,它将被关闭。

在您的测试中,您每 5 秒执行一次调用,这并不算多,并且池可能会决定关闭未使用的连接。根据文档,它应该保持打开状态 300 秒,而不仅仅是 15 秒

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

Node 连接到 Postgres 的速度比 .NET Core 快 20 倍 的相关文章

随机推荐

  • PHP Ratchet:找不到类 Memcache

    我正在关注 Ratchet 的教程 对于SessionProvider页面 代码是这样的
  • Meteor 如何使用多个 .less 文件

    我正在尝试在 Meteor 应用程序中使用两个 less 文件 所有文件都位于单个 Meteor 应用程序文件夹中 我有一个 less 文件 它定义了一般 UI 外观 在 ui less 中 ui gradient topdown from
  • XAMPP - 错误:MySQL 意外关闭

    由于某种原因 我重新安装了 XAMPP 但 MySQL 无法工作 在控制台中出现以下错误 01 56 03 mysql Error MySQL shutdown unexpectedly 01 56 03 mysql This may be
  • 通过 powershell 在 jenkins 中使用 AnsiColor

    关于如何使用 powershell 为 Jenkins 上的输出着色有什么想法吗 我已经在 J enkins 上安装了 AnsiColor 插件 并且已将作业设置为使用 AnsiColor 唯一的问题是如何让我的powershell在Jen
  • 通过 StoredProcedure 每日/每周/每月记录计数搜索

    Using 微软SQL服务器 我做了一个名为SP Get CallsLogged 我有一个名为TRN Call 它有一个名为CallTime这是一个日期时间 我的应用程序中有一个网页 用户在其中输入 开始日期 约会时间 EndDate 约会
  • java 使用线程下载多个文件

    我正在尝试使用线程下载与模式匹配的多个文件 该模式可以匹配 1 5 或 10 个不同大小的文件 为了简单起见 下载文件的实际代码位于 downloadFile 方法中 而 fileNames 是与模式匹配的文件名列表 我如何使用线程来做到这
  • Windows Phone 7 - 加载一个大的 xml 文件

    我正在尝试将 xml 文件加载到我的应用程序中并将其显示在列表框中 问题是该xml文件大约有5MB 在手机上加载大约需要40秒 当手机锁定屏幕并返回时 又需要 40 秒 我尝试使用isolatedstorage来存储数据 但它并没有提高性能
  • 为什么我的静态目录无法与 django 1.3 一起使用?

    这个问题很简单 但我就是想不出来 添加到我的 urlpatterns url r static P
  • 公开 Firebase 存储,以便在 Android 上读写

    我是 firebase 存储的新手 谁能告诉我如何使存储文件公开以供读写 firebase 提供的默认代码如下 我应该做出哪些改变 service firebase storage match b image view b1cf5 apps
  • iOS 8 AutoLayout 滚动视图在 iPhone 6 plus 上水平滚动

    我确实有一个 iOS 应用程序 在调整所有 UI 以自动布局和尺寸类别以支持新的 iPhone 6 和 iPhone 6 plus 时 我遇到了一个奇怪的问题 我的滚动视图在 iPhone 4s 5 5s 中工作正常和 6 在 iPhone
  • Discord 丰富的嵌入按钮

    我制作了一些discord py 机器人 但我遇到了一个令人惊讶的机器人 它被称为 IdleRPG 并使用带有按钮的丰富嵌入消息 这是一张图片 注意菜单底部的按钮 我尝试联系开发商并一直在网上搜索 但似乎找不到他们是如何做到的 有谁知道有关
  • 如何在 bash 中优雅地存储和回显多行? [复制]

    这个问题在这里已经有答案了 我试图将一段文本捕获到一个变量中 并保留换行符 然后回显它 然而 当我捕获文本或显示文本时 换行符似乎没有被维护 关于我如何实现这一目标有什么想法吗 Example bin bash read d my var
  • 即使我注销了,如何才能在后台继续运行unix程序?

    我想在 unix 机器上在后台运行一个带有 while 1 循环的 Perl 脚本 直到我杀死它 这是一台我没有管理权限的远程计算机 因此由于某种原因 我无法使用 Daemon Generic While1 我通过 SSH 登录到它 并且我
  • TypeDoc 抱怨“找不到模块”

    我有一个基于 Typsecript 的反应应用程序 它工作得很好 但我想添加 TypeDoc 想想 Typescript 的 JSDoc 安装后 我从命令行运行它 在测试时仅处理单个文件 typedoc module commonjs js
  • 汇编反转字符串

    读取字符串直到按下 1 并且 1 将位于字符串的最后一个位置 我不知道为什么我的输出关闭 例如输入是 asd1 输出是 1111 无论如何 这是我的代码 data segment msg db 0dh 0ah Your string rev
  • Swift 3 迁移后 UICollectionView 损坏了?

    在我的项目中使用 Swift 3 转换器后 加载 UICollectionViewController 的子类时我不断崩溃 下面是我的代码以及集合视图的相关方法 override func collectionView collection
  • QNetworkAccessManager超时

    目前我正在开发一个从远程服务器发送和接收文件的应用程序 为了进行网络操作 我使用 QNetworkAccessManager 要上传文件 我使用 QNetworkAccessManager put 并下载文件 我使用 QNetworkAcc
  • 在动态加载的内容上使用hammer.js

    我正在使用hammer js 开发一个网络应用程序 我可以让它正常工作 除了使用 ajax 加载的内容 我使用 jquery 的hammer js 特殊事件插件 以下工作正常 menu a on tap function event con
  • NSDatePicker 使用箭头键时行为不当

    我用过NSDatePickers 没有步进器 在列的单元格中NSTableView 日期选择器用于设置以小时 分钟和秒为单位的持续时间 如果我突出显示其中一个控件并使用箭头键设置值 日期选择器会显示一些奇怪的行为 每次按下向上箭头时 秒数都
  • Node 连接到 Postgres 的速度比 .NET Core 快 20 倍

    我有两台服务器连接到PostgresSQL 9 6数据库托管在 Azure 上 服务器正在做一件事 使用 a 访问 Postgres 数据库SELECT 1每5秒查询一次 连接到数据库并获取数据的典型时间 Node 25 MS NET Co