25.4. µ¿Àû ÃßÀû

PostgreSQL´Â, µ¥ÀÌÅͺ£À̽º ¼­¹öÀÇ µ¿Àû ÃßÀûÀ» Áö¿øÇÏ´Â ±â´ÉÀ» Á¦°øÇÕ´Ï´Ù. ÀÌ·Î ÀÎÇØ, ¿ÜºÎ À¯Æ¿¸®Æ¼¸¦ ÄÚµåÀÇ Æ¯Á¤ÀÇ Æ÷ÀÎÆ®·Î È£ÃâÇÒ ¼ö°¡ ÀÖ¾î ÃßÀûÀ» ½ÇÇàÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù. Çö½ÃÁ¡¿¡¼­´Â, Äڵ忡 °üÇÑ »ó´çÇÑ Ä£¹Ð¼ºÀÌ ÇÊ¿äÇϱ⠶§¹®¿¡, ÀÌ ±â´ÉÀº ÁÖ·Î µ¥ÀÌÅͺ£À̽º °³¹ßÀÚ Àü¿ëÀ» ÀǵµÇϰí ÀÖ½À´Ï´Ù.

¸¹Àº ÃßÀû Æ÷ÀÎÆ®(Á¾Á¾ probes·Î ºÒ¸²)´Â ¼Ò½º ÄÚµå ³»¿¡ Á¸ÀçÇÕ´Ï´Ù. µðÆúÆ®¿¡¼­´Â ÀÌ·¯ÇÑ ÇÁ·Îºê´Â ÀÌ¿ëÇÒ ¼ö ¾ø½À´Ï´Ù. ±×¸®°í À¯Àú´Â ¸í½ÃÀûÀ¸·Î ¼³Á¤ ½ºÅ©¸³Æ®¸¦ PostgreSQL¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â probes¸¦ ÀÛ¼ºÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.

ÇöÀç Solaris Express ¹× Solaris 10+¿¡¼­ ÀÌ¿ë °¡´ÉÇÑ DTrace À¯Æ¿¸®Æ¼¸¸ÀÌ Áö¿øµÇ°í ÀÖ½À´Ï´Ù. DTrace´Â Àå·¡ FreeBSD³ª Mac OS X·Î ÀÌ¿ëµÉ ¼ö ÀÖÀ» °ÍÀ¸·Î ¿¹»óµÇ°í ÀÖ½À´Ï´Ù. ´Ù¸¥ µ¿Àû ÃßÀû À¯Æ¿¸®Æ¼ Áö¿øÀº ÀÌ·ÐÀûÀ¸·Î´Â src/include/pg_trace.hÀÇ PG_TRACE¸ÅÅ©·Î Á¤ÀǸ¦ º¯°æÇÔÀ¸·Î½á °¡´ÉÇÕ´Ï´Ù.

25.4.1. µ¿Àû ÃßÀûÀ» À§ÇÑ ÄÄÆÄÀÏ

µðÆúÆ®¿¡¼­´Â, ÃßÀû Æ÷ÀÎÆ®´Â ÀÌ¿ëÇÒ ¼ö ¾ø½À´Ï´Ù. ¶§¹®¿¡ PostgreSQLÀÌ probe¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖµµ·Ï ¼³Á¤ ½ºÅ©¸³Æ®¸¦ ¸í½ÃÀûÀ¸·Î ¼³Á¤ÇÏÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù. DTrace Áö¿ø¸¦ Æ÷ÇÔÇÏ·Á¸é, configure¿¡--enable-dtrace¸¦ ¸í½ÃÇÕ´Ï´Ù. ÀÚ¼¼ÇÑ Á¤º¸´Â Section 14.5À» ÂüÁ¶ÇØ Áֽʽÿä.

25.4.2. ³»ÀåµÈ ÃßÀû Æ÷ÀÎÆ®

ÀϺΠǥÁØ ÃßÀû Æ÷ÀÎÆ®´Â ¼Ò½º Äڵ忡¼­ Á¦°øµÇ°í ÀÖ½À´Ï´Ù. (¹°·Ð, ƯÁ¤ÇÑ ¹®Á¦¿¡ ÇÊ¿äÇÑ Æ÷ÀÎÆ®¸¦ Á» ´õ Ãß°¡ÇÏ´Â °ÍÀº °¡´ÉÇÔ) À̵éÀº Table 25-3¿¡¼­ º¸¿©Áý´Ï´Ù.

Table 25-3. ³»ÀåµÈ ÃßÀû Æ÷ÀÎÆ®

