by 하라 [SQLServer] latch lock 래치 락 cpu 성능 퍼포먼스 performance [2018.05.29 00:23:36]
시스템 구성 설명
시스템 구성 3군대의 어플리케이션 서버에서 (always on 2 db server (primary > stand by) 프라이머리 DB 쪽으로 업무처리가 들어옵니다.
이 중 19시에서 21시 사이쯤에 일괄 집계 처리가(4만건 정도 oltp 제외) 들어오는데요
isolation level 은 read commited 이며
select 도중 변경작업을 막기위해 단발성 sql 이지만 해당 로우에 대해서 lock 을 걸고 select를 합니다.
집계쿼리는 특정 단말기를 기준으로 하루 판매량을 집계한 일판매총액이며 시간대별로 자동 배치와 수동집계가 함께 들어옵니다.
증상 및 로그분석 내용
특정날에만 sql 서버의 cpu 사용률이 비정상적으로 증가를 하였습니다.
메모리 사용률, 피지컬리드, 로지컬리드, 네트웍 트래픽은 정상적인 날과 비교하였을 경우 전부 정상입니다만
cpu 점유대기시간, cpu 사용률 만 증가한 로그를 확인하였습니다.
확장 이벤트 로그만 봤을경우는 정상적인 전날과 동일한 시간대로 비교했을 시 약 10배의 [latch_ex(exclusive) 배타적 래치 와] --래치의 CPU 점유시간
락이걸린 대상 단일 object(테이블)에 대해서 shared lock 대상은(page(블럭)) 이 관찰이 되었습니다.
정확한 로그를 올려야지 맞는 상황이지만.. 보안 때문에 올릴수가 없네요...
질문
1. mssql 에서 latch_ex 와 shared lock(page) 핫페이지의 반복 액세스에 따른 latch spin이 cpu 의 점유율을 올올린게 아닌가 하는 결론을 내리고 있습니다만 latch_ex 와 shared_lock(page)가 cpu 점유율에 미치는 연관성에 대해서 자세히 아시는분이 있으시면 조언을 구합니다.
2. 오라클에서 처럼
select * from
(select child#, gets, sleeps from v$latch_children
where name = 'cache buffer chains'
order by sleeps desc
) where rownum <= 20;
select hladdr, obj,
(select object_name from dba_objects where
(data_object_id is null and object_id = x.obj) or
data_object_id = x.obj and rownum = 1) as object_name,
dbarfil, dbablk, tch from x$bh x
where hladdr in
('C0000000CDFF24F0','C0000000CE3ADDF0','C0000000CDF18A98')
order by hladdr, obj;
핫블럭을 조회할 수 있는지요?