현재 EJB 프로젝트를 버전 2.0에서 버전 3.2 (모두 Stateful)로 업그레이드 중입니다. 비즈니스 로직은 동일하게 유지되며 변경 사항은 EJB 파트 (설명 자 파일을 주석으로 바꾸거나 기존 조회 대신 주입 지점을 사용하는 것 등)입니다. 요청 처리의 관점에서 모든 것이 잘 작동하는 것 같습니다. 문제는 성능입니다. 하나의 연결된 클라이언트에서 모든 요청에는 약 300ms가 걸립니다. 두 번째 클라이언트를 추가하면 평균 시간이 700ms가됩니다. 세 번째 클라이언트에서 평균은 1 초를 초과합니다. EJB 2.0 버전에서는 클라이언트가 많아도 처리 시간이 약간 (50 ~ 100ms) 증가하지만 걱정할 것은 없습니다.EJB 3.2 성능 저하
성능 저하는 매우 분명합니다. 이유를 알 수 없습니다.
저는 EJB 타임 아웃, 트랜잭션 유형 등으로 놀았지만 운이 없었습니다. 나는 또한 JMC를 통해 서버 프로파일 링을 시도했지만 의심스런 것을 찾지 못했습니다.
마치 모든 요청이 순차적으로 처리되며 동시에 처리되지 않는 것처럼 보입니다.
가능한 원인에 대한 힌트를 줄 수 있습니까? 누락 된 구성이 있습니까?
참고 : 문제는 WebSphere 9와 GlassFish 4.1.1에서 모두 발생하므로 응용 프로그램의 문제점입니다.
EDIT # 1
애플리케이션의 로그를 확인 후,이 요청은 동시성을 순차적으로 처리되지되는 것을 확인할 수있다. (주차)
- 27 RUNNABLE
- 18 TIMED_WAITING
- 6 TIMED_WAITING (객체 모니터에) : 마이클의 제안에 따라는
, 나는 쓰레드 덤프를 쳐다 보면서, 주어진 순간에 있었다
- 16 TIMED_WAITING (자) (오브젝트 모니터)
- 23 WAITING
- 40 WAITING (주차)
차단 된 스레드의 흔적이 없습니다.
아이디어가 있으십니까?
시도합니다. 나는 공유 리소스가 필요 배타적 잠금이 있다고 가정합니다. –
@Michael, 스레드 덤프를 분석하는 데 많은 경험이 없습니다. 정확히 내가 뭘 찾고 있니? –
스레드 덤프를 가져 오는 간단한 방법 : jstack >> myapp.log./grep을 "잠금"으로 검색해야 할 때. 많은 쓰레기가있을 수 있습니다. 가능한 경우 pastebin을 통해 게시하는 것이 좋습니다. –