2015-01-19 4 views
0

디버깅하는 데 이상한 문제가 있습니다. 로드 밸런서 뒤에있는 세 대의 웹 서버에 분산 된 Symfony2를 통해 코딩 된 응용 프로그램이 있습니다. 각 웹 서버에는 Varnish의 인스턴스가 있습니다.임의의 메모리가 소모되었습니다.

무작위로 웹 서버 중 일부 또는 둘, 거의 모든 웹 서버가 약 10 분 동안 홈페이지에서 503 오류로 응답하지 않으며 모든 것이 정상으로 돌아갑니다.

오류는 PHP 허용 메모리 크기로 인해 치명적인 오류가 발생했기 때문에 발생합니다. 하지만 내가 이해하지 못하는 이유는 동일한 코드를 사용하여 동일한 DB에 연결하는 동일한 앱이 한 순간에서 다른 순간으로 실패한 다음 다시 정상으로 돌아 오는 이유입니다. 동일한 하드웨어 및 소프트웨어를 사용하는 다른 서버의 동일한 앱조차도 동시에 다르게 작동합니다.

내 첫 번째 추측으로는 실패한 서버에서 Varnish 캐시가 만료되었지만 정상적으로 작동하는 캐시는 오류없이 캐시 된 상태였습니다. 그러나 모든 서버에서 캐시를 수동으로 플러시하면 오류가없는 서버는 200 OK로 응답하고 캐시는 성공적으로 재생성되지만 다른 서버는 계속 실패합니다.

좀 더 이상하게 들리려면 ... 임의의 쿼리 인수로 실패한 동일한 URL이 다른 일부에서는 올바르게 응답한다는 것을 깨달았습니다. 나는 코드에서 아무런 일도하지 않는 인수를 의미합니다.

이 문제를 디버그하는 방법에 대한 아이디어가 부족합니다. 어떤 단서라도 진심으로 감사 할 것입니다. 감사!

업데이트 : 또한 Memcached를 사용하여 Doctrine 쿼리와 결과를 캐시합니다. Memory exhausted error는 Doctrine이 Memcached에 어떤 것을 저장하려고 할 때 발생합니다. 첫 번째 추측은 매우 큰 결과를 저장하려는 것으로 생각할 수 있지만 다른 웹 서버에 아무런 문제가없는 반면 한 웹 서버에서 오류가 발생하는 이유를 설명하지 않으며 모두 동일한 DB에서 동일한 쿼리를 처리하고 있습니다.

+0

내가 추측해야만한다면 [APC] (http://php.net/manual/en/book.apc.php)가 가득 차서 패닉이 발생합니다. – castis

+1

@castis 와우 나는 opcode 캐시를 사용하고 있다는 것을 잊어 버렸고 PHP에서 메모리가 고갈 된 오류를 일으킬 수 있다는 것을 알지 못했습니다. 나는 확실히 그것에 대해 조사 할 것이다! 문제가 해결되는지 알려 드리겠습니다. 고마워. –

+0

@castis 실제로 APC가 아닌 Opcache를 사용하고 있습니다. 오류가 발생하는 동안 Opcache 재설정 시도했지만 도움이되지 않았습니다. –

답변

0

나를 위해 당신은 PHP 스크립트에 대해 나쁘게 행동하거나 PHP에 허용 된 메모리가 너무 높습니다. Memory_limit * 여분의 프로세스 당 약 15MB의 최대 프로세스는 사용 가능한 메모리보다 커야합니다. 일부 요청에 대해 더 많은 메모리가 필요한 경우 최대 개수가 더 적은 추가 풀을 설정해야합니다.

또한 바니시가 다소 큰 메모리 덩어리를 차지할 수 있음을 고려하십시오. 캐시 크기와 최대 동시 연결 수를 제한하십시오. 각 연결은 메모리를 사용하지만 ammount는 VCL 및 요청 크기 (헤더 포함)에 따라 크게 다릅니다.

로드 밸런서 레이어에 바니시를 배치하면 처리가 더 쉬워지고 캐시 효율성이 향상됩니다.

+0

아마도 내가 틀렸지 만 "허용 된 메모리 크기가 부족합니다"오류는 최대 프로세스 또는 사용 가능한 총 메모리와 관련이 없습니다. 그게 문제라면 "오류가 메모리 부족"이라고 생각합니다. –