À̸§ ÆÄ¶ó¹ÌÅÍ °³¿ä
transaction__start (int transactionId) »õ·Î¿î Æ®·£Àè¼Ç(transaction) ½ÃÀÛ
transaction__commit (int transactionId) Æ®·£Àè¼Ç(transaction)ÀÇ Á¤»ó Á¾·á
transaction__abort (int transactionId) Æ®·£Àè¼ÇÀÇ ÀÌ»ó Á¾·á
lwlock__acquire (int lockid, int mode) LWLockÀÇ È¹µæ
lwlock__release (int lockid, int mode) LWLockÀÇ ÇØÁ¦
lwlock__startwait (int lockid, int mode) LWLockÀ» Áï½Ã ÀÌ¿ëÇÒ ¼ö ¾ø°í, backend°¡ ½ÃÀ۵Ǿî ÀÌ¿ëÇÒ ¼ö ÀÖÀ» ¶§±îÁö ¶ô ´ë±â
lwlock__endwait (int lockid, int mode) backend´Â LWLockÀÇ ´ë±â »óŸ¦ ÇØÁ¦½ÃÅ´
lwlock__condacquire (int lockid, int mode) caller°¡ ´ë±â ÇÏÁö ¾Êµµ·Ï ÁöÁ¤ÇßÀ» ¶§, LWLock ȹµæ ¼º°ø
lwlock__condacquire__fail (int lockid, int mode) caller°¡ ´ë±â ÇÏÁö ¾Êµµ·Ï ÁöÁ¤ÇßÀ» ¶§, LWLock ȹµæ ½ÇÆÐ
lock__startwait (int locktag_field2, int lockmode) ¶ôÀ» ÀÌ¿ëÇÒ ¼ö ¾ø±â ¶§¹®¿¡, heavyweight ¶ô(lmgr ¶ô)¿ä±¸¸¦ ´ë±âÇϵµ·Ï °³½Ã
lock__endwait (int locktag_field2, int lockmode) heavyweight ¶ô(lmgr ¶ô) ¿ä±¸´Â ´ë±â »óŸ¦ Á¾·á(Áï, ¶ô ȹµæ)

25.4.3. ÃßÀû Æ÷ÀÎÆ®ÀÇ ÀÌ¿ë

ÀÌÇÏÀÇ ¿¹´Â ½Ã½ºÅÛÀÇ Æ®·£Àè¼Ç(transaction) ¼ö¸¦ ÇØ¼®ÇÏ´Â DTrace ½ºÅ©¸³Æ®¸¦ ³ªÅ¸³À´Ï´Ù. ¼º´É ½ÃÇè ÀüÈÄ pg_stat_databaseÀÇ ½º³À¼¦ÀÌ ´ëü °¡´ÉÇÕ´Ï´Ù.

#!/usr/sbin/dtrace -qs 

postgresql$1:::transaction-start
{
      @start["Start"] = count();
      self->ts  = timestamp;
}

postgresql$1:::transaction-abort
{
      @abort["Abort"] = count();
}

postgresql$1:::transaction-commit
/self->ts/
{
      @commit["Commit"] = count();
      @time["Total time (ns)"] = sum(timestamp - self->ts);
      self->ts=0;
}

D½ºÅ©¸³Æ®¸¦ »ç¿ëÇÒ ¶§, ÃßÀû Æ÷ÀÎÆ®ÀÇ ÀÌÁß ¾ð´õ¶óÀÎÀ» ÇÏÀÌÇÂÀ¸·Î ¹Ù²ã¾ß ÇÔÀ» ÁÖÀÇÇϽʽÿä. ½ÇÇàÇϸé, ¿¹Á¦ÀÎ D½ºÅ©¸³Æ®´Â ÀÌÇÏ¿Í °°Àº Ãâ·ÂÀ» ÇÕ´Ï´Ù.

# ./txn_count.d `pgrep -n postgres`
^C

Start                                          71
Commit                                         70
Total time (ns)                        2312105013

ÃßÀû ÇÁ·Î±×·¥ÀÇ ÀÛ¼º¿¡´Â ÁÖÀǰ¡ ÇÊ¿äÇϰí, »ç¿ë Àü¿¡ µð¹ö±×°¡ ÇÊ¿äÇÏ´Ù´Â °ÍÀ» ÀØÁö ¸»¾Æ Áֽʽÿä. ±×·¸Áö ¾ÊÀ¸¸é, ¼öÁýµÇ´Â ÃßÀû Á¤º¸ÀÇ Àǹ̰¡ ¾ø¾îÁúÁöµµ ¸ð¸¨´Ï´Ù. ´ëºÎºÐÀÇ °æ¿ì, ¹ß°ßµÇ´Â ¹®Á¦´Â ½Ã½ºÅÛÀÌ ¾Æ´Ñ »ç¿ë ¹æ¹ýÀÇ ½Ç¼öÀÔ´Ï´Ù. µ¿Àû ÃßÀûÀ» »ç¿ëÇØ ³íÀÇÇÒ Á¤º¸¸¦ ¹ß°ßÇÒ ¶§, °Ë»ç³ª Åä·ÐÀ» ÇÒ ¼ö ÀÖµµ·Ï ½ºÅ©¸³Æ®¸¦ Æ÷ÇÔ½ÃÄÑ Áֽʽÿä.

25.4.4. ÃßÀû Æ÷ÀÎÆ®ÀÇ Á¤ÀÇ

°³¹ßÀÚ°¡ ¿øÇϸé ÄÚµå ³»¿¡ »õ·Î¿î ÃßÀû Æ÷ÀÎÆ®¸¦ Á¤ÀÇÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ±×·¯³ª ÀÌ´Â ÀçÄÄÆÄÀÏÀÌ ÇÊ¿äÇÕ´Ï´Ù.

ÃßÀû Æ÷ÀÎÆ®´Â ÃßÀû ¸ÅÅ©·Î Áß Çϳª¸¦ »ç¿ëÇØ Ãß°¡ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ¾ó¸¶³ª ¸¹Àº º¯¼ö°¡ ÃßÀû Æ÷ÀÎÆ®ÀÇ °Ë»ç¿¡ °¡´ÉÇÑÁö¿¡ µû¶ó ¼±ÅûçÇ×ÀÌ Á¸ÀçÇÕ´Ï´Ù. À̺¥Æ® ¹ß»ýÀ» ÃßÀûÇÏ´Â °ÍÀº ÃßÀû Æ÷ÀÎÆ®¸í¸¸À» »ç¿ëÇØ ÇϳªÀÇ ÇàÀ¸·Î ½ÇÇöµÉ ¼ö ÀÖ½À´Ï´Ù.

PG_TRACE (my__new__trace__point);

º¸´Ù º¹ÀâÇÑ ÃßÀû Æ÷ÀÎÆ®¿¡¼­´Â PG_TRACE n ¸ÅÅ©·Î¸¦ »ç¿ëÇØ, µ¿Àû ÃßÀû À¯Æ¿¸®Æ¼ÀÇ °Ë»ç¸¦ À§ÇØ Çϳª ÀÌ»óÀÇ º¯¼ö¸¦ Á¦°øÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ¿©±â¼­ ÃßÀû Æ÷ÀÎÆ®¸í µÚ¿¡´Â ´ëÀÀÇÏ´Â ÆÄ¶ó¹ÌÅͼö¸¦ ±âÀçÇÕ´Ï´Ù.

PG_TRACE3 (my__complex__event, varX, varY, varZ);

transaction__start ÃßÀû Æ÷ÀÎÆ®ÀÇ Á¤ÀǸ¦ ÀÌÇÏ¿¡ ³ªÅ¸³À´Ï´Ù.

static void
StartTransaction(void)
{
    ...

    /*
     * generate a new transaction id
     */
    s->transactionId = GetNewTransactionId(false);

    XactLockTableInsert(s->transactionId);

    PG_TRACE1(transaction__start, s->transactionId);

    ...
}    

Æ®·£Àè¼Ç(transaction) ID°¡ ¾î¶»°Ô µ¿Àû ÃßÀû À¯Æ¿¸®Æ¼·ÎºÎÅÍ ÀÌ¿ëÇÒ ¼ö ÀÖ´ÂÁö¸¦ ÁÖ¸ñÇØ Áֽʽÿä.

µ¿Àû ÃßÀû À¯Æ¿¸®Æ¼´Â ÃßÀû Æ÷ÀÎÆ®ÀÇ ÇÑÃþ ´õÇÑ Á¤ÀǸ¦ ¿ä±¸ÇÒ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¸é, DTrace´Â ¾Æ·¡¿¡¼­ º¸¿©Áö´Â °Í°ú °°ÀÌ »õ·Î¿î probe¸¦ src/backend/utils/probes.d¿¡ Ãß°¡ÇÏ´Â °ÍÀ» ¿ä±¸ÇÕ´Ï´Ù.

provider postgresql {
      ...
      probe transaction__start(int);
      ...
 };

probeÀÇ ÀÎÀÚ·Î ÁöÁ¤ÇÑ µ¥ÀÌÅÍ Å¸ÀÔÀÌ PG_TRACE¸ÅÅ©·Î·Î »ç¿ëµÇ´Â º¯¼öÀÇ µ¥ÀÌÅÍ Å¸ÀÔ°ú ÀÏÄ¡ÇÏ´Â °ÍÀ» ÁÖÀÇÇϽʽÿä. ÄÄÆÄÀϽÿ¡´Â °Ë»çµÇÁö ¾Ê½À´Ï´Ù. »õ·Ó°Ô Ãß°¡ÇÑ ÃßÀû Æ÷ÀÎÆ®°¡ ÀçÄÄÆÄÀÏ¿¡ ÀÇÇØ »ç¿ë °¡´ÉÇÑÁö¸¦ °Ë»çÇÒ ¼ö ÀÖ½À´Ï´Ù. ±× ÈÄ¿¡ »õ·Î¿î ¹ÙÀ̳ʸ®¸¦ root·Î¼­ ½ÇÇàÇϰí, ÀÌÇÏ¿Í °°Àº DTrace Ä¿¸àµå¸¦ ½ÇÇàÇØ Áֽʽÿä.

dtrace -l -n transaction-start