Tôi đang chạy ứng dụng Python Pyramid trên máy chủ CentOS bằng uWSGI và nginx. Tôi đang sử dụng SQLAlchemy làm ORM, MySQLdb làm API và MySQL làm cơ sở dữ liệu. Trang web chưa hoạt động, vì vậy lưu lượng truy cập duy nhất là tôi và một số nhân viên khác của công ty. Chúng tôi đã mua một số dữ liệu để điền vào cơ sở dữ liệu, vì vậy bảng lớn nhất (và thường xuyên được truy vấn nhất) là ~ 150.000 hàng.
Hôm qua tôi đã mở bốn tab mới của trang web liên tiếp và tôi đã nhận được một vài lỗi 502 Bad Gateway. Tôi đã xem nhật ký uWSGI và tìm thấy như sau:
sqlalchemy.exc.OperationalError: (OperationalError) (2006, 'MySQL server has gone away') 'SELECT ge...
Lưu ý quan trọng: Lỗi này không phải do Wait_timeout của MySQL. Đã từng trải qua rồi.
Tôi tự hỏi nếu vấn đề được gây ra bởi các yêu cầu đồng thời được phục vụ đồng thời. Tôi tự biến mình thành người kiểm tra tải trọng của người nghèo:
for i in {1..10}; do (curl -o /dev/null http://domain.com &); done;
Chắc chắn, trong mười yêu cầu đó, ít nhất một yêu cầu sẽ gây ra lỗi năm 2006, đôi khi còn nhiều hơn thế. Đôi khi các lỗi thậm chí còn trở nên xa lạ, ví dụ:
sqlalchemy.exc.NoSuchColumnError: "Could not locate column in row for column 'table.id'"
Khi cột chắc chắn tồn tại và hoạt động tốt trên tất cả các yêu cầu giống hệt khác. Hoặc, cái này:
sqlalchemy.exc.ResourceClosedError: This result object does not return rows. It has been closed automatically.
Khi, một lần nữa, nó hoạt động tốt cho tất cả các yêu cầu khác.
Để xác minh thêm rằng sự cố xuất phát từ các kết nối cơ sở dữ liệu đồng thời, tôi đã đặt uWSGI thành một công nhân duy nhất và đa luồng bị vô hiệu hóa, buộc các yêu cầu phải được xử lý cùng một lúc. Chắc chắn, các vấn đề biến mất.
Trong nỗ lực tìm kiếm sự cố, tôi đã thiết lập một nhật ký lỗi cho MySQL. Ngoại trừ một số thông báo trong khi khởi động MySQL, nó vẫn trống.
Đây là cấu hình MySQL của tôi:
[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
Googling nặng về lỗi ít tiết lộ, nhưng đề nghị tôi tăng max_allowed_packet. Tôi đã tăng nó lên 100 triệu và khởi động lại MySQL, nhưng điều đó không giúp ích gì cả.
Tóm lại: Kết nối đồng thời với nguyên nhân MySQL 2006, 'MySQL server has gone away'
và một số lỗi lạ khác. Không có gì liên quan trong nhật ký lỗi của MySQL.
Tôi đã làm việc trong nhiều giờ và không có tiến triển gì. có ai giúp tôi ra ngoài không?