2009-05-02 10 views
1

TIME_WAIT状態で接続(> 1,000)でオーバーロードされ続けるApache mod proxyを使用して、かなりビジー状態のWebサイト(1日あたり100万ページビュー)を使用しています。接続はポート3306(mysql)になりますが、mysqlはわずかな接続(プロセスリストの表示)しか表示せず、正常に動作しています。 私たちはたくさんのものを変えようとしましたが(生き生きとした状態を維持してください)、何も助けてくれないようです。他のすべてのシステムリソースは合理的な範囲内にあります。TIME_WAIT接続が多すぎます

私は検索しましたが、これはtcp_time_wait_intervalの変更を示しているようです。しかし、それは少し劇的なようです。私は前に忙しいウェブサイトで働いたことがあるが、この問題はなかった。

提案がありますか?

答えて

0

phpが着信接続で逆引きのホスト検索を行うように設定されたmysqlサーバに接続していたので、私たちのWebサーバがすべて凍結しているのと同様の問題がありました。

時間がかかったときは正常に動作しましたが、負荷がかかりすぎると応答時間が屋根とすべてのApacheサーバーがtime_waitに滞ってしまいました。

私たちが問題を見つけ出す方法は、xdebugを使用して高負荷のスクリプトのプロファイリングデータを作成し、そのことを調べることでした。 mysql_connect呼び出しは実行時間の80〜90%を占めていました。

+0

しかし、すべての接続が同じサーバー、Webサーバー、またはアプリケーションサーバーから行われるわけではありませんか?私はmysqlが最初の接続の後にホストキャッシュにヒットすると思います。 –

+0

彼らはしていませんでした。 – xkcd150

5

各time_wait接続は、閉じられた接続です。

mysqlに接続してクエリを発行した後、接続を切断している可能性があります。ページ上の各クエリに対して同じ手順を繰り返します。接続プーリング・ツール、または少なくともデータベース接続を保持するグローバル変数を使用することを検討してください。グローバルを使用する場合は、ページの最後に接続を閉じる必要があります。うまくいけば、フッターを含むように、あなたはそれを置くことができるどこかの共通点があります。

ボーナスとして、ページの読み込み速度が向上するはずです。 MySQLは素早く接続できますが、再接続する必要はありません。

+0

私たちはPHPを使用しているので、ページが配信されるとプロセスが終了するので、実際には接続プーリングはできません。 –

+0

グローバル変数にdbconnectionを割り当てることで、ページ内での接続を再利用することはできます。毎回作り直す代わりに。 http://httpd.apache.org/docs/2.2/mod/mod_dbd.htmlのようなものを使って、PHPプロセスの外部でプーリングすることもできます。 – Trey

+0

@trey @craigどのphpデモでも、そのグローバル変数を作成する方法 –

1

クライアントアプリケーションは、あなたがこのバグを打つかもしれない、JDBCを使用している場合: http://bugs.mysql.com/bug.php?id=56979 私はPHPが同じ問題に 乾杯、 ジルを持っていると信じています。

関連する問題