programing

SNIReadSyncOverAsync 및 WaitForSingleObject가 EF 성능을 차단합니까?

iphone6s 2023. 4. 7. 20:59
반응형

SNIReadSyncOverAsync 및 WaitForSingleObject가 EF 성능을 차단합니까?

EF를 사용하는 WCF 서비스에 대해 프로파일링을 하고 있습니다.(System.Data.Entities)SQL DB에서 읽습니다.서비스에 영향을 미치는 여러 병렬 클라이언트를 스핀업하면 CPU가 모두 100%가 되고 일반적으로 성능이 저하되며 모든 것이 중단됩니다.

동시성 프로파일러를 사용한 프로파일링 결과, 85%의 시간이 동기화에 소비되고 있으며, 실제 코드 실행은 약 4%에 불과했습니다.스택 트레이스를 자세히 살펴보면 대부분의 동기화가 콜에서 이루어지는 것 같습니다.WaitForSingleObjectSystem.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync. 스택은 콜이 네이티브메서드 래퍼로 전송되고 다음으로 콜이 종료되는 것을 나타냅니다.kernel32.dll!_WaitForSingleObject.

이런 경험이 있는 사람이 있나요?어떻게 할 방법이 없을까요?20여 개의 병렬 클라이언트만 읽기 전용으로 되어 있기 때문에 스레드가 동기화되지 않는 것이 놀랍습니다.

일주일째 이것과 싸우고 있는데 도저히 설명할 수가 없어요.어떤 도움이라도 주시면 감사하겠습니다!

문제를 재현하는 작은 코드 샘플로 증류할 수 있습니까?어떤 버전의 EF를 사용하고 있습니까?

여기 당신이 지금까지 제공한 정보를 바탕으로 한 몇 가지 관찰이 있습니다.

EF 비동기

EF 6보다 작은 것은 항상 동기화됩니다.EF 6에서는 대신 비동기 방식을 사용할 수 있습니다.단, WCF 서비스에서도 비동기 패턴이 사용되지 않는 한 이 작업을 수행하지 마십시오.

WCF 비동기

구현이 비동기인 WCF 서비스를 쓸 수 있습니다.상세한 것에 대하여는, 이 메뉴얼을 참조해 주세요.

둘 다 아닌 위의 방법 중 하나를 사용하면 코드가 비동기화되지 않지만 불필요한 동기화 오버헤드가 발생합니다.특히 피하다Task.Run()스루풋을 실제로 향상시키지 않고 단순히 다른 스레드로 작업을 이동할 수 있기 때문입니다.

초기화

마지막으로, 또 다른 관련 없는 아이디어입니다.EF 초기화와 관련된 문제일 수 있습니까?EF는 모델의 메타데이터를 구축할 때 연결 문자열당 한 번씩 이 작업을 수행합니다.여러 스레드가 동일한 모델을 사용하려고 시도하고 해당 모델이 아직 초기화되지 않은 경우 초기화가 완료될 때까지 모든 스레드가 차단됩니다.이것이 고객의 문제인지 아닌지를 확인하려면 , 서비스에 콜을 1 회 실시해, 완료할 때까지 기다립니다.그런 다음 20개의 병렬 요청을 제출하십시오.아직도 CPU가 한계에 달합니까?

언급URL : https://stackoverflow.com/questions/30183797/snireadsyncoverasync-performance-issue

반응형