| PostgreSQL 8.3.3¹®¼ | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 25. µ¥ÀÌÅͺ£À̽º Ȱµ¿ °¨½Ã | Fast Forward | Next |
PostgreSQL´Â, µ¥ÀÌÅͺ£À̽º ¼¹öÀÇ µ¿Àû ÃßÀûÀ» Áö¿øÇÏ´Â ±â´ÉÀ» Á¦°øÇÕ´Ï´Ù. ÀÌ·Î ÀÎÇØ, ¿ÜºÎ À¯Æ¿¸®Æ¼¸¦ ÄÚµåÀÇ Æ¯Á¤ÀÇ Æ÷ÀÎÆ®·Î È£ÃâÇÒ ¼ö°¡ ÀÖ¾î ÃßÀûÀ» ½ÇÇàÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù. Çö½ÃÁ¡¿¡¼´Â, Äڵ忡 °üÇÑ »ó´çÇÑ Ä£¹Ð¼ºÀÌ ÇÊ¿äÇϱ⠶§¹®¿¡, ÀÌ ±â´ÉÀº ÁÖ·Î µ¥ÀÌÅͺ£À̽º °³¹ßÀÚ Àü¿ëÀ» ÀǵµÇϰí ÀÖ½À´Ï´Ù.
¸¹Àº ÃßÀû Æ÷ÀÎÆ®(Á¾Á¾ probes·Î ºÒ¸²)´Â ¼Ò½º ÄÚµå ³»¿¡ Á¸ÀçÇÕ´Ï´Ù. µðÆúÆ®¿¡¼´Â ÀÌ·¯ÇÑ ÇÁ·Îºê´Â ÀÌ¿ëÇÒ ¼ö ¾ø½À´Ï´Ù. ±×¸®°í À¯Àú´Â ¸í½ÃÀûÀ¸·Î ¼³Á¤ ½ºÅ©¸³Æ®¸¦ PostgreSQL¿¡¼ »ç¿ëÇÒ ¼ö ÀÖ´Â probes¸¦ ÀÛ¼ºÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.
ÇöÀç Solaris Express ¹× Solaris 10+¿¡¼ ÀÌ¿ë °¡´ÉÇÑ DTrace À¯Æ¿¸®Æ¼¸¸ÀÌ Áö¿øµÇ°í ÀÖ½À´Ï´Ù. DTrace´Â Àå·¡ FreeBSD³ª Mac OS X·Î ÀÌ¿ëµÉ ¼ö ÀÖÀ» °ÍÀ¸·Î ¿¹»óµÇ°í ÀÖ½À´Ï´Ù. ´Ù¸¥ µ¿Àû ÃßÀû À¯Æ¿¸®Æ¼ Áö¿øÀº ÀÌ·ÐÀûÀ¸·Î´Â src/include/pg_trace.hÀÇ PG_TRACE¸ÅÅ©·Î Á¤ÀǸ¦ º¯°æÇÔÀ¸·Î½á °¡´ÉÇÕ´Ï´Ù.
µðÆúÆ®¿¡¼´Â, ÃßÀû Æ÷ÀÎÆ®´Â ÀÌ¿ëÇÒ ¼ö ¾ø½À´Ï´Ù. ¶§¹®¿¡ PostgreSQLÀÌ probe¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖµµ·Ï ¼³Á¤ ½ºÅ©¸³Æ®¸¦ ¸í½ÃÀûÀ¸·Î ¼³Á¤ÇÏÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù. DTrace Áö¿ø¸¦ Æ÷ÇÔÇÏ·Á¸é, configure¿¡--enable-dtrace¸¦ ¸í½ÃÇÕ´Ï´Ù. ÀÚ¼¼ÇÑ Á¤º¸´Â Section 14.5À» ÂüÁ¶ÇØ Áֽʽÿä.
ÀϺΠǥÁØ ÃßÀû Æ÷ÀÎÆ®´Â ¼Ò½º Äڵ忡¼ Á¦°øµÇ°í ÀÖ½À´Ï´Ù. (¹°·Ð, ƯÁ¤ÇÑ ¹®Á¦¿¡ ÇÊ¿äÇÑ Æ÷ÀÎÆ®¸¦ Á» ´õ Ãß°¡ÇÏ´Â °ÍÀº °¡´ÉÇÔ) À̵éÀº 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 ¶ô) ¿ä±¸´Â ´ë±â »óŸ¦ Á¾·á(Áï, ¶ô ȹµæ) |
ÀÌÇÏÀÇ ¿¹´Â ½Ã½ºÅÛÀÇ Æ®·£Àè¼Ç(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
ÃßÀû ÇÁ·Î±×·¥ÀÇ ÀÛ¼º¿¡´Â ÁÖÀǰ¡ ÇÊ¿äÇϰí, »ç¿ë Àü¿¡ µð¹ö±×°¡ ÇÊ¿äÇÏ´Ù´Â °ÍÀ» ÀØÁö ¸»¾Æ Áֽʽÿä. ±×·¸Áö ¾ÊÀ¸¸é, ¼öÁýµÇ´Â ÃßÀû Á¤º¸ÀÇ Àǹ̰¡ ¾ø¾îÁúÁöµµ ¸ð¸¨´Ï´Ù. ´ëºÎºÐÀÇ °æ¿ì, ¹ß°ßµÇ´Â ¹®Á¦´Â ½Ã½ºÅÛÀÌ ¾Æ´Ñ »ç¿ë ¹æ¹ýÀÇ ½Ç¼öÀÔ´Ï´Ù. µ¿Àû ÃßÀûÀ» »ç¿ëÇØ ³íÀÇÇÒ Á¤º¸¸¦ ¹ß°ßÇÒ ¶§, °Ë»ç³ª Åä·ÐÀ» ÇÒ ¼ö ÀÖµµ·Ï ½ºÅ©¸³Æ®¸¦ Æ÷ÇÔ½ÃÄÑ Áֽʽÿä.
°³¹ßÀÚ°¡ ¿øÇϸé ÄÚµå ³»¿¡ »õ·Î¿î ÃßÀû Æ÷ÀÎÆ®¸¦ Á¤ÀÇÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ±×·¯³ª ÀÌ´Â ÀçÄÄÆÄÀÏÀÌ ÇÊ¿äÇÕ´Ï´Ù.
ÃßÀû Æ÷ÀÎÆ®´Â ÃßÀû ¸ÅÅ©·Î Áß Çϳª¸¦ »ç¿ëÇØ Ãß°¡ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ¾ó¸¶³ª ¸¹Àº º¯¼ö°¡ ÃßÀû Æ÷ÀÎÆ®ÀÇ °Ë»ç¿¡ °¡´ÉÇÑÁö¿¡ µû¶ó ¼±ÅûçÇ×ÀÌ Á¸ÀçÇÕ´Ï´Ù. À̺¥Æ® ¹ß»ýÀ» ÃßÀûÇÏ´Â °ÍÀº ÃßÀû Æ÷ÀÎÆ®¸í¸¸À» »ç¿ëÇØ ÇϳªÀÇ ÇàÀ¸·Î ½ÇÇöµÉ ¼ö ÀÖ½À´Ï´Ù.
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