uWSGI와 nginx를 사용하여 CentOS 서버에서 Python Pyramid 앱을 실행하고 있습니다. SQLAlchemy를 ORM으로, MySQLdb를 API로, MySQL을 데이터베이스로 사용하고 있습니다. 이 사이트는 아직 운영되지 않았으므로 유일한 트래픽은 나와 다른 회사 직원입니다. 데이터베이스를 채우기 위해 일부 데이터를 구입 했으므로 가장 크고 가장 자주 쿼리되는 테이블은 ~ 150,000 행입니다.
어제 웹 사이트의 새 탭 4 개를 빠르게 연속으로 열었고 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;
물론, 그 10 건의 요청에서 적어도 한 번은 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의 오류 로그에는 아무런 관련이 없습니다.
나는 몇 시간 동안이 일을하고 있으며 아무런 진전이 없었습니다. 누군가 나를 도울 수 있습니까?