1

AWS-rds/mysql データベース (t1.micro) を備えた ec2 サーバー (m1.small with amazon linux) 上の自家製Web サーバーで実行される Rails アプリケーションがあります。これは何日も続きます (今朝、過去 30 日間のアップタイムは約 99.9% でした)。

しかし、アプリケーションが約 14 分間停止することがあります (アプリケーションは pingdom によって監視されています)。それが起こるとき、それは通常バッチで起こります。今日、私はすでにその問題を4回抱えていました。十分な速度が得られたら、サーバーにログインし、gdb をインストールして、デバッガーを Web サーバーに接続できます。スタックの上部は次のようになります。

thread 1.
(gdb) bt
#0  0x00007fafa28b154d in read () from /lib64/libpthread.so.0
#1  0x00007faf98736332 in ?? () from /usr/lib64/mysql/libmysqlclient.so.18
#2  0x00007faf9872841f in ?? () from /usr/lib64/mysql/libmysqlclient.so.18
#3  0x00007faf98728ffa in ?? () from /usr/lib64/mysql/libmysqlclient.so.18
#4  0x00007faf98722615 in ?? () from /usr/lib64/mysql/libmysqlclient.so.18
#5  0x00007faf98726254 in ?? () from /usr/lib64/mysql/libmysqlclient.so.18
#6  0x00007faf9871e30d in mysql_ping () from /usr/lib64/mysql/libmysqlclient.so.18
#7  0x00007faf98be1aed in nogvl_ping (ptr=0x47a1ec0) at client.c:627
#8  0x00007fafa2c59c29 in rb_thread_blocking_region () from /home/ec2-user/.rvm/rubies/ruby-1.9.3-p327/lib/libruby.so.1.9
#9  0x00007faf98be1b5d in rb_mysql_client_ping (self=70801240) at client.c:636
#10 0x00007fafa2c3f108 in call_cfunc () from /home/ec2-user/.rvm/rubies/ruby-1.9.3-p327/lib/libruby.so.1.9
#11 0x00007fafa2c3fa0d in vm_call_cfunc () from /home/ec2-user/.rvm/rubies/ruby-1.9.3-p327/lib/libruby.so.1.9
#12 0x00007fafa2c400d3 in vm_call_method () from /home/ec2-user/.rvm/rubies/ruby-1.9.3-p327/lib/libruby.so.1.9
#13 0x00007fafa2c45987 in vm_exec_core () from /home/ec2-user/.rvm/rubies/ruby-1.9.3-p327/lib/libruby.so.1.9
#14 0x00007fafa2c52d2a in vm_exec () from /home/ec2-user/.rvm/rubies/ruby-1.9.3-p327/lib/libruby.so.1.9
#15 0x00007fafa2c516af in invoke_block_from_c () from /home/ec2-user/.rvm/rubies/ruby-1.9.3-p327/lib/libruby.so.1.9
#16 0x00007fafa2c517c5 in vm_yield () from /home/ec2-user/.rvm/rubies/ruby-1.9.3-p327/lib/libruby.so.1.9

mysql のバージョンは 5.5 です。aws が提供するデータベース ログにエントリはありません。rails ログには 14 分のギャップがあります (xxx/auto_test は、AWS ロード バランサーが 10 秒ごとにインスタンスをチェックするために使用する URL です)。

Started GET "/xxx/auto_test" for 10.224.95.251 at 2013-02-06 17:59:32 +0000
Processing by HealthCheckController#status as */*
  Rendered health_check/status.html.erb within layouts/application (0.1ms)
  Rendered layouts/_render_flash.html.erb (0.1ms)
  Rendered layouts/_debug_info.html.erb (0.0ms)
Completed 200 OK in 8ms (Views: 6.0ms | ActiveRecord: 1.3ms)
Started GET "/xxx/auto_test" for 10.224.95.251 at 2013-02-06 18:13:38 +0000
Processing by HealthCheckController#status as */*
  Rendered health_check/status.html.erb within layouts/application (0.1ms)
  Rendered layouts/_render_flash.html.erb (0.1ms)
  Rendered layouts/_debug_info.html.erb (0.0ms)
Completed 200 OK in 7ms (Views: 5.5ms | ActiveRecord: 1.2ms)

その停止中、ロード バランサーからの要求が積み重なり、データベースがブロックされなくなったときに応答されます。

データベースがブロックされる原因は何ですか? この問題を解決するには、どのような情報を探す必要がありますか? 回避策の提案はありますか? どんな指針も大歓迎です。

アップデート:

今日もまた問題を見ました。停止はちょうど 14 分間続きました。デバッガーを接続すると、まったく同じバックトレースが得られました。そのため、ネイティブの MySql タイムアウトを使用しても問題は軽減されません。

iptables -L興味深いものもありませんでした。

14分、14分って何?41 は少なくとも 42 に近いですが、14 です。

4

2 に答える 2

2

これは、ファイアウォールの問題である可能性があります。MySQL への接続が 15 分間ブロックされるような方法でファイアウォールを構成するスクリプトがシステムにないことを確認する必要があります。この仮説は、MySQL 接続が正しく動作しない時間帯に「iptables -L」を実行することで確認できます。

于 2013-05-05T12:09:49.773 に答える