1

Sidekiq을 몇 시간 동안 실행 한 후 Mysql2::Error: This connection is in use by: #<Celluloid::Thread:0x0000000d1b56e0 sleep>으로 많은 작업이 실패합니다. Sidekiq 스레드가 MySQL 연결 풀에서 어떻게 든 충돌하는 것 같습니다."Mysql2 :: Error :이 연결은 Sidekiq와 함께 사용 중입니다."

concurrency은 sidekiq.yml에서 기본값 25로 설정되고 pool은 database.yml에서 28입니다. 오래 지속되는 쿼리는 없으며 예외는 표준 찾기 호출에서 발생합니다.

작업이 원활하게 실행되도록하려면이 오류를 방지하려면 어떻게합니까?

+0

어떤 서버를 사용하고 있습니까? 일각수? 이것은 개발 또는 생산 과정에서 발생하고 있습니까? –

+0

독립적 인 Sidekiq 프로세서 서버입니다. 예, 생산합니다. – mahemoff

+0

이 근로자 만이 DB를 사용하고 있습니까? 왜냐하면 다른 프로세스에 동일한 DB를 사용하고 있다면 DB가 얼마나 많은 연결을 가지고 있는지 알 필요가 있습니다. –

답변

0

sidekiq이 DB에 모든 연결을 얻는 동시에 레일 앱이 연결을 요청하기 때문에 문제가 발생합니다.

25 명의 sidekiq 직원이 있지만 레일 서버는 얼마나 있습니까?

예컨대 네 아이 작업자가 4 명이 다니는 유니콘을 가지고 있다면 적어도 29 슬롯이 필요합니다.

+0

database.yml 풀 변수는 프로세스 당 연결 수를 반영하므로 각 Unicorn에도 28 개의 연결이 있습니다. (실제로는 1 개만 필요하지만 실제로는 더 이상 사용하지 않고 오랫동안 사용하지 않기 때문에 실제로 문제가되지 않습니다.) Unicorn은 DB 문제가 없기 때문에 Unicorns는 DB와 관련하여 논쟁의 여지가 없습니다. (그들도 다른 컴퓨터에 있습니다.) – mahemoff

+0

하지만 그들은 동일한 DB를 공유합니다. 어떤 머신인지는 중요하지 않으며, 풀당 프로세스가 아닌 것은 DB 당 –

+0

4 유니콘이 있다고 해봅시다. 즉 실제로 최대 125 개의 연결이 있음을 의미합니다. 아니요 28. – mahemoff

0

에서

좀 더 자세한 사항은, 우리는 특정 작업자 유형에 이러한 오류를 많이했다. 우리는이 작업자에서 실행중인 작업 중 하나에서 Timeout.timeout() 호출을 사용하고 있음을 확인했습니다. 우리는 이러한 호출을 제거하고 이러한 오류는 사라졌습니다. Timeout.timeout() 호출이 위험한 이유에 대한 참조는 herehere입니다.