테마
버거 본사 DB는 점심 11:30 ~ 13:00에 CPU가 100%에 붙는다. 하드 파싱 문제는 지난달에 정리해서 이제 거의 없는데도 그렇다. AWR 리포트의 대기 1위는 library cache: mutex X다.
회의에 대안 다섯이 올라왔다.
CURSOR_SHARING = FORCE를 켠다.SESSION_CACHED_CURSORS를 50에서 200으로 올린다.Statement Cache Size 0 → 150)를 켜고 재배포한다(2주 걸린다).ITEM 메뉴 조회, SHOP 매장 조회, ORD 1건, ORD_ITEM 2~3건 등). 점심 흐름에서 세션 하나가 되풀이해 쓰는 문장은 약 130개다.cpu_count = 16 · 공유 풀 3GB · session_cached_cursors = 50 · open_cursors = 300 · CURSOR_SHARING = EXACT// PosOrder.cs : 명령을 실행할 때마다 새로 만들고 버린다 (POS 문장 130개가 모두 이 모양)
using (var cmd = new OracleCommand("SELECT ITEM_NM, ITEM_TYPE_CD, SALE_YN FROM ITEM WHERE ITEM_ID = :item_id", conn))
{
cmd.Parameters.Add("item_id", OracleDbType.Int32).Value = itemId;
using (var rd = cmd.ExecuteReader()) { /* 메뉴 한 건 */ }
}
// 연결 문자열 : Statement Cache Size를 지정하지 않았다 (0)
// "User Id=pos;Data Source=BURGER;Pooling=false"
-- 지금 파라미터
-- session_cached_cursors = 50 · open_cursors = 300 · shared_pool_size = 3G · cpu_count = 16
[AWR · 12:00 ~ 13:00 · Load Profile (초당)]
DB Time 38.2
DB CPU 14.1
Executes (SQL) 6,240
Parses (SQL) 6,180
Hard parses (SQL) 0.3
Logical read 41,050
[Instance Efficiency]
Soft Parse % 99.99
Execute to Parse % 0.96
% Non-Parse CPU 63.40
Library Hit % 99.98
[Top Foreground Events]
이벤트 대기(초) % DB time
library cache: mutex X 51,570 37.5
DB CPU 50,760 36.9
cursor: pin S 19,530 14.2
cursor: mutex S 4,260 3.1
log file sync 3,300 2.4
[Instance Activity · 같은 한 시간]
execute count 22,464,000
parse count (total) 22,248,000
parse count (hard) 1,080
session cursor cache hits 2,470,000 (파싱의 11%)
session cursor cache count 세션마다 50 (설정값에 붙어 있다)
[SQL ordered by Parse Calls · 상위 셋]
Parse Calls Executions SQL
1,612,400 1,612,400 SELECT ITEM_NM, ITEM_TYPE_CD, SALE_YN FROM ITEM WHERE ITEM_ID = :item_id
1,108,900 1,108,900 INSERT INTO ORD_ITEM (ORD_NO, ITEM_ID, ORD_ITEM_QTY, ORD_DT, ORD_HMS) VALUES (:1, :2, :3, :4, :5)
402,300 402,300 SELECT SHOP_NM FROM SHOP WHERE SHOP_NO = :shop_no