Re: Why SyncOneBuffer does not called frequently? - Mailing list pgsql-general

From Xiong He
Subject Re: Why SyncOneBuffer does not called frequently?
Date
Msg-id tencent_7D1FF17D6BD3013B0BC67173@qq.com
Whole thread Raw
In response to Why SyncOneBuffer does not called frequently?  (高健 <luckyjackgao@gmail.com>)
List pgsql-general
This perhaps proves that the bgwriter  doesn't need to call the SyncOneBuffer again on the same buffer.<br /><br
/><div><divstyle="color:#909090;font-family:Arial Narrow;font-size:12px">------------------</div><div
style="font-size:14px;font-family:Verdana;color:#000;"><div><divstyle="font-family: 'lucida Grande', Verdana;
font-size:12px; line-height: 18px; ">Thanks&Regards,</div><div>Xiong He</div></div></div></div><div><div
style="font-size:12px;font-family: Arial Narrow;padding:2px 0 2px
0;">------------------ Original ------------------</div><divstyle="font-size:
12px;background:#efefef;padding:8px;"><div><b>From:</b> "Xiong He"<iihero@qq.com>;</div><div><b>Date: </b> Thu,
Nov1, 2012 07:40 AM</div><div><b>To: </b> "高健"<luckyjackgao@gmail.com>;
"pgsql-general"<pgsql-general@postgresql.org>;<wbr /></div><div></div><div><b>Subject: </b> Re: [GENERAL] Why
SyncOneBufferdoes not called frequently?</div></div><div><br /></div>HI, <br /><br />I just debug the code, find that
thefollowing stack will call the SyncOneBuffer.<br /><br />>    postgres.exe!SyncOneBuffer(int buf_id=2, char
skip_recently_used=0) Line 1640    C<br />     postgres.exe!BufferSync(int flags=64)  Line 1284 + 0xb bytes    C<br
/>    postgres.exe!CheckPointBuffers(int flags=64)  Line 1801 + 0x9 bytes    C<br />    
postgres.exe!CheckPointGuts(XLogRecPtrcheckPointRedo={...}, int flags=64)  Line 8129 + 0x9 bytes    C<br />    
postgres.exe!CreateCheckPoint(intflags=64)  Line 7977 + 0x11 bytes    C<br />     postgres.exe!CheckpointerMain()  Line
505+ 0x9 bytes    C<br />     postgres.exe!AuxiliaryProcessMain(int argc=2, char * * argv=0x002f6fb8)  Line 429    C<br
/>    postgres.exe!SubPostmasterMain(int argc=4, char * * argv=0x002f6fb0)  Line 4136 + 0x13 bytes    C<br />    
postgres.exe!main(intargc=4, char * * argv=0x002f6fb0)  Line 176 + 0xd bytes    C<br />    
postgres.exe!__tmainCRTStartup() Line 582 + 0x19 bytes    C<br />     postgres.exe!mainCRTStartup()  Line 399    C<br
/><br/>This is the check point background process.<br /><br /><br /><br /><div><div
style="color:#909090;font-family:ArialNarrow;font-size:12px">------------------</div><div
style="font-size:14px;font-family:Verdana;color:#000;"><div><divstyle="font-family: 'lucida Grande', Verdana;
font-size:12px; line-height: 18px; ">Thanks&Regards,</div><div style="font-family: 'lucida Grande', Verdana;
font-size:12px; line-height: 18px; ">Xiong He<br /><br /></div></div></div></div><div> </div><div><div><br
/></div><div><br/></div><div style="font-size: 12px;font-family: Arial Narrow;padding:2px 0 2px 0;">------------------
Original------------------</div><div style="font-size: 12px;background:#efefef;padding:8px;"><div><b>From:
</b> "高健"<luckyjackgao@gmail.com>;</div><div><b>Date:</b> Wed, Oct 31, 2012 04:53 PM</div><div><b>To:
</b> "pgsql-general"<pgsql-general@postgresql.org>;<wbr /></div><div></div><div><b>Subject: </b> [GENERAL] Why
SyncOneBufferdoes not called frequently?</div></div><div><br /></div><div>Hi all:</div><div><br /></div><div>I am
tryingto understand when the bgwriter is written.</div><div><br /></div><div>I thought that the  bgwriter.c's calling
turnis:</div><div><br /></div><div>BackgroundWriterMain ->BgBufferSync-> SyncOneBuffer</div><div><br
/></div><div>AndIn my postgresql.conf , the bgwriter_delay=200ms.</div><div><br /></div><div>I did the
following:</div><div><br/></div><div>postgres=# select * from testtab;</div><div> id |  val
 </div><div>----+-------</div><div> 1 | 12345</div><div>(1 row)</div><div><br /></div><div>postgres=# update testtab
setval='54321' where id=1;</div><div>UPDATE 1</div><div>postgres=# select * from testtab;</div><div> id |  val
 </div><div>----+-------</div><div> 1 | 54321</div><div>(1 row)</div><div><br /></div><div>postgres=# </div><div><br
/></div><div>NowI can say the buffer is dirty ,right?</div><div><br /></div><div>I wait for a few minutes, I can found
bgwriter'sBackgroundWriterMain called BgBufferSync many times.</div><div><br /></div><div>But I can't find BgBufferSync
reallycall SyncOneBuffer to put the dirty data todisk.</div><div><br /></div><div>Untill I close the postgres process,
Ican find the SyncOneBuffer is called for many times.</div><div><br /></div><div>My question is: </div><div>Why even
thereare dirty buffer(s), the SyncOneBuffer is still not called?  </div><div>Is it violating the background writer's
purpose?</div><div><br /></div><div>Or the flushing to disk will be done untill  the amount of block/buffer is
satisfied?If so , what is it?</div><div><br /></div><div>Thanks in advance for any help</div></div></div> 

pgsql-general by date:

Previous
From: Edson Richter
Date:
Subject: Re: dropdb breaks replication?
Next
From: "Xiong He"
Date:
Subject: Re: Why PGDLLIMPORT is needed