:meta-keywords: install systemtap, systemtap marker, systemtap probe, systemtap event, systemtap script, connection markers, query markers, object operation markers, index operation markers, locking markers, transaction markers, I/O markers :meta-description: SystemTap is a tool that can be used to dynamically monitor and track the process of running, to find and diagnose performance bottlenecks; learn how to use CUBRID markers in SystemTap scripts. ********* SystemTap ********* 개요 ==== SystemTapì€ ì‹¤í–‰ ì¤‘ì¸ í”„ë¡œì„¸ìŠ¤ë¥¼ ë™ì 으로 모니터ë§í•˜ê³ ì¶”ì í• ìˆ˜ 있는 ë„구ì´ë‹¤. CUBRID는 SystemTapì„ ì§€ì›í•˜ë©°, ì´ë¥¼ 통해 성능 병목 현ìƒì˜ ì›ì¸ì„ 찾아낼 수 있다. SystemTap 스í¬ë¦½íŠ¸ì˜ ê¸°ë³¸ ì•„ì´ë””어는 ì´ë²¤íŠ¸ë¥¼ ëª…ëª…í•˜ê³ , ê±°ê¸°ì— í•¸ë“¤ëŸ¬ë¥¼ 부여하는 것ì´ë‹¤. 핸들러는 ì´ë²¤íŠ¸ê°€ ë°œìƒí• 때마다 í–‰í•´ì ¸ì•¼í• ìž‘ì—…ì„ ëª…ì‹œí•˜ëŠ” 스í¬ë¦½íЏ 문장ì´ë‹¤. SystemTapì„ ì‚¬ìš©í•˜ì—¬ CUBRIDì˜ ì„±ëŠ¥ì„ ëª¨ë‹ˆí„°ë§í•˜ë ¤ë©´ ë¨¼ì € SystemTapì„ ì„¤ì¹˜í•´ì•¼ 한다. 설치 ì´í›„ C 언어와 비슷한 SystemTap 스í¬ë¦½íŠ¸ë¥¼ 작성, 수행하여 ì‹œìŠ¤í…œì˜ ì„±ëŠ¥ì„ ëª¨ë‹ˆí„°ë§í• 수 있다. SystemTapì€ Linux OSì—서만 ì§€ì›í•œë‹¤. SystemTapì— ëŒ€í•œ ìžì„¸í•œ ë‚´ìš© ë° ì„¤ì¹˜ ë°©ë²•ì— ëŒ€í•´ì„œëŠ” http://sourceware.org/systemtap/index.html\ ì„ ì°¸ê³ í•œë‹¤. SystemTap 설치하기 ================== 설치 í™•ì¸ --------- 1. /etc/group 파ì¼ì— stapusr, stapdev 그룹 ê³„ì •ì´ ìžˆëŠ”ì§€ 확ì¸í•œë‹¤. ì´ ê³„ì •ì´ ì—†ìœ¼ë©´ 설치가 ë˜ì§€ ì•Šì€ ìƒíƒœì¼ 것ì´ë‹¤. 2. stapusr, stapdev 그룹 ê³„ì •ì— CUBRID를 ì„¤ì¹˜í• ë•Œ 사용한 ì‚¬ìš©ìž ê³„ì •ì„ ì¶”ê°€í•œë‹¤. 여기서는 cubridë¼ê³ ê°€ì •í•œë‹¤. :: $ vi /etc/group stapusr:x:156:cubrid stapdev:x:158:cubrid 3. SystemTapì˜ ìˆ˜í–‰ 가능 여부는 간단히 ë‹¤ìŒ ëª…ë ¹ì„ ì‹¤í–‰í•˜ì—¬ 확ì¸í• 수 있다. :: $ stap -ve 'probe begin { log("hello world") exit() }' ë²„ì „ ---- CUBRIDì—서 SystemTap 스í¬ë¦½íŠ¸ë¥¼ ì‹¤í–‰í•˜ë ¤ë©´ SystemTap 2.2 ì´ìƒ ë²„ì „ì„ ì‚¬ìš©í•´ì•¼ 한다. 다ìŒì€ CentOS 6.3ì—서 SystemTapì„ ì„¤ì¹˜í•œ 예ì´ë‹¤. ë²„ì „ í™•ì¸ ë° ì„¤ì¹˜ ë°©ë²•ì€ ê° Linux ë°°í¬íŒë§ˆë‹¤ 다를 수 있다. 1. 현재 ì„¤ì¹˜ëœ SystemTap ë²„ì „ì„ í™•ì¸í•œë‹¤. :: $ sudo yum list|grep systemtap systemtap.x86_64 1.7-5.el6_3.1 @update systemtap-client.x86_64 1.7-5.el6_3.1 @update systemtap-devel.x86_64 1.7-5.el6_3.1 @update systemtap-runtime.x86_64 1.7-5.el6_3.1 @update systemtap-grapher.x86_64 1.7-5.el6_3.1 update systemtap-initscript.x86_64 1.7-5.el6_3.1 update systemtap-sdt-devel.i686 1.7-5.el6_3.1 update systemtap-sdt-devel.x86_64 1.7-5.el6_3.1 update systemtap-server.x86_64 1.7-5.el6_3.1 update systemtap-testsuite.x86_64 1.7-5.el6_3.1 update 2. SystemTap 2.2 미만 ë²„ì „ì´ ì„¤ì¹˜ë˜ì–´ 있다면 ì‚ì œí•œë‹¤. :: $ sudo yum remove systemtap-runtime $ sudo yum remove systemtap-devel $ sudo yum remove systemtap 3. SystemTap 2.2 ì´ìƒ ë²„ì „ì˜ RPM ë°°í¬ íŒ¨í‚¤ì§€ë¥¼ 설치한다. RPM ë°°í¬ íŒ¨í‚¤ì§€ëŠ” (http://rpmfind.net/linux/rpm2html/)ì—서 ì°¾ì„ ìˆ˜ 있다. :: $ sudo rpm -ivh systemtap-devel-2.3-3.el6.x86_64.rpm $ sudo rpm -ivh systemtap-runtime-2.3-3.el6.x86_64.rpm $ sudo rpm -ivh systemtap-client-2.3-3.el6.x86_64.rpm $ sudo rpm -ivh systemtap-2.3-3.el6.x86_64.rpm ê´€ë ¨ 용어 ========= .. https://sourceware.org/systemtap/wiki/UsingMarkers 마커(Marker) ------------ 코드 ì•ˆì— ìœ„ì¹˜í•˜ëŠ” 마커는 실행 ì¤‘ì— ì œê³µí• ìˆ˜ 있는 함수(프로브)를 호출하기 위한 í›…(hook)ì„ ì œê³µí•œë‹¤. 마커가 ë°œë™ë 때마다 사용ìžê°€ ì œê³µí•œ 함수가 호출ë˜ê³ , 해당 함수가 종료ë˜ë©´ 호출ìžì—게 ëŒì•„온다. 마커 ë°œë™ ì‹œ 사용ìžê°€ ì •ì˜í•˜ëŠ” 함수, 즉 프로브는 ì¶”ì ë° ì„±ëŠ¥ ì¸¡ì •ì„ ìœ„í•´ 사용ë 수 있다. 프로브(Probe) ------------- 프로브(probe)는 ì–´ë–¤ ì´ë²¤íŠ¸ê°€ ë°œìƒí–ˆì„ ë•Œì˜ ë™ìž‘ì„ ì •ì˜í•˜ëŠ” ì¼ì¢…ì˜ í•¨ìˆ˜ë¡œì„œ, ì´ë²¤íŠ¸ì™€ 핸들러로 나뉜다. SystemTap 스í¬ë¦½íЏì—는 íŠ¹ì • ì´ë²¤íЏ, 즉 마커가 ë°œìƒí• ë•Œì˜ ë™ìž‘ì„ ì •ì˜í•œë‹¤. SystemTap 스í¬ë¦½íŠ¸ëŠ” 여러 ê°œì˜ í”„ë¡œë¸Œë¥¼ 가질 수 있으며, í”„ë¡œë¸Œì˜ í•¸ë“¤ëŸ¬ëŠ” 프로브 바디(probe body)ë¼ê³ 불린다. SystemTap 스í¬ë¦½íŠ¸ëŠ” ì½”ë“œì˜ ìž¬ì»´íŒŒì¼ ì—†ì´ ê³„ì¸¡ ì½”ë“œì˜ ì‚½ìž…ì„ í—ˆìš©í•˜ë©° í•¸ë“¤ëŸ¬ì— ê´€í•´ ë” ë§Žì€ ìœ ì—°ì„±ì„ ì œê³µí•œë‹¤. ì´ë²¤íŠ¸ëŠ” 핸들러가 실행하ë„ë¡ íŠ¸ë¦¬ê±°ë¡œ ë™ìž‘한다. 핸들러는 ë°ì´í„°ë¥¼ 기ë¡í•˜ê³ ê·¸ê²ƒì„ ì¶œë ¥í•˜ë„ë¡ ëª…ì‹œë 수 있다. CUBRIDê°€ ì œê³µí•˜ëŠ” 마커는 :ref:`cubrid-marker`\ 를 ì°¸ê³ í•œë‹¤. .. https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/5/html-single/SystemTap_Beginners_Guide/#systemtapscript-events 비ë™ê¸° ì´ë²¤íЏ ------------- 비ë™ê¸° ì´ë²¤íŠ¸ëŠ” ë‚´ë¶€ì—서 ì •ì˜ëœ 것으로, 코드ì—서 íŠ¹ì • 작업ì´ë‚˜ ìœ„ì¹˜ì— ì˜ì¡´ì ì´ì§€ 않다. ì´ëŸ¬í•œ ê³„ì—´ì˜ í”„ë¡œë¸Œ ì´ë²¤íŠ¸ëŠ” 주로 ì¹´ìš´í„°, 타ì´ë¨¸ 등ì´ë‹¤. 비ë™ê¸° ì´ë²¤íŠ¸ì˜ ì˜ˆëŠ” 다ìŒê³¼ 같다. * begin SystemTap ì„¸ì…˜ì˜ ì‹œìž‘. 예) SystemTapì´ ì‹œìž‘í•˜ëŠ” 순간. * end SystemTap ì„¸ì…˜ì˜ ë. * timer events 핸들러가 주기ì 으로 실행ë˜ëŠ” ê²ƒì„ ëª…ì‹œí•˜ëŠ” ì´ë²¤íЏ. 예) 5초마다 "hello world"를 ì¶œë ¥í•œë‹¤. :: probe timer.s(5) { printf("hello world\n") } CUBRIDì—서 SystemTap 사용하기 ============================= CUBRID 소스 빌드 ---------------- SystemTap ì€ ë¦¬ëˆ…ìŠ¤ì—서만 ì‚¬ìš©í• ìˆ˜ 있다. CUBRID 소스를 빌드해 SystemTapì„ ì‚¬ìš©í•˜ë ¤ë©´ **ENABLE_SYSTEMTAP** ì„ **ON** (기본값)으로 ì„¤ì •í•œë‹¤. ì´ ì˜µì…˜ì€ ë¦´ë¦¬ì¦ˆ ë¹Œë“œì— í¬í•¨ë˜ì–´ 있으며, CUBRID 소스 파ì¼ì„ 빌드하지 ì•Šê³ ì¸ìŠ¤í†¨ 패키지를 ì´ìš©í•˜ì—¬ 설치한 사용ìžë¼ë„ SystemTap 스í¬ë¦½íŠ¸ë¥¼ ì´ìš©í• 수 있다. 다ìŒì€ CUBRIDì˜ ì†ŒìŠ¤ë¥¼ 빌드하는 예ì´ë‹¤. :: build.sh -m release SystemTap 스í¬ë¦½íЏ 실행 ----------------------- CUBRIDì—서 SystemTap 스í¬ë¦½íЏ ì˜ˆì œëŠ” $CUBRID/share/systemtap ì´í•˜ ë””ë ‰í„°ë¦¬ì— ì œê³µí•˜ê³ ìžˆë‹¤. 다ìŒì€ buffer_access.stp 파ì¼ì„ 수행하는 ëª…ë ¹ì˜ ì˜ˆì´ë‹¤. :: cd $CUBRID/share/systemtap/tapset/scripts stap -k buffer_access.stp -o result.txt ê²°ê³¼ ì¶œë ¥ --------- íŠ¹ì • 스í¬ë¦½íŠ¸ë¥¼ 수행하면, 스í¬ë¦½íŠ¸ì— ê¸°ë¡í•œ ì½”ë“œì— ì˜í•´ 필요한 ì •ë³´ë¥¼ ì½˜ì†”ì— ì¶œë ¥í•œë‹¤. -o *filename* ì˜µì…˜ì„ ëª…ì‹œí•˜ëŠ” 경우 해당 ì˜µì…˜ì— ëª…ì‹œí•œ *filename*\ ì— ê²°ê³¼ë¥¼ 기ë¡í•œë‹¤. 다ìŒì€ 앞서 ë³´ì¸ ì˜ˆì œì˜ ì¶œë ¥ ê²°ê³¼ì´ë‹¤. :: Page buffer hit count: 172 Page buffer miss count: 172 Miss ratio: 50 .. _cubrid-marker: CUBRID 마커 =========== SystemTapì˜ ê°€ìž¥ ìœ ìš©í•œ ê¸°ëŠ¥ì€ ë§ˆì»¤ë¥¼ ì‚¬ìš©ìž ì†ŒìŠ¤ 코드(CUBRID 코드) ì•ˆì— ì‚½ìž…í• ìˆ˜ 있다는 ì ê³¼ ì´ ë§ˆì»¤ì— ë‹¤ë‹¤ë¥¼ 때 ë°œë™í•˜ëŠ” 프로브를 스í¬ë¦½íЏì—서 ìž‘ì„±í• ìˆ˜ 있다는 ì ì´ë‹¤. ì—°ê²° 마커 --------- ì¼ì • 기간 ë™ì•ˆ ì—°ê²° 활ë™(ì—°ê²° 개수, ì—°ê²° ì§€ì† ì‹œê°„, í‰ê· ì—°ê²° ì§€ì† ì‹œê°„, 최대 ì—°ê²° íšë“ 개수 등)ê³¼ ê´€ë ¨ëœ ë¶„ì„ì— ë„ì›€ì´ ë˜ëŠ” ì •ë³´ë¥¼ 수집하는 ê²ƒì€ ê´€ì‹¬ì´ ê°€ëŠ” ì¼ì´ë‹¤. ì´ëŸ¬í•œ ëª¨ë‹ˆí„°ë§ ìŠ¤í¬ë¦½íŠ¸ë¥¼ 작성하기 위해서는 ì—°ê²° 시작 마커와 ì—°ê²° ë 마커가 필요하다. .. function:: conn_start(connection_id, user) 서버ì—서 ì§ˆì˜ ì‹¤í–‰ì´ ì‹œìž‘ë˜ë©´ ì´ ë§ˆì»¤ê°€ ë°œë™ëœë‹¤. :param connection_id: ì—°ê²° ID를 í¬í•¨í•œ ì •ìˆ˜ê°’ :param user: ì—°ê²°ì˜ ì‚¬ìš©ìž ì´ë¦„. .. function:: conn_end(connection_id, user) 서버ì—서 ì§ˆì˜ ì‹¤í–‰ì´ ë나면 ì´ ë§ˆì»¤ê°€ ë°œë™ëœë‹¤. :param connection_id: ì—°ê²° ID를 í¬í•¨í•œ ì •ìˆ˜ê°’ :param user: ì—°ê²°ì˜ ì‚¬ìš©ìž ì´ë¦„ ì§ˆì˜ ë§ˆì»¤ --------- ì´ë²¤íЏ ê´€ë ¨ ì§ˆì˜ ì‹¤í–‰ì„ ìœ„í•œ 마커로서, ë¹„ë¡ ì „ì²´ ì‹œìŠ¤í…œì— ê´€ë ¨ëœ ì „ì²´(global) ì •ë³´ë¥¼ í¬í•¨í•˜ì§€ëŠ” 않지만 ëª¨ë‹ˆí„°ë§ ìž‘ì—…ì—서 매우 ìœ ìš©í•˜ë‹¤. ì ì–´ë„ ì•„ëž˜ ë‘ ê°œì˜ ë§ˆì»¤ëŠ” 가장 ê¸°ë³¸ì´ ë˜ëŠ” 것ì´ë‹¤. ì§ˆì˜ ì‹¤í–‰ì˜ ì‹œìž‘ê³¼ 종료 ì‹œì— ê°ê° 해당 마커가 ë°œë™ëœë‹¤. .. function:: query_exec_start(query_string, query_id, connection_id, user) 서버ì—서 ì§ˆì˜ ì‹¤í–‰ì´ ì‹œìž‘ë˜ë©´ ì´ ë§ˆì»¤ê°€ ë°œë™ëœë‹¤. :param query_string: ì‹¤í–‰í• ì§ˆì˜ë¥¼ 나타내는 문ìžì—´ :param query_id: ì§ˆì˜ ì‹ë³„ìž :param connection_id: ì—°ê²° ì‹ë³„ìž :param user: ì—°ê²°í• ë•Œ 사용하는 ì‚¬ìš©ìž ì´ë¦„ .. function:: query_exec_end(query_string, query_id, connection_id, user, status) 서버ì—서 ì§ˆì˜ ì‹¤í–‰ì´ ë나면 ì´ ë§ˆì»¤ê°€ ë°œë™ëœë‹¤. :param query_string: ì‹¤í–‰í• ì§ˆì˜ë¥¼ 나타내는 문ìžì—´ :param query_id: ì§ˆì˜ ì‹ë³„ìž :param connection_id: ì—°ê²° ì‹ë³„ìž :param user: ì—°ê²°í• ë•Œ 사용하는 ì‚¬ìš©ìž ì´ë¦„ :param status: ì§ˆì˜ ì‹¤í–‰ 시 반환 ìƒíƒœ(Success, Error) ê°ì²´ ì—°ì‚° 마커 -------------- ì €ìž¥ ì—”ì§„ì„ í¬í•¨í•˜ëŠ” ì—°ì‚°ë“¤ì€ ì¹˜ëª…ì ì´ë©° í…Œì´ë¸”ì´ë‚˜ ê°ì²´ 수준ì—서 ì—…ë°ì´íŠ¸ë¥¼ 조사하는 것(probing)ì€ ë°ì´í„°ë² ì´ìŠ¤ì˜ ë™ìž‘ì„ ëª¨ë‹ˆí„°ë§í•˜ëŠ” ë° í° ë„ì›€ì´ ëœë‹¤. ê°ì²´ê°€ 매번 INSERT/UPDATE/DELETEë 때마다 마커가 ë°œë™ë˜ëŠ”ë°, ì´ ì ì€ ëª¨ë‹ˆí„°ë§ ìŠ¤í¬ë¦½íŠ¸ì™€ 서버 둘 ë‹¤ì— ì„±ëŠ¥ ìƒ ì•½ì ì´ ë 수 있다. .. function:: obj_insert_start(table) ì´ ë§ˆì»¤ëŠ” ê°ì²´ê°€ 삽입ë˜ê¸° ì „ì— ë°œë™ëœë‹¤. :param table: ì´ ì—°ì‚°ì˜ ëŒ€ìƒ í…Œì´ë¸” .. function:: obj_insert_end(table, status) ì´ ë§ˆì»¤ëŠ” ê°ì²´ê°€ ì‚½ìž…ëœ ì´í›„ì— ë°œë™ëœë‹¤. :param table: ì´ ì—°ì‚°ì˜ ëŒ€ìƒ í…Œì´ë¸” :param status: ì´ ì—°ì‚°ì˜ ì„±ê³µ 여부를 나타내는 ê°’ .. function:: obj_update_start(table) ì´ ë§ˆì»¤ëŠ” ê°ì²´ê°€ ê°±ì‹ ë˜ê¸° ì „ì— ë°œë™ëœë‹¤. :param table: ì´ ì—°ì‚°ì˜ ëŒ€ìƒ í…Œì´ë¸” .. function:: obj_update_end(table, status) ì´ ë§ˆì»¤ëŠ” ê°ì²´ê°€ ê°±ì‹ ëœ í›„ì— ë°œë™ëœë‹¤. :param table: ì´ ì—°ì‚°ì˜ ëŒ€ìƒ í…Œì´ë¸” :param status: ì´ ì—°ì‚°ì˜ ì„±ê³µ 여부를 나타내는 ê°’ .. function:: obj_deleted_start(table) ì´ ë§ˆì»¤ëŠ” ê°ì²´ê°€ ì‚ì œë˜ê¸° ì „ì— ë°œë™ëœë‹¤. :param table: ì´ ì—°ì‚°ì˜ ëŒ€ìƒ í…Œì´ë¸” .. function:: obj_delete_end(table, status) ì´ ë§ˆì»¤ëŠ” ê°ì²´ê°€ ì‚ì œëœ í›„ì— ë°œë™ëœë‹¤. :param table: ì´ ì—°ì‚°ì˜ íƒ€ê²Ÿ í…Œì´ë¸” :param status: ì´ ì—°ì‚°ì˜ ì„±ê³µ 여부를 나타내는 ê°’ ì¸ë±ìФ ì—°ì‚° 마커 ---------------- ìœ„ì˜ ë§ˆì»¤ëŠ” í…Œì´ë¸” 기반 마커ì´ê³ , 다ìŒì€ ì¸ë±ìФ 기반 마커ì´ë‹¤. ìž˜ëª»ëœ ì¸ë±ìŠ¤ì˜ ì‚¬ìš©ì€ ì‹œìŠ¤í…œì—서 ë§Žì€ ë¬¸ì œë¥¼ ìœ ë°œí•˜ëŠ” ì›ì¸ì´ ë 수 있으며, ì¸ë±ìŠ¤ë¥¼ 모니터ë§í• 수 있다는 ì ì€ ë§¤ìš° ìœ ìš©í•˜ë‹¤. 아래 ë§ˆì»¤ë“¤ì€ í…Œì´ë¸”ì—서 ì‚¬ìš©ëœ ë§ˆì»¤ì™€ 매우 ìœ ì‚¬í•œë°, ì¸ë±ìŠ¤ê°€ í…Œì´ë¸”ê³¼ ê°™ì€ ì—°ì‚°ì„ ì§€ì›í•˜ê¸° 때문ì´ë‹¤. .. function:: idx_insert_start(classname, index_name) ì´ ë§ˆì»¤ëŠ” B-Treeì— ì¸ë±ìФ 노드를 삽입하기 ì „ì— ë°œë™ëœë‹¤. :param classname: ëŒ€ìƒ ì¸ë±ìŠ¤ì˜ í…Œì´ë¸” ì´ë¦„ :param index_name: ëŒ€ìƒ ì¸ë±ìФ ì´ë¦„ .. function:: idx_insert_end(classname, index_name, status) ì´ ë§ˆì»¤ëŠ” B-Treeì— ì¸ë±ìФ 노드를 삽입한 ì´í›„ì— ë°œë™ëœë‹¤. :param classname: ëŒ€ìƒ ì¸ë±ìŠ¤ì˜ í…Œì´ë¸” ì´ë¦„ :param index_name: ëŒ€ìƒ ì¸ë±ìФ ì´ë¦„ :param status: ì—°ì‚°ì˜ ì„±ê³µ 여부를 나타내는 ê°’ .. function:: idx_update_start(classname, index_name) ì´ ë§ˆì»¤ëŠ” B-Treeì—서 ì¸ë±ìФ 노드를 ê°±ì‹ í•˜ê¸° ì „ì— ë°œë™ëœë‹¤. :param classname: ëŒ€ìƒ ì¸ë±ìŠ¤ì˜ í…Œì´ë¸” ì´ë¦„ :param index_name: ëŒ€ìƒ ì¸ë±ìФ ì´ë¦„ .. function:: idx_update_end(classname, index_name, status) ì´ ë§ˆì»¤ëŠ” B-Treeì—서 ì¸ë±ìФ 노드를 ê°±ì‹ í•œ ì´í›„ì— ë°œë™ëœë‹¤. :param classname: ëŒ€ìƒ ì¸ë±ìŠ¤ì˜ í…Œì´ë¸” ì´ë¦„ :param index_name: ëŒ€ìƒ ì¸ë±ìФ ì´ë¦„ :param status: ì—°ì‚°ì˜ ì„±ê³µ 여부를 나타내는 ê°’ .. function:: idx_delete_start(classname, index_name) ì´ ë§ˆì»¤ëŠ” B-Treeì—서 ì¸ë±ìФ 노드를 ì‚ì œí•˜ê¸° ì „ì— ë°œë™ëœë‹¤. :param classname: ëŒ€ìƒ ì¸ë±ìŠ¤ì˜ í…Œì´ë¸” ì´ë¦„ :param index_name: ëŒ€ìƒ ì¸ë±ìФ ì´ë¦„ .. function:: idx_delete_end(classname, index_name, status) ì´ ë§ˆì»¤ëŠ” B-Treeì—서 ì¸ë±ìФ 노드를 ì‚ì œí•œ í›„ì— ë°œë™ëœë‹¤. :param classname: ëŒ€ìƒ ì¸ë±ìŠ¤ì˜ í…Œì´ë¸” ì´ë¦„ :param index_name: ëŒ€ìƒ ì¸ë±ìФ ì´ë¦„ :param status: ì—°ì‚°ì˜ ì„±ê³µ 여부를 나타내는 ê°’ ìž ê¸ˆ(locking) 마커 ------------------ ìž ê¸ˆ ì´ë²¤íŠ¸ë¥¼ í¬í•¨í•˜ëŠ” 마커는 ì•„ë§ˆë„ ì „ì²´ë¥¼ 모니터ë§í•˜ëŠ” 작업ì—서 가장 ì¤‘ìš”í• ê²ƒì´ë‹¤. ìž ê¸ˆ ì‹œìŠ¤í…œì€ ì„œë²„ ì„±ëŠ¥ê³¼ì— í° ì˜í–¥ì„ ë¼ì¹˜ë©°, ìž ê¸ˆ 대기 시간 ë° ì¹´ìš´íŠ¸(êµì°© ìƒíƒœ ë° íšŒí”¼ëœ íŠ¸ëžœìžì…˜ 개수)는 ë¬¸ì œë¥¼ ì°¾ëŠ”ë° ë§¤ìš° ìœ ìš©í•˜ë‹¤. .. function:: lock_acquire_start(OID, table, type) ì´ ë§ˆì»¤ëŠ” ìž ê¸ˆì´ ìš”ì²ë˜ê¸° ì „ì— ë°œë™ëœë‹¤. :param OID: ìž ê¸ˆ ìš”ì² ëŒ€ìƒ ê°ì²´ ID :param table: ê°ì²´ë¥¼ ìœ ì§€í•˜ê³ ìžˆëŠ” í…Œì´ë¸” :param type: ìž ê¸ˆ 타입(X_LOCK, S_LOCK 등) .. function:: lock_acquire_end(OID, table, type) ì´ ë§ˆì»¤ëŠ” ìž ê¸ˆ ìš”ì²ì´ ì™„ë£Œëœ ì´í›„ì— ë°œë™ëœë‹¤. :param OID: ìž ê¸ˆ ìš”ì² ëŒ€ìƒ ê°ì²´ ID :param table: ê°ì²´ë¥¼ ìœ ì§€í•˜ê³ ìžˆëŠ” í…Œì´ë¸” :param type: ìž ê¸ˆ 타입(X_LOCK, S_LOCK etc.) :param status: Value showing whether the request has been granted or not. .. function:: lock_release_start(OID, table, type) ì´ ë§ˆì»¤ëŠ” ìž ê¸ˆì´ í•´ì œëœ ì´í›„ì— ë°œë™ëœë‹¤. :param OID: ìž ê¸ˆ ìš”ì² ëŒ€ìƒ ê°ì²´ ID :param table: ê°ì²´ë¥¼ ìœ ì§€í•˜ê³ ìžˆëŠ” í…Œì´ë¸” :param type: ìž ê¸ˆ 타입(X_LOCK, S_LOCK etc.) .. function:: lock_release_end(OID, table, type) This marker should be triggered after a lock release operation has been completed. :param OID: ìž ê¸ˆ ìš”ì² ëŒ€ìƒ ê°ì²´ ID :param table: ê°ì²´ë¥¼ ìœ ì§€í•˜ê³ ìžˆëŠ” í…Œì´ë¸” :param type: ìž ê¸ˆ 타입(X_LOCK, S_LOCK etc.) 트랜ìžì…˜ 마커 ------------- 서버 모니터ë§ì—서 관심있게 ë´ì•¼ í• ì¸¡ì • 대ìƒì€ 트랜ìžì…˜ì˜ 활ë™ì´ë‹¤. 간단한 예로, 트랜ìžì…˜ì´ ì·¨ì†Œëœ ê°œìˆ˜ëŠ” êµì°© ìƒíƒœê°€ ë°œìƒí•œ 개수와 ë°€ì ‘í•˜ê²Œ ê´€ë ¨ë˜ì–´ 있으며, 매우 중요한 성능 ì‹ë³„ìžë¼ í• ìˆ˜ 있다. ë˜ ë‹¤ë¥¸ ì§ê´€ì ì¸ ì‚¬ìš© 예는 간단한 SystemTap 스í¬ë¦½íŠ¸ë¥¼ 사용하여 TPS와 ê°™ì€ ì‹œìŠ¤í…œ 성능 통계를 수집하는 ë°©ë²•ì„ ë‹¨ìˆœí™”í•˜ëŠ” 것ì´ë‹¤. .. function:: tran_commit(tran_id) ì´ ë§ˆì»¤ëŠ” 트랜ìžì…˜ì´ 성공ì 으로 ì™„ë£Œëœ ì´í›„ì— ë°œë™ëœë‹¤. :param tran_id: 트랜ìžì…˜ ì‹ë³„ìž .. function:: tran_abort(tran_id, status) ì´ ë§ˆì»¤ëŠ” 트랜ìžì…˜ì´ 중단(abort)ëœ ì´í›„ì— ë°œë™ëœë‹¤. :param tran_id: 트랜ìžì…˜ ì‹ë³„ìž :param status: 종료 ìƒíƒœ .. function:: tran_start(tran_id) ì´ ë§ˆì»¤ëŠ” 트랜ìžì…˜ì´ ì‹œìž‘ëœ ì´í›„ì— ë°œë™ëœë‹¤. :param tran_id: 트랜ìžì…˜ ì‹ë³„ìž .. function:: tran_deadlock() ì´ ë§ˆì»¤ëŠ” êµì°©ìƒíƒœê°€ ê°ì§€ëœ ì´í›„ì— ë°œë™ëœë‹¤. I/O 마커 -------- I/O 액세스는 RDBMSì˜ ì£¼ìš” 병목(bottleneck)ì´ë©°, I/O ì„±ëŠ¥ì„ ëª¨ë‹ˆí„°ë§í•˜ëŠ” 마커가 ì œê³µë˜ì–´ì•¼ 한다. ì´ ë§ˆì»¤ë¥¼ 통해 사용ìžëŠ” I/O 페ì´ì§€ 액세스 ì‹œê°„ì„ ì¸¡ì •í•˜ê³ , ì´ ì¸¡ì •ì— ê¸°ë°˜í•˜ì—¬ ë‹¤ì–‘í•˜ê³ ë³µìž¡í•œ 통계를 ì§‘ê³„í• ìˆ˜ 있다. .. function:: pgbuf_hit() ì´ ë§ˆì»¤ëŠ” 페ì´ì§€ 버í¼ì—서 ìš”ì² íŽ˜ì´ì§€ê°€ 발견ë˜ì–´ 디스í¬ì—서 ê·¸ê²ƒì„ ê²€ìƒ‰í• í•„ìš”ê°€ ì—†ì„ ë•Œ ë°œë™ëœë‹¤. .. function:: pgbuf_miss() ì´ ë§ˆì»¤ëŠ” 페ì´ì§€ 버í¼ì—서 ìš”ì² íŽ˜ì´ì§€ê°€ 발견ë˜ì§€ 않아 디스í¬ì—서 ê·¸ê²ƒì„ ê²€ìƒ‰í•´ì•¼ í• ë•Œ ë°œë™ëœë‹¤. .. function:: io_write_start (query_id) ì´ ë§ˆì»¤ëŠ” 디스í¬ì— 페ì´ì§€ë¥¼ 기ë¡í•˜ëŠ” 프로세스가 ì‹œìž‘í• ë•Œ ë°œë™ëœë‹¤. :param query_id: ì§ˆì˜ ì‹ë³„ìž .. function:: io_write_end(query_id, size, status) ì´ ë§ˆì»¤ëŠ” 디스í¬ì— 페ì´ì§€ë¥¼ 기ë¡í•˜ëŠ” 프로세스가 종료ë 때 ë°œë™ëœë‹¤. :param query_id: ì§ˆì˜ ì‹ë³„ìž :param size: 기ë¡ë˜ëŠ” ë°”ì´íЏ 수 :param status: ì—°ì‚°ì´ ì„±ê³µì 으로 종료ë˜ì—ˆëŠ”ì§€ 여부를 나타내는 ê°’ .. function:: io_read_start(query_id) ì´ ë§ˆì»¤ëŠ” 디스í¬ì—서 페ì´ì§€ë¥¼ ì½ëŠ” ìž‘ì—…ì´ ì‹œìž‘ë 때 ë°œë™ëœë‹¤. :param query_id: ì§ˆì˜ ì‹ë³„ìž .. function:: io_read_end (query_id, size, status) ì´ ë§ˆì»¤ëŠ” 디스í¬ì—서 페ì´ì§€ë¥¼ ì½ëŠ” ìž‘ì—…ì´ ì¢…ë£Œë 때 ë°œë™ëœë‹¤. :param query_id: ì§ˆì˜ ì‹ë³„ìž :param size: ì½ì€ ë°”ì´íЏ 수 :param status: ì—°ì‚°ì´ ì„±ê³µì 으로 종료ë˜ì—ˆëŠ”ì§€ 여부를 나타내는 ê°’ 기타 마커 --------- .. function:: sort_start () ì´ ë§ˆì»¤ëŠ” ì •ë ¬ ì—°ì‚°ì´ ì‹œìž‘ë 때 ë°œë™ëœë‹¤. .. function:: sort_end (nr_rows, status) ì´ ë§ˆì»¤ëŠ” ì •ë ¬ ì—°ì‚°ì´ ì™„ë£Œë 때 ë°œë™ëœë‹¤. :param nr_rows: ì •ë ¬ë˜ëŠ” í–‰ì˜ ê°œìˆ˜ :param status: ì—°ì‚°ì´ ì„±ê³µì 으로 종료ë˜ì—ˆëŠ”ì§€ 여부