web-dev-qa-db-ja.com

Postgresql:ターゲットマシンがアクティブに拒否したため、接続を確立できませんでした

AzureのWindowsServer 2012R2でPostgresql9.5を実行する

アプリケーションでいくつかのロードテストを実行しているときに、postgresサーバーに接続できないというエラーが発生します。 postgresのログに次のメッセージが表示されます。

クライアントからデータを受信できませんでした:ターゲットマシンがアクティブにデータを拒否したため、接続を確立できませんでした。

これは、ロードテストが次のシナリオに進み、コードの別の部分にヒットした場合にのみ発生します。そのため、データベースへの新しい接続が必要です。しかし、10〜20秒後、シナリオの残りの部分は、他の問題にぶつかることなく問題なく機能します。したがって、問題はtcp接続にあるようです。 (私のコードは数回再試行しますが、20秒間再試行させることはできません)

設定ファイルで次の設定を使用しています

postgresql.conf

listen_addresses = '*'
max_connections = 500   
shared_buffers = 1024MB     
temp_buffers = 2MB
work_mem = 2MB  
maintenance_work_mem = 128MB        

pg_hba.conf

Host    all             all             0.0.0.0/0               trust
Host    all             all             ::/0                    trust

私は知っています、私は知っています..すべての人からの接続を受け入れることは保存されませんが、これはテスト目的であり、これらの設定が接続をブロックしていないことを確認するためです。 したがって、この回答は無効です

私はサーバー上の接続数を監視してきましたが、負荷がかかっても75で安定しています。Postgresは約350MBのRAMを使用しています。したがって、構成とvmの仕様(7GB RAM)を考えると、より多くの接続を作成するための十分なスペースがあるはずです。ただし、次のシナリオがスピンアップしているときは、接続数は増加しませんが、レベルを維持し、接続が確立できなかったことに関するこれらのログメッセージの表示を開始します。

ここで何が問題になる可能性がありますか?

6
P. Gramberg

これは実際にはPostgresの問題ではなく(したがって、チェックしているDB統計に変更はありません)、トラフィックがサーバーによって停止されているように聞こえます。おそらく、負荷テストクエリの処理中にそのポートのトラフィックが飽和状態になっているためですか?

Azureリソース制限 (セットアップに適用される場合は データベース制限 を含む)のいずれかに達しているようには聞こえませんが、詳細はありません。負荷テストでは、何が必要かを正確に言うのは困難です。

ウェブやその他のSOの回答が示唆する:

  • TCP自動調整を無効にし、サーバー上のTCP/IPレジストリキーを微調整します。例:set TcpAckFrequency --see this article
  • TCP設定の調整( WinsockListenBacklog など)-接続プールが使用されているかどうかによって影響を受ける可能性があります このMSサポート記事 を参照してください。 =、これはSQL Server 2005用ですが、拒否されたTCP/IP接続のトラブルシューティングに関するいくつかの優れたヒントがあります(ネットワークモニターを使用しますが、新しいツールに適用されます)
  • サーバーを十分に制御できる場合は、リクエスト処理が高速になります source
  • (負荷テストアプリで)ネットワークプロキシを無効にする:<defaultProxy> <proxy usesystemdefault="False"/> </defaultProxy> - ソース
4
brichins

最も考えられる理由は、ファイアウォール/アンチウイルスです。

  • ソフトウェア/パーソナルファイアウォールの設定
  • 複数のソフトウェア/パーソナルファイアウォール
  • ウイルス対策ソフト
  • LSPレイヤー
  • (仮想)ルーターファームウェア

現在のAzureインフラストラクチャにはファイアウォールまたはアンチウイルスが含まれていますか?

さらに、いくつかの追加検索を行うと、これは標準のWindowsの「接続が拒否されました」というメッセージのように見えます。これは、PostgreSQLが何かに接続しようとして拒否されていることを示しています。

また、ネットワーク内の1つのネットワーク要素(サーバーに接続していると仮定)によって、DBログイン/認証ネットワークパケットの一部が遅延またはドロップされる可能性もあります(たとえば、偽のauth.replayと見なされます)...

エラーが表示されたときに、パケットアナライザー( Wireshark など)を使用してネットワークフローを記録/検査することもできます。

よろしく

1
A STEFANI

アプリケーションからPostgresqlに接続しようとしたときに、AspNetコアアプリケーションで同じ問題に直面していました。 Migrate関数を呼び出していたときに、Program.csファイルにエラーがスローされました。

public static void Main(string[] args) {
    try {
        var Host = BuildWebHost(args);
        using(var scope = Host.Services.CreateScope()) {
            // Migrate once after app is started.
            scope.ServiceProvider.GetService <MyDatabaseContext>().Migrate();
        }
        Host.Run();
    }
    catch(Exception e) {
        //NLog: catch setup errors
        _logger ? .Error(e, "Stopped program because of exception: ");
        throw;
    }
}

この問題を解決するために、次の手順を実行しました。

  1. services.mscに移動して、Postgresqlサービスが実行されているかどうかを確認します
  2. データベースコンテキストで指定したユーザーとパスワードを使用してpgAdminにログインしようとしました

すべてがファイルでした。ご存知のとおり、5432Postgresqlのデフォルトのポートであり、アプリケーション接続文字列で別のポートを使用していたため、5432に変更するとこの問題が修正されました。私。

"ConnectionString": "User Id=postgres;Password=mypwd;Host=localhost;Port=5432;Database=mydb;"
0
Sibeesh Venu