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)を考えると、より多くの接続を作成するための十分なスペースがあるはずです。ただし、次のシナリオがスピンアップしているときは、接続数は増加しませんが、レベルを維持し、接続が確立できなかったことに関するこれらのログメッセージの表示を開始します。
ここで何が問題になる可能性がありますか?
これは実際にはPostgresの問題ではなく(したがって、チェックしているDB統計に変更はありません)、トラフィックがサーバーによって停止されているように聞こえます。おそらく、負荷テストクエリの処理中にそのポートのトラフィックが飽和状態になっているためですか?
Azureリソース制限 (セットアップに適用される場合は データベース制限 を含む)のいずれかに達しているようには聞こえませんが、詳細はありません。負荷テストでは、何が必要かを正確に言うのは困難です。
ウェブやその他のSOの回答が示唆する:
TcpAckFrequency
--see this article<defaultProxy> <proxy usesystemdefault="False"/> </defaultProxy>
- ソース最も考えられる理由は、ファイアウォール/アンチウイルスです。
現在のAzureインフラストラクチャにはファイアウォールまたはアンチウイルスが含まれていますか?
さらに、いくつかの追加検索を行うと、これは標準のWindowsの「接続が拒否されました」というメッセージのように見えます。これは、PostgreSQLが何かに接続しようとして拒否されていることを示しています。
また、ネットワーク内の1つのネットワーク要素(サーバーに接続していると仮定)によって、DBログイン/認証ネットワークパケットの一部が遅延またはドロップされる可能性もあります(たとえば、偽のauth.replayと見なされます)...
エラーが表示されたときに、パケットアナライザー( Wireshark など)を使用してネットワークフローを記録/検査することもできます。
よろしく
アプリケーションから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;
}
}
この問題を解決するために、次の手順を実行しました。
services.msc
に移動して、Postgresql
サービスが実行されているかどうかを確認しますpgAdmin
にログインしようとしましたすべてがファイルでした。ご存知のとおり、5432はPostgresql
のデフォルトのポートであり、アプリケーション接続文字列で別のポートを使用していたため、5432に変更するとこの問題が修正されました。私。
"ConnectionString": "User Id=postgres;Password=mypwd;Host=localhost;Port=5432;Database=mydb;"