ServiceStack의 Redis 클라이언트와 함께 캐싱에 Redis를 많이 사용하는 몇 가지 .NET 웹 응용 프로그램에서 작업합니다. 모든 경우에 동일한 시스템에서 Redis를 실행하고 있습니다. BasicRedisClientManager 및 PooledRedisClientManager (항상 싱글 톤으로 구현 됨) 두 가지 방법 모두에서 몇 가지 문제가있었습니다.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가 올바른 접근법입니까? 풀 크기를 단순히 늘리는 것이 좋습니다. 아니면 우리 코드의 문제를 가릴 가능성이 있습니까?
여기서 일반적인 안내를 찾고 있는데,이 시점에서 도움이 필요한 구체적인 코드가 없습니다. 미리 감사드립니다.
순도 및 총 투기 - AppHarbor을 사용했으며 Redis 연결에 문제가있어 Redis 연결 제한에 도달했습니다. 사이트는 기본적으로 트래픽이 전혀 발생하지 않으므로 IIS가 유휴 시간 제한을 초과하고 내 응용 프로그램을 종료하고 Redis 연결을 제대로 처리하지 못해서라고 추측합니다. SS 'RedisClientManagers'는 'Dispose'에서 닫는 연결을 처리합니다. 다시 말하지만 단지 추측이지만 연결을 처리하지 않는 IIS 유휴 시간 제한과 새로운 Redis 연결을 만드는 몇 가지 'Application_Starts'가 그럴듯한 것 같습니다. – paaschpa
연결이 닫혀 있는지 확인 하시겠습니까? redis-cli를 사용하여 CLIENT LIST 명령을 확인하십시오. –