2

MySQL 接続を作成し、クエリを実行してから (PHP を介して) 接続を閉じるページで ab (apachebench) を使用して、サイトの 1 つをベンチマークしています。

max_connections の制限を 500 に設定して、my.cnf をハードコーディングしました。

ストレス テストを実行すると、スクリプトから「データベースに接続できません」タイプのエラーが返されますが、MySQL は指定した接続制限に達することはありません。MySQL が一度に約 237 を超える接続を開くことができないかのようです。

現在の my.cnf は次のとおりです。

[mysqld]
max_connections = 500
port            = 3306
socket          = /var/mysql/mysql.sock
skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 1M
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 128M
thread_concurrency = 8
max_heap_table_size = 512M
tmp_table_size = 512M
table_cache = 2048

ユーザー制限:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 16384
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1250
virtual memory          (kbytes, -v) unlimited

問題は、PHP または MySQL のいずれかにあるようです (または、もちろん、私たちによる設定ミス)。

ヘルプ、提案、ヒントは大歓迎です - 事前に感謝します。

4

1 に答える 1

3

さて、この問題の犯人を見つけました。

ストレス負荷を実行するとき、それは段階的ではありませんでした.すべての接続が一度に開かれ、サーバーにフラッディングが発生しました.

MySQL のデフォルトback_logは 50 です。これは、MySQL が処理前に保持できる未処理の接続の数です。サーバーをフラッディングしたときにこの制限に達し、50 のしきい値を超える接続が拒否されました。

これを修正するために、次の行で my.cnf を編集し、リッスン バックログを適切な 128 に増やしました。これはセットアップで機能します。

back_log = 128

ここに入力できる最大値は、お使いの OS と OS 内で設定されている制限に依存することに注意してください。MySQL のリッスン バックログの最大値は 65535 ですが、OS の数値はそれよりも小さい場合があります。

Connection refused128 の新しい back_log により、問題は修正され、負荷がかかっているときにエラー メッセージが表示されることはなくなりました。

于 2013-07-03T22:00:40.843 に答える