2012-01-20 10 views
0

2台のサーバー、1つのWeb(nginx/php)、1つのデータベース(mysql)を実行しています。WebサーバーとDBサーバー間の接続数が極端に多い

Nginxには毎秒約1500のアクティブプロセスがあり、mysqlステータスには現在約15のオプション接続が平均で表示されています。

は今、今日、私は走り出した:netstat -npt | awk '{print $5}' | grep -v "ffff\|127\.0\.0\.1" | awk -F ':' '{print $1}' | sort -n | uniq -c | sort -n

この私のデータベース・サーバIPへの私のウェブサーバから7000以上のアクティブな接続があったことを示しました。これは極端なようです。私はPHPでMysqlに接続する永続的な接続を使用しません。

私もmysql_close()を使ってみましたが、違いはありません。 Webサーバのnetstatコマンドで

は、Webサーバへのちょうど300の接続

非常に多くのオープン接続がある理由を任意のアイデアを示し、データベース・サーバーのnetstatコマンドでデータベース・サーバ

から7000以上の接続を示していますか?

答えて

1

のみ確立された接続をチェックしてみてください。

netstat -npt | grep ESTABLISHED | awk ... 
0

これらの接続のステータスは何ですか?私はそれがTIME_WAITだと仮定します。 1500 req/sがある場合、1500のTCP接続を開いたり閉じたりしています。そして、接続を閉じるには時間がかかります(プロトコルに指定されたタイムアウトがありますので、localhostでも終了は瞬時ではありません - 詳細はこちらhere)。

それは何も問題はありません - 7000接続はあまりありません(ただし、次に述べる永続的な接続はやや速くなります)。 Webサーバーとデータベースサーバーの間に最大65536の接続を設定できます。また、これは一般に信じられているように、開かれた接続の総数ではありません。この制限は、IPアドレスごとではなく、IPペアごとです(src-ipとdst-ipの各ペアは、それらの間で65536の接続を持つことができます)。

nginxを使用している場合は、PHPをFast-CGIモードで使用することを前提としています。したがって、1500 req/sの場合、PHPプロセスを処理するために待機している必要があります(私のサーバーに2000〜5000 req/sがあり、PHPプロセスが50〜250件あります)。このように接続数が多く、PHPプロセスが比較的少ない場合は、永続的な接続を使用する方がよいでしょう。各PHPプロセスは、データベースへの1つの常設接続を行います。したがって、MySQLとの接続は約100になりますが、開かれたままになりますので、各Webリクエストで3ウェイTCPハンドシェイクを&にする必要はありません。

関連する問題