2013-09-23 3 views
9

ServiceStack의 Redis 클라이언트와 함께 캐싱에 Redis를 많이 사용하는 몇 가지 .NET 웹 응용 프로그램에서 작업합니다. 모든 경우에 동일한 시스템에서 Redis를 실행하고 있습니다. BasicRedisClientManagerPooledRedisClientManager (항상 싱글 톤으로 구현 됨) 두 가지 방법 모두에서 몇 가지 문제가있었습니다.ServiceStack을 사용하여 Redis 연결을 관리하는 가장 좋은 방법은 무엇입니까?

BasicRedisClientManager을 사용하면 잠시 동안 문제가 없지만 결국 Redis는 연결 거부를 시작합니다. netstat을 사용하여 TIME_WAIT 상태에서 기본 Redis 포트에 대한 수천 개의 TCP 연결이 끊어져 있음을 발견했습니다.

다음으로 PooledRedisClientManager으로 바꿔 문제를 즉시 해결 한 것으로 보입니다. 그러나 얼마 지나지 않아 PooledRedisClientManager.GetClient로 인해 발생하는 스레드 대기 (System.Threading.Monitor.Wait 호출)로 좁혀진 CPU 가끔 발생하는 것을 알기 시작했습니다.

코드에서 우리는 (ServiceStack의 편리한 ExecAs 단축키를 사용하는) get-in-get-out 접근법을 사용하므로 일반적인 연결은 매우 빈번하게 획득되지만 가능하면 잠시 동안 유지됩니다.

트래픽이 적지 만 우리는 StackExchange가 아니기 때문에 ServiceStack 클라이언트가 제대로 작동하고 있다고 생각합니다. 잘못된 것을하고 있습니다. PooledRedisClientManager가 올바른 접근법입니까? 풀 크기를 단순히 늘리는 것이 좋습니다. 아니면 우리 코드의 문제를 가릴 가능성이 있습니까?

여기서 일반적인 안내를 찾고 있는데,이 시점에서 도움이 필요한 구체적인 코드가 없습니다. 미리 감사드립니다.

+0

순도 및 총 투기 - AppHarbor을 사용했으며 Redis 연결에 문제가있어 Redis 연결 제한에 도달했습니다. 사이트는 기본적으로 트래픽이 전혀 발생하지 않으므로 IIS가 유휴 시간 제한을 초과하고 내 응용 프로그램을 종료하고 Redis 연결을 제대로 처리하지 못해서라고 추측합니다. SS 'RedisClientManagers'는 'Dispose'에서 닫는 연결을 처리합니다. 다시 말하지만 단지 추측이지만 연결을 처리하지 않는 IIS 유휴 시간 제한과 새로운 Redis 연결을 만드는 몇 가지 'Application_Starts'가 그럴듯한 것 같습니다. – paaschpa

+0

연결이 닫혀 있는지 확인 하시겠습니까? redis-cli를 사용하여 CLIENT LIST 명령을 확인하십시오. –

답변

4

모든 Redis 연결이 폐기되고 있습니까? ServiceStack와

, ServiceViewPageBase (당신이 SS 면도기를 사용하는 경우)에 Redis 속성은 자신을 처리 할 수 ​​있지만, 언제든지 당신은 자신을 당신이 직접 처리해야 풀에서 연결을 요청합니다.

그러나 이것에도 불구하고 우리는 최근에 우리 수영장이 모든 연결을 다 써 버리는 데 문제가있었습니다. 동료 중 한 명이 Razor 페이지를 정리하지 않았고 pull 요청을했음을 발견했습니다. here - 이는 ServiceStack v4.0.21 이후 Razor 페이지에서만 올바른 처리가 수행되었음을 의미합니다. 해당 픽스가 v3 분기로 다시 포팅되었는지 확인하지 않았습니다.

동료는 부적절한 처리를 추적하는 데 도움이되는 TrackingRedisClientsManager도 추가했습니다. here

PooledRedisClientManagerby using this helper method의 통계를 확인할 수도 있습니다. 약간의 면도 페이지에 던져서 적절하다고 판단되는 통계를 확인합니다.)하지만 특정 노드의 풀 상태를 모니터링하기 위해 더 나은 코드를 작성할 수 있습니다.

관련 문제