<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
	<id>http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Monitorov%C3%A1n%C3%AD_lwlocku_pomoc%C3%AD_systemtapu</id>
	<title>Monitorování lwlocku pomocí systemtapu - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Monitorov%C3%A1n%C3%AD_lwlocku_pomoc%C3%AD_systemtapu"/>
	<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Monitorov%C3%A1n%C3%AD_lwlocku_pomoc%C3%AD_systemtapu&amp;action=history"/>
	<updated>2026-05-12T22:37:10Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>http://postgres.cz/index.php?title=Monitorov%C3%A1n%C3%AD_lwlocku_pomoc%C3%AD_systemtapu&amp;diff=549&amp;oldid=prev</id>
		<title>imported&gt;Pavel v 22. 2. 2014, 16:53</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Monitorov%C3%A1n%C3%AD_lwlocku_pomoc%C3%AD_systemtapu&amp;diff=549&amp;oldid=prev"/>
		<updated>2014-02-22T16:53:52Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Trochu jsem zápasil - jednak se svojí neznalostí systemtapu, druhak s tím, že se DTRACE interface v PostgreSQL 9.4 změnil - přičemž stap skripty pro Postgres, které jsou na internetu jsou samozřejmě pro starší verze (jedu na developerské 9.4). Ve starších verzích má popis zámku 2 parametry, v 9.4 tři - přičemž nový je první parametr. Navíc přibyly nové zámky - a změnili se rozsahy dynamické a LockMgr zámky.&lt;br /&gt;
&lt;br /&gt;
* http://www.postgresql.org/docs/9.3/static/dynamic-trace.html&lt;br /&gt;
* http://www.postgresql.org/docs/devel/static/dynamic-trace.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
stap -L &amp;#039;process(&amp;quot;postgres&amp;quot;).mark(&amp;quot;*&amp;quot;)&amp;#039;&lt;br /&gt;
&lt;br /&gt;
global query_time, query_summary&lt;br /&gt;
&lt;br /&gt;
probe process(&amp;quot;postgres&amp;quot;).mark(&amp;quot;query__start&amp;quot;) {&lt;br /&gt;
  query_time[tid(), $arg1] = gettimeofday_us();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
probe process(&amp;quot;postgres&amp;quot;).mark(&amp;quot;query__done&amp;quot;) {&lt;br /&gt;
  p = tid()&lt;br /&gt;
  t = query_time[p, $arg1]; delete query_time[p, $arg1]&lt;br /&gt;
  if (t) {&lt;br /&gt;
    query_summary[p] &amp;lt;&amp;lt;&amp;lt; (gettimeofday_us() - t);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
probe end {&lt;br /&gt;
  printf(&amp;quot;\ntid count min(us) avg(us) max(us)\n&amp;quot;);&lt;br /&gt;
  foreach (p in query_summary) {&lt;br /&gt;
    printf(&amp;quot;%d %d %d %d %d\n&amp;quot;, p, @count(query_summary[p]),&lt;br /&gt;
     @min(query_summary[p]), @avg(query_summary[p]), @max(query_summary[p]));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
probe process (&amp;quot;postgres&amp;quot;).mark(&amp;quot;query__done&amp;quot;) {&lt;br /&gt;
	now = gettimeofday_us()&lt;br /&gt;
	t = tid()&lt;br /&gt;
	if ([t, $arg1] in livequeries) {&lt;br /&gt;
		delta = now - livequeries[t, $arg1]&lt;br /&gt;
		query = user_string($arg1)&lt;br /&gt;
		completequeries[query] &amp;lt;&amp;lt;&amp;lt; delta&lt;br /&gt;
		delete livequeries[t, $arg1]&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
probe end {&lt;br /&gt;
  foreach (p in jit_summary) {&lt;br /&gt;
    printf(&amp;quot;tid = %d\n&amp;quot;, p)&lt;br /&gt;
    print(@hist_log(jit_summary[p]))&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/stap&lt;br /&gt;
&lt;br /&gt;
# pglockwaits systemtap version &lt;br /&gt;
# based on pglockwaits_84.d by Jignesh Shah&lt;br /&gt;
# modified for 9.4&lt;br /&gt;
&lt;br /&gt;
## Global variables&lt;br /&gt;
#&lt;br /&gt;
global lckmode, lckid, lwlock, tlwlock, waiting&lt;br /&gt;
&lt;br /&gt;
probe begin&lt;br /&gt;
{&lt;br /&gt;
	lckmode[0] = &amp;quot;Exclusive&amp;quot;&lt;br /&gt;
	lckmode[1] = &amp;quot;Shared&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	lckid[0] = &amp;quot;BufFreelistLock&amp;quot;&lt;br /&gt;
	lckid[1] = &amp;quot;ShmemIndexLock&amp;quot;&lt;br /&gt;
	lckid[2] = &amp;quot;OidGenLock&amp;quot;&lt;br /&gt;
	lckid[3] = &amp;quot;XidGenLock&amp;quot;&lt;br /&gt;
	lckid[4] = &amp;quot;ProcArrayLock&amp;quot;&lt;br /&gt;
	lckid[5] = &amp;quot;SInvalReadLock&amp;quot;&lt;br /&gt;
	lckid[6] = &amp;quot;SInvalWriteLock&amp;quot;&lt;br /&gt;
	lckid[7] = &amp;quot;WALInsertLock&amp;quot;&lt;br /&gt;
	lckid[8] = &amp;quot;WALWriteLock&amp;quot;&lt;br /&gt;
	lckid[9] = &amp;quot;ControlFileLock&amp;quot;&lt;br /&gt;
	lckid[10] = &amp;quot;CheckpointLock&amp;quot;&lt;br /&gt;
	lckid[11] = &amp;quot;CLogControlLock&amp;quot;&lt;br /&gt;
	lckid[12] = &amp;quot;SubtransControlLock&amp;quot;&lt;br /&gt;
	lckid[13] = &amp;quot;MultiXactGenLock&amp;quot;&lt;br /&gt;
	lckid[14] = &amp;quot;MultiXactOffsetControlLock&amp;quot;&lt;br /&gt;
	lckid[15] = &amp;quot;MultiXactMemberControlLock&amp;quot;&lt;br /&gt;
	lckid[16] = &amp;quot;RelCacheInitLock&amp;quot;&lt;br /&gt;
	lckid[17] = &amp;quot;BgWriterCommLock&amp;quot;&lt;br /&gt;
	lckid[18] = &amp;quot;TwoPhaseStateLock&amp;quot;&lt;br /&gt;
	lckid[19] = &amp;quot;TablespaceCreateLock&amp;quot;&lt;br /&gt;
	lckid[20] = &amp;quot;BtreeVacuumLock&amp;quot;&lt;br /&gt;
	lckid[21] = &amp;quot;AddinShemInitLock&amp;quot;&lt;br /&gt;
	lckid[22] = &amp;quot;AutovacuumLock&amp;quot;&lt;br /&gt;
	lckid[23] = &amp;quot;AutovacuumScheduleLock&amp;quot;&lt;br /&gt;
	lckid[24] = &amp;quot;SyncScanLock&amp;quot;&lt;br /&gt;
	lckid[25] = &amp;quot;RelationMappingLocks&amp;quot;&lt;br /&gt;
	lckid[26] = &amp;quot;AsyncCtlLock&amp;quot;&lt;br /&gt;
	lckid[27] = &amp;quot;AsyncQueueLock&amp;quot;&lt;br /&gt;
	lckid[28] = &amp;quot;SerializableXactHashLock&amp;quot;&lt;br /&gt;
	lckid[29] = &amp;quot;SerializableFinishedListLock&amp;quot;&lt;br /&gt;
	lckid[30] = &amp;quot;SerializablePredicateLockListLock&amp;quot;&lt;br /&gt;
	lckid[31] = &amp;quot;OldSerXidLock&amp;quot;&lt;br /&gt;
	lckid[32] = &amp;quot;SyncRepLock&amp;quot;&lt;br /&gt;
	lckid[33] = &amp;quot;BackgroundWorkerLock&amp;quot;&lt;br /&gt;
	lckid[34] = &amp;quot;DynamicSharedMemoryControlLock&amp;quot;&lt;br /&gt;
	lckid[35] = &amp;quot;AutoFileLock&amp;quot;&lt;br /&gt;
	lckid[36] = &amp;quot;ReplicationSlotAllocationLock&amp;quot;&lt;br /&gt;
	lckid[37] = &amp;quot;ReplicationSlotControlLock&amp;quot;&lt;br /&gt;
	lckid[38] = &amp;quot;IndividualLock &amp;quot;&lt;br /&gt;
	lckid[54] = &amp;quot;LockMgrLocks&amp;quot;&lt;br /&gt;
	lckid[70] = &amp;quot;DynamicLocks&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
probe process(&amp;quot;/usr/local/pgsql/bin/postgres&amp;quot;).mark(&amp;quot;lwlock__wait__start&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
	lwlock[$arg1, $arg2, tid()] = gettimeofday_us()&lt;br /&gt;
&lt;br /&gt;
	if ($arg2 &amp;lt; 38)&lt;br /&gt;
		ln = lckid[$arg2]&lt;br /&gt;
	else if ($arg2 &amp;gt;= 38 &amp;amp;&amp;amp; $arg2 &amp;lt; 54)&lt;br /&gt;
		ln = lckid[38]&lt;br /&gt;
	else if ($arg2 &amp;gt;= 54 &amp;amp;&amp;amp; $arg2 &amp;lt; 70)&lt;br /&gt;
		ln = lckid[54]&lt;br /&gt;
	else&lt;br /&gt;
		ln = lckid[70]&lt;br /&gt;
&lt;br /&gt;
	waiting[ln, $arg3]++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
probe process(&amp;quot;/usr/local/pgsql/bin/postgres&amp;quot;).mark(&amp;quot;lwlock__wait__done&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
	p = tid(); t = gettimeofday_us()&lt;br /&gt;
&lt;br /&gt;
	if ( [$arg1, $arg2, p] in lwlock) {&lt;br /&gt;
		if ($arg2 &amp;lt; 38)&lt;br /&gt;
			ln = lckid[$arg2]&lt;br /&gt;
		else if ($arg2 &amp;gt;= 38 &amp;amp;&amp;amp; $arg2 &amp;lt; 54)&lt;br /&gt;
			ln = lckid[38]&lt;br /&gt;
		else if ($arg2 &amp;gt;= 54 &amp;amp;&amp;amp; $arg2 &amp;lt; 70)&lt;br /&gt;
			ln = lckid[54]&lt;br /&gt;
		else&lt;br /&gt;
			ln = lckid[70]&lt;br /&gt;
&lt;br /&gt;
		# pridani zaznamu do statistiky&lt;br /&gt;
		tlwlock[ln, $arg3] &amp;lt;&amp;lt;&amp;lt; t - lwlock[$arg1, $arg2, p]&lt;br /&gt;
		waiting[ln, $arg3]--&lt;br /&gt;
&lt;br /&gt;
		delete lwlock[$arg1, $arg2, p]&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# spusti se kazde 2 sec&lt;br /&gt;
probe timer.s(2)&lt;br /&gt;
{&lt;br /&gt;
	printf(&amp;quot;\n\nlight weight locks\n&amp;quot;)&lt;br /&gt;
	printf(&amp;quot;%20s %10s %10s %10s\n&amp;quot;,&lt;br /&gt;
				&amp;quot;lockname&amp;quot;, &amp;quot;mode&amp;quot;, &amp;quot;count&amp;quot;, &amp;quot;avg&amp;quot;)&lt;br /&gt;
	foreach ([l,m] in tlwlock-)&lt;br /&gt;
		printf(&amp;quot;%20s %10s %10d %10d\n&amp;quot;, l, lckmode[m],&lt;br /&gt;
					@count(tlwlock[l,m]),  @avg(tlwlock[l,m]))&lt;br /&gt;
	# delete tlwlock&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;\n\still waiting\n&amp;quot;)&lt;br /&gt;
	foreach ([l,m] in waiting)&lt;br /&gt;
		printf(&amp;quot;%20s %10s %10d\n&amp;quot;, &lt;br /&gt;
					l, lckmode[m], waiting[l,m])&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
a pak po spuštění&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@localhost data]# stap /home/pavel/pglockwaits.stp &lt;br /&gt;
&lt;br /&gt;
light weight locks&lt;br /&gt;
            lockname       mode      count        avg&lt;br /&gt;
     IndividualLock      Shared         11          7&lt;br /&gt;
     IndividualLock   Exclusive         11          7&lt;br /&gt;
        WALWriteLock  Exclusive          4       5410&lt;br /&gt;
       ProcArrayLock     Shared          1          9&lt;br /&gt;
    BgWriterCommLock  Exclusive          1          7&lt;br /&gt;
        DynamicLocks     Shared          1         10&lt;br /&gt;
&lt;br /&gt;
still waiting&lt;br /&gt;
     IndividualLock      Shared          0&lt;br /&gt;
     IndividualLock   Exclusive          0&lt;br /&gt;
        WALWriteLock  Exclusive          0&lt;br /&gt;
        DynamicLocks     Shared          0&lt;br /&gt;
       ProcArrayLock     Shared          0&lt;br /&gt;
    BgWriterCommLock  Exclusive          0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
light weight locks&lt;br /&gt;
            lockname       mode      count        avg&lt;br /&gt;
     IndividualLock      Shared         11          7&lt;br /&gt;
     IndividualLock   Exclusive         11          7&lt;br /&gt;
        WALWriteLock  Exclusive          4       5410&lt;br /&gt;
       ProcArrayLock     Shared          1          9&lt;br /&gt;
    BgWriterCommLock  Exclusive          1          7&lt;br /&gt;
        DynamicLocks     Shared          1         10&lt;br /&gt;
&lt;br /&gt;
still waiting&lt;br /&gt;
     IndividualLock      Shared          0&lt;br /&gt;
     IndividualLock   Exclusive          0&lt;br /&gt;
        WALWriteLock  Exclusive          0&lt;br /&gt;
        DynamicLocks     Shared          0&lt;br /&gt;
       ProcArrayLock     Shared          0&lt;br /&gt;
    BgWriterCommLock  Exclusive          0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>imported&gt;Pavel</name></author>
	</entry>
</feed>