CentOSサーバーでuWSGIとnginxを使用してPython Pyramidアプリを実行しています。SQLAlchemyをORMとして、MySQLdbをAPIとして、MySQLをデータベースとして使用しています。サイトはまだ稼働していないため、トラフィックは私と会社の他の従業員だけです。データベースにデータを追加するためにデータを購入したため、最大(かつ最も頻繁に照会される)テーブルは最大150,000行です。
昨日、ウェブサイトの4つの新しいタブを連続して開いたところ、502のBad Gatewayエラーがいくつか返されました。uWSGIログを調べたところ、次のことがわかりました。
sqlalchemy.exc.OperationalError: (OperationalError) (2006, 'MySQL server has gone away') 'SELECT ge...
重要な注意: このエラーは、MySQLのwait_timeoutが原因ではありません。そこに行って、それをやった。
この問題は、同時リクエストが同時に処理されたために発生したのではないかと思いました。私は自分を貧乏人の負荷テスターにしました:
for i in {1..10}; do (curl -o /dev/null http://domain.com &); done;
案の定、これらの10件のリクエスト内で、少なくとも1件は2006エラーをスローし、多くの場合はそれ以上になります。時々エラーはさらに奇妙なものになるでしょう、例えば:
sqlalchemy.exc.NoSuchColumnError: "Could not locate column in row for column 'table.id'"
列が最も確実に存在し、他のすべての同一のリクエストで正常に機能したとき。または、これ:
sqlalchemy.exc.ResourceClosedError: This result object does not return rows. It has been closed automatically.
もう一度、他のすべての要求に対してはうまくいきました。
問題が同時データベース接続に起因することをさらに確認するために、uWSGIをシングルワーカーに設定し、マルチスレッドを無効にして、リクエストを一度に1つずつ処理するように強制しました。案の定、問題は消えました。
問題を見つけるために、MySQLのエラーログを設定しました。MySQLの起動時のいくつかの通知を除いて、空のままです。
これが私のMySQL設定です:
[mysqld]
default-storage-engine = myisam
key_buffer = 1M
query_cache_size = 1M
query_cache_limit = 128k
max_connections=25
thread_cache=1
skip-innodb
query_cache_min_res_unit=0
tmp_table_size = 1M
max_heap_table_size = 1M
table_cache=256
concurrent_insert=2
max_allowed_packet = 1M
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 64K
innodb_file_per_table=1
log-error=/var/log/mysql/error.log
エラーの重いグーグルはほとんど明らかにしませんでしたが、max_allowed_packetを増やすよう提案しました。それを100Mに増やしてMySQLを再起動しましたが、まったく役に立ちませんでした。
まとめる と、MySQLへの同時接続が原因2006, 'MySQL server has gone away'
で、その他の奇妙なエラーが発生します。MySQLのエラーログには関連性はありません。
私は何時間もこれに取り組んできましたが、何も進歩していません。誰かが私を助けてくれますか?