我正在使用uWSGI和nginx在CentOS服务器上运行Python Pyramid应用程序。我使用SQLAlchemy作为ORM,使用MySQLdb作为API,并使用MySQL作为数据库。该站点尚未上线,因此唯一的访问量是我和公司的其他一些员工。我们购买了一些数据来填充数据库,因此最大(也是最经常查询)的表是〜150,000行。
昨天我快速连续打开了网站的四个新标签,然后又收到了502错误的网关错误。我查看了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;
可以肯定的是,在这十个请求中,至少有一个会引发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设置为单个工作程序并禁用了多线程,从而强制一次处理一次请求。果然,问题消失了。
为了找到问题,我为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的错误日志中没有任何相关性。
我已经在这工作了几个小时,并且没有取得任何进展。有人可以帮我吗?