PostgreSQLぎč¨ēæ–­æ–šæŗ•-ã‚ĻナジミãƒŧãƒĢãƒœãƒ­ãƒ‡ã‚Ŗãƒŗã¨ã‚¤ãƒĢダ゚クãƒĢãƒãƒŗã‚ŦãƒĒエフ

2015嚴ぎPG Dayã‚Ģãƒŗãƒ•ã‚ĄãƒŦãƒŗã‚šã§æœ€ã‚‚äēēæ°—ãŽã‚ãŖãŸãƒŦポãƒŧトぎ1ã¤ã¯ã€åąæŠŸåžŒãŽæ‹ į‚šãŒį—…æ°—ãĢãĒãŖãŸå ´åˆãŽã‚ĻナジミãƒŧãƒĢãƒœãƒ­ãƒ‡ã‚Ŗãƒŗã¨ã‚¤ãƒĢダ゚クãƒĢãƒãƒŗã‚ŦãƒĒã‚¨ãƒ•ãŽčŠąã§ã‚ã‚Šã€ãã‚Œã‚‰ã‚’č¨ē断しãĻボトãƒĢネックをæŽĸすåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ ãƒŦポãƒŧトぎすずãĻぎ䞋は、原際ぎYandexぎ原čˇĩから取られãĻおり、イナ゚トと「botnek」ぎ検į´ĸãĢé–ĸã™ã‚‹čŠŗį´°ãĒ゚トãƒŧãƒĒãƒŧがæˇģえられãĻいぞす。 デãƒŧã‚ŋベãƒŧ゚ぎ9.4ãŠã‚ˆãŗ9.5バãƒŧã‚¸ãƒ§ãƒŗãŽã‚ŗãƒŗãƒ†ã‚­ã‚šãƒˆã§å•éĄŒãŒč€ƒæ…Žã•ã‚ŒãŸã¨ã„ã†äē‹åޟãĢもかかわらず、ã‚ĻナジミãƒŧãƒĢとイãƒĢダ゚ぎã‚ĸドバイ゚ぎ全äŊ“įš„ãĒäžĄå€¤ã¨åŽŸį”¨įš„ãĒéŠį”¨æ€§ã¯å¤‰ã‚ãŖãĻいぞせん。 こぎãƒŦポãƒŧトぎčģĸ写を提䞛しãĻ喜んでいぞす。

イãƒĒヤãƒģã‚ŗã‚šãƒĸãƒ‡ãƒŸãƒŖãƒŗã‚šã‚­ãƒŧãĢã‚ˆã‚‹į´šäģ‹ īŧšäģŠã€į§ãŸãĄã¯ã‚ãĒたがæœŦåŊ“ãĢã‚ĒナクãƒĢã‚’æŒãĄãŸã„ãĒã‚‰į”Ÿãã‚‹æ–šæŗ•ãĢついãĻãŽį‰ŠčĒžã‚’æŒãĄãžã™ãŒã€ãã†ã§ã¯ã‚ã‚Šãžã›ã‚“ã€‚ åŽŸéš›ã€ã“ã‚Œã¯æœ‰į”¨ãĒãƒŦポãƒŧトです。ãĒぜãĒã‚‰ã€įžåœ¨æŠąãˆãĻã„ã‚‹å•éĄŒãŽ1つはč¨ē断ツãƒŧãƒĢãŽå•éĄŒã ã‹ã‚‰ã§ã™ã€‚ 一部ぎ場所では、通常ぎč¨ē断ツãƒŧãƒĢぎäģŖã‚ã‚ŠãĢč¨ē断ツãƒŧãƒĢをäŊŋį”¨ã§ããžã›ã‚“ã€‚DBAではãĒくLinux開į™ēč€…å‘ã‘ãŽéžå¸¸ãĢ複雑ãĒツãƒŧãƒĢをäŊŋį”¨ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ DBAぎ歯は、これらぎ゚クãƒĒプトをčĻ‹ã‚‹ã¨å‚ˇã¤ãå§‹ã‚ãžã™ã€‚ ぞた、YandexとPG ProãŽãƒĄãƒŗãƒãƒŧは、äŊŋį”¨ã—ãĻいるPostgresぎč¨ēæ–­æ–šæŗ•ã€ãã‚Œã‚‰ãŽäŊŋį”¨æ–šæŗ•ã€ãŠã‚ˆãŗã“ãŽä¸–į•Œã‚’ãŠãŽã‚ˆã†ãĢ攚善するかãĢついãĻå°‘ã—čŠąã—ãžã™ã€‚



ã‚ĻナジミãƒŧãƒĢãƒģãƒœãƒ­ãƒ‡ã‚Ŗãƒŗ īŧšãŋãĒさん、こんãĢãĄã¯ã€‚ į§ãŽåå‰ã¯Vovaで、YandexãƒĄãƒŧãƒĢãŽįŽĄį†č€…ã§ã™ã€‚ ãƒŦポãƒŧトはIldusã¨å…ąåŒã§ã€Postgres ProでPostgreSQLを開į™ēしãĻいぞす。

Postgresč¨ē断ãƒŦポãƒŧトとそぎ重čρãĒãƒã‚¤ãƒŗãƒˆã¯å†™įœŸã§ã™ã€‚ ãƒŦポãƒŧトぎ最初ぎ部分は、äŊ•をすずきか、ãƒĸニã‚ŋãƒĒãƒŗã‚°ãŒå¤ąæ•—ã—ãŸå ´åˆãĢäŊ•をすずきかをčĒŦ明しãĻいぞす。



ã“ãŽå ´åˆã€ãŠã“ã§åŽŸčĄŒã—ãžã™ã‹īŧŸ ᛪčĻ–ãŽįˆ†į™ē-これは非常ãĢæŠŊčąĄįš„ãĒことで、デãƒŧã‚ŋベãƒŧ゚ãĢé–ĸ逪äģ˜ã‘ã‚‰ã‚ŒãŸį›ŖčĻ–ãŒįˆ†į™ēã—ãŸã“ã¨ã‚’æ„å‘ŗã—ãžã™ã€‚



Postgresはå„Ēれたデãƒŧã‚ŋベãƒŧã‚šã§ã‚ã‚‹ã¨č€ƒãˆãĻいぞす。 č‰¯ã„ãƒ‡ãƒŧã‚ŋベãƒŧ゚、それがすずãĻæ‚Ēいとき、それは原則としãĻäŊ•かぎ上ãĢįŊŽã‹ã‚Œãžã™ã€‚ ãģとんおぎ場合、これはäŊ•ã‚‰ã‹ãŽã‚ˇã‚šãƒ†ãƒ ãƒĒã‚Ŋãƒŧ゚です。 åŊŧåĨŗãĢはプロã‚ģッã‚ĩãƒŧがありぞせん。 åŊŧåĨŗãĢã¯ãƒ‡ã‚Ŗã‚šã‚¯ã‚‚ãƒãƒƒãƒˆãƒ¯ãƒŧクもありぞせん。 é‡ã„ãƒ­ãƒƒã‚¯ã€å›žįˇšãŽãƒ­ãƒƒã‚¯ã€ã‚ŋブãƒŦットãĒおãĢč€ãˆã‚‹ã“ã¨ãŒã§ããžã™ã€‚ しかし、ベãƒŧ゚がäģ–ぎäŊ•かãĢã‹ã‹ãŖãĻいる場合がありぞす。



åŒã˜ãƒ—ãƒ­ãƒ€ã‚¯ã‚ˇãƒ§ãƒŗã‹ã‚‰ãŽã„ãã¤ã‹ãŽå†™įœŸã€‚ ここで、たとえば、プロã‚ģッã‚ĩãĢįŊŽã‹ã‚ŒãŸ1つぎPostgresベãƒŧ゚ぎhtop。 Load Average 200、多数ぎã‚ģãƒƒã‚ˇãƒ§ãƒŗã€ãŠã‚ˆãŗãƒĻãƒŧã‚ļãƒŧįŠē間ぎプロã‚ģッã‚ĩ全äŊ“、これがį™ēį”Ÿã—ãžã™ã€‚



ベãƒŧ゚はホイãƒŧãƒĢãĢčŧ‰ã›ã‚‹ã“ともできぞす。 sgresで非常ãĢäēēæ°—ぎあるもぎ。 ä¸€å¯žãŽãƒ‡ã‚Ŗã‚šã‚¯ã§ãŽå샿Ŗ„はãģãŧ100īŧ…です。 å¤§é‡ãŽãƒ‡ã‚Ŗã‚šã‚¯čĒ­ãŋå–ã‚Šã‚’åž…ãĄãžã™ã€‚



ãƒ‡ã‚Ŗã‚šã‚¯ã¯iopsぞたは帯域嚅でįĩ‚わるだけでãĒく、掋åŋĩãĒがら所厚ぎäŊįŊŽã§įĩ‚わる可čƒŊ性がありぞす。 これは、xlogã‚ģã‚¯ã‚ˇãƒ§ãƒŗã§įĩ‚äē†ã—たデãƒŧã‚ŋベãƒŧã‚šãŽå†™įœŸã§ã™ã€‚



ベãƒŧ゚がネットワãƒŧク上ãĢあり、xlogをãƒŦプãƒĒã‚Ģ、ã‚ĸãƒŧã‚Ģイブ、ぞたはäģ–ぎ場所ãĢčģĸ送しãĻクナイã‚ĸãƒŗãƒˆã¸ãŽå›žį­”ã‚’ã€ŒåŽšãã€ã™ã‚‹įŠļæŗãŒã‚ã‚Šãžã™ã€‚



ãƒĄãƒĸãƒĒぎ場合、すずãĻãŒã‚ˆã‚Šč¤‡é›‘ã§ã™ã€‚ 原則としãĻã€å•éĄŒãŒãƒĄãƒĸãƒĒãĢあることはわかりぞせん。 ã‚ĒペãƒŦãƒŧãƒ†ã‚Ŗãƒŗã‚°ã‚ˇã‚šãƒ†ãƒ ãŽč¨­åŽšæ–šæŗ•ãĢåŋœã˜ãĻ、SWAPへぎクロãƒŧãƒĢã‚’é–‹å§‹ã—ã€ãƒ‡ã‚Ŗã‚šã‚¯ã‚ĸã‚¯ãƒ†ã‚Ŗãƒ“ãƒ†ã‚ŖãŽå•éĄŒã¨ã—ãĻこれをįĸēčĒã™ã‚‹ã‹ã€OOMãŒåˆ°į€ã—ãĻãƒãƒƒã‚¯ã‚¨ãƒŗãƒ‰ã‚’åŧˇåˆļįĩ‚äē†ã—、įĩæžœã¨ã—ãĻPostgres全äŊ“が判明しぞす。





これらはすずãĻ、Postgresぎ外部ぎツãƒŧãƒĢãĢã‚ˆãŖãĻ非常ãĢよくč¨ē断されぞす。 つぞり、お気ãĢå…Ĩりぎtop-likeãƒĻãƒŧãƒ†ã‚ŖãƒĒãƒ†ã‚Ŗã€dstat、iostatãĒおです。 į§ã¯ä¸ģãĢLinuxãĢついãĻčŠąã—ãžã™ã€‚ デãƒŧã‚ŋベãƒŧ゚が重いロックãĢįŊŽã‹ã‚ŒãĻã„ã‚‹å ´åˆã€ã“ãŽæƒ…å ąã¯PGロックをäģ‹ã—ãĻ襨į¤ēできぞす。ぞた、そこからぎå‡ēåŠ›ã‚’į›Žã§į°Ąå˜ãĢč§Ŗæžã§ãã‚‹ã‚ˆã†ãĢするãƒĒクエ゚トがいくつかありぞす。 しかし、それらはPostgres wikiã§ã‚ŗãƒŗãƒ‘ã‚¤ãƒĢされãĻいぞす。 åŽŸéš›ã€ä¸Šč¨˜ãŽäž‹ã¯ã™ãšãĻã‚’įžŽã—ãį¤ēしãĻいぞす。



įˆ†į™ēがį™ēį”Ÿã—ã€äŊ•かãĢ遭遇しぞした。 åŊŧらがäŧ‘んだもぎぎためãĢ、æ‚Ē魔はåŊŧをįŸĨãŖãĻいぞす。 ãģã¨ã‚“ãŠãŽå ´åˆã€ã“ãŽå›ŗãŽã‚ˆã†ãĢ、äŊ•かが変更されたり、äŊ•ã‹ãŒåą•é–‹ã•ã‚ŒãŸã‚Šã€ãƒ™ãƒŧã‚šãŽč˛ čˇãŒåĸ—加したり、čĻæą‚ãŽč¨ˆį”ģがãĒくãĒãŖãĻ、期垅おおりãĢ抟čƒŊしãĒくãĒãŖãŸã‚Šã—ãžã™ã€‚



バãƒŧã‚¸ãƒ§ãƒŗ9.4より前ãĢは、å„Ēれたpg_stat_statementsツãƒŧãƒĢがありぞした。 最も時間がかかるクエãƒĒを検į´ĸできぞす。 つぞり、ベãƒŧ゚が最も多くぎ時間をč˛ģやすクエãƒĒです。 さãĻ、それはすでãĢ標æē–であり、分析をčĒŦ明しãĻ、こぎ時間をおこで過ごすか、äŊ•をするかãĒおをįĸēčĒã—ãžã™ã€‚ ただし、デãƒŧã‚ŋベãƒŧ゚がクエãƒĒãŽåŽŸčĄŒãĢč˛ģã‚„ã™æ™‚é–“ã¯æœ€č‰¯ãŽæŒ‡æ¨™ã§ã¯ã‚ã‚Šãžã›ã‚“ã€‚ こぎ時間はさぞざぞãĒãƒĒã‚Ŋãƒŧ゚ãĢč˛ģやすことができぞす。 ãƒ‡ã‚Ŗã‚šã‚¯ã‹ã‚‰čĒ­ãŋå–ãŖãŸã‚Šã€ãƒ—ãƒ­ã‚ģッã‚ĩを「åŧˇåˆļ」したり、äŊ•かをã‚Ŋãƒŧトしたり、äŊ•らかぎロックを期垅したりできぞす。



9.4からは、pg_stat_kcacheとå‘ŧã°ã‚Œã‚‹į´ æ™´ã‚‰ã—ã„ã‚‚ãŽãŒã‚ã‚Šãžã—ãŸã€‚ã“ã‚ŒãĢより、ãƒĻãƒŧã‚ļãƒŧ時間でぎプロã‚ģッã‚ĩæļˆč˛ģã€ã‚ˇã‚šãƒ†ãƒ æ™‚é–“ã§ãŽãƒ—ãƒ­ã‚ģッã‚ĩæļˆč˛ģãĒお、ãƒĒクエ゚トぞでįĸēčĒã§ããžã™ã€‚ そしãĻ、åŊŧåĨŗãŒã§ãã‚‹éžå¸¸ãĢクãƒŧãƒĢãĒã“ã¨ã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ã‹ã‚‰ãŽį‰Šį†įš„ãĒčĒ­ãŋå–ã‚Šå€¤ã‚’å…ąæœ‰ã—ã€ã‚ĒペãƒŦãƒŧãƒ†ã‚Ŗãƒŗã‚°ã‚ˇã‚šãƒ†ãƒ ã‹ã‚‰ãƒšãƒŧã‚¸ã‚­ãƒŖãƒƒã‚ˇãƒĨデãƒŧã‚ŋを取垗することです。



いくつかぎ䞋。 たとえば、上äŊãŽã‚¯ã‚¨ãƒĒãĢé–ĸã™ã‚‹æƒ…å ąã‚‚čĄ¨į¤ēするクエãƒĒ。 įš°ã‚Ščŋ”しぞすが、時間でã‚ŊãƒŧトされãĻいぞす。 ã—ã‹ã—ã€ã‚ˇã‚šãƒ†ãƒ æ™‚é–“ã€ãƒĻãƒŧã‚ļãƒŧæ™‚é–“ã€ãƒ‡ã‚Ŗã‚šã‚¯ã‹ã‚‰ãŽæ›¸ãčžŧãŋ/čĒ­ãŋå–ã‚Šã€ãƒĄãƒĸãƒĒからぎ取垗量ãĒおでプロã‚ģッã‚ĩをおれだけæļˆč˛ģしたかもį¤ēしãĻいぞす。 これらぎãƒĒクエ゚トぎテキ゚トをčĻ‹ã‚‹ã“ã¨ãŒã§ããžã™ã€‚





ãƒĒクエ゚トč‡ĒäŊ“はæŦĄãŽã‚ˆã†ãĢãĒりぞす。 ã“ãŽãƒ†ã‚­ã‚šãƒˆã¯ã‚ŗãƒ”ãƒŧできぞす。 åŊŧはそれãģãŠč¤‡é›‘ã§ã¯ã‚ã‚Šãžã›ã‚“ã€‚ ここではすずãĻãŒį°Ąå˜ã§ã™ã€‚ ã“ãŽį‰šåŽšãŽã‚ąãƒŧ゚では、pg_stat_statements、pg_stat_kcacheからデãƒŧã‚ŋを取垗し、デãƒŧã‚ŋベãƒŧ゚がこぎãƒĒクエ゚トãĢč˛ģやした時間でã‚Ŋãƒŧトしぞす。



しかし、これはpg_stat_kcacheãŽæœ€å¤§ãŽåˆŠį‚šã§ã¯ã‚ã‚Šãžã›ã‚“ã€‚ ãƒ‡ã‚Ŗã‚šã‚¯ã‹ã‚‰ãŽčĒ­ãŋå–ã‚Šã€ãƒ‡ã‚Ŗã‚šã‚¯ã¸ãŽæ›¸ãčžŧãŋãĒおでã‚Ŋãƒŧトできぞす。 たとえば、同じpg_stat_statementsはshared_hitとshared_readã‚’å…ąæœ‰ã§ããžã™ã€‚ ã“ã‚Œã¯ã€å…ąæœ‰ãƒãƒƒãƒ•ã‚ĄãŠã‚ˆãŗããŽäģ–すずãĻからぎčĒ­ãŋå–ã‚Šã‚’æ„å‘ŗã—ãžã™ã€‚ それäģĨ外はすずãĻ、ã‚ĒペãƒŦãƒŧãƒ†ã‚Ŗãƒŗã‚°ã‚ˇã‚šãƒ†ãƒ ãŽãƒšãƒŧã‚¸ã‚­ãƒŖãƒƒã‚ˇãƒĨã‹ã‚‰å–åž—ã™ã‚‹ã“ã¨ã‚‚ã€ãƒ‡ã‚Ŗã‚šã‚¯ã‹ã‚‰į‰Šį†įš„ãĢ取垗することもできぞす。 pg_stat_kcacheはそれらを分é›ĸできぞす。 åŊŧはgetrusageīŧˆīŧ‰ã‚ˇã‚šãƒ†ãƒ ã‚ŗãƒŧãƒĢをäŊŋį”¨ã—ãĻã“ã‚Œã‚’čĄŒã„ãžã™ã€‚ã“ãŽã‚ˇã‚šãƒ†ãƒ ã‚ŗãƒŧãƒĢは、各ãƒĒクエ゚トぎ垌ãĢį—™æ”Ŗã—ãžã™ã€‚



たとえば、čĒ­ãŋå–ã‚Šå€¤ã‚’æŒã¤ãƒ‡ã‚Ŗã‚šã‚¯ä¸ŠãĢįŊŽã‹ã‚ŒãŸãƒ™ãƒŧ゚があり、そぎようãĒã‚‚ãŽã‚’æ§‹į¯‰ã—ãžã—ãŸã€‚ãƒ‡ã‚Ŗã‚šã‚¯ã‹ã‚‰ãŽį‰Šį†įš„ãĒčĒ­ãŋ取り値でã‚ŊãƒŧトするクエãƒĒです。 そしãĻã€ã“ã‚Œã‚‰ã¯į›¸å¯žįš„ãĒ値です。 ここでは、最上äŊãĢあるãƒĒクエ゚トがあることは明らかです。 数パãƒŧã‚ģãƒŗãƒˆãŒãƒ‡ã‚Ŗã‚šã‚¯ãĢåˆ°é”ã—ã€ãƒ‡ã‚Ŗã‚šã‚¯ã‹ã‚‰äŊ•かをčĒ­ãŋ取りぞす。 それäģĨ外ぎすずãĻã¯ã€å…ąæœ‰ãƒĄãƒĸãƒĒぞたはã‚ĒペãƒŦãƒŧãƒ†ã‚Ŗãƒŗã‚°ã‚ˇã‚šãƒ†ãƒ ãŽã‚­ãƒŖãƒƒã‚ˇãƒĨから提䞛されぞす。 つぞり、こぎデãƒŧã‚ŋベãƒŧã‚šãŽã‚­ãƒŖãƒƒã‚ˇãƒĨは非常ãĢåŠšæžœįš„ãĢ抟čƒŊしぞした。 9.4をäŊŋį”¨ã™ã‚‹å ´åˆã¯ã€åŋ…ずpg_stat_kcacheをäŊŋį”¨ã—ãĻください。



一čˆŦãĢį‰šåŽšãŽčĻæą‚ãĢã‚ˆãŖãĻæąē厚されãĒã„ã€ã‚ˆã‚Šč¤‡é›‘ãĒå•éĄŒãŒã‚ã‚Šãžã™ã€‚ たとえば、こぎようãĒå•éĄŒã€‚ 最初ぎįŸĸå°ã§ã€ãƒ‡ã‚Ŗã‚šã‚¯IOをåĸ—やしぞす。 į”ģ像ぎ中夎ãĢã‚ã‚‹ãƒ•ã‚ŖãƒŧãƒĢドぎčĒŦ明。 これらぎ2つぎ列はiopsです。 iopsを1万から10万ãĢåĸ—やしぞす。 そしãĻ、しばらくしãĻから、ベãƒŧã‚šã¯ã‚ˇã‚šãƒ†ãƒ æ™‚é–“ã§ãƒ—ãƒ­ã‚ģッã‚ĩ全äŊ“ã‚’æŽēし始めぞす。 ã“ãŽæ™‚į‚šã§ã€ã™ãšãĻがæ‚ĒくãĒり、一čˆŦįš„ãĢåŊŧåĨŗãŒäŊ•をしãĻいるかは明įĸēではありぞせん。 そしãĻ、pg_stat_statementsぞたはpg_stats_kcacheをčĻ‹ã‚‹ã¨ã€ã‚ˇã‚šãƒ†ãƒ æ™‚é–“ãĢã€ã‚ˇã‚šãƒ†ãƒ ãŒã™ãšãĻぎãƒĒã‚¯ã‚¨ã‚šãƒˆã‚’å°‘ã—ã§ã‚‚åŽŸčĄŒã™ã‚‹ã“ã¨ãŒã‚ã‹ã‚Šãžã™ã€‚ ã“ã‚Œã¯į‰šåŽšãŽã‚¯ã‚¨ãƒĒãŽå•éĄŒã§ã¯ã‚ã‚Šãžã›ã‚“ã€‚



プロã‚ģッã‚ĩãŒį„Ąé§„ãĢしãĻいるもぎをč¨ēæ–­ã™ã‚‹ãŸã‚ãŽį´ æ™´ã‚‰ã—ã„ãƒ‘ãƒ•ã‚Šãƒŧãƒžãƒŗã‚šãƒĻãƒŧãƒ†ã‚ŖãƒĒãƒ†ã‚ŖãŒã‚ã‚Šã€DBAやã‚ĢãƒŧネãƒĢ開į™ē者ãĢã¨ãŖãĻはäžŋ刊ではありぞせんが、ã‚ĩãƒŗãƒ—ãƒĒãƒŗã‚°ãĢã‚ˆãŖãĻ抟čƒŊし、æˆĻ闘プロã‚ģã‚šã‚’å‚ˇã¤ã‘ãžã›ã‚“ã€‚ é€šå¸¸ã€ã‚ˇã‚šãƒ†ãƒ ã‚’ã€Œåŧˇåˆļ」することはありぞせん。 そしãĻ、ここで、プロã‚ģッã‚ĩ時間ぎãģã¨ã‚“ãŠãŒã‚šãƒ”ãƒŗãƒ­ãƒƒã‚¯ãĢč˛ģやされãĻいることがわかりぞす。 同時ãĢ、最も可čƒŊ性がéĢ˜ã„ãŽã¯ã€čģŊ量ロックを取垗することです。 そしãĻ、最も可čƒŊ性がéĢ˜ã„ãŽã¯ã€ãƒãƒƒãƒ•ã‚Ąã‚­ãƒŖãƒƒã‚ˇãƒĨぎ領域です。 åŊŧらは、PinBuffer、UnpinBuffer、ReadBufferãĒおをå‘ŧãŗå‡ēしぞした。 こぎįĩčĢ–ãŽperf topをčĻ‹ã‚‹ã¨ã€ãƒ—ãƒ­ã‚ģã‚šãŒã‚ˇã‚šãƒ†ãƒ æ™‚é–“ãŽãŠã“ã§č˛ģやされãĻã„ã‚‹ã‹ã‚’į†č§Ŗã—ãŸã‚Šã€ãƒ‡ãƒŧã‚ŋベãƒŧã‚šå†…ã§æ­ŖįĸēãĢおこでč˛ģやされãĻいるかを推æ¸Ŧしたりできぞす。



åŒã˜ã‚šãƒ”ãƒŗãƒ­ãƒƒã‚¯ã‚’čĻ‹ã‚‹ã¨æ‚ĒいįŠļæŗãŒã‚ã‚Šãžã™ãŒã€åŒæ™‚ãĢã€ã“ãŽã‚šãƒ”ãƒŗãƒ­ãƒƒã‚¯ãŽå…Ĩ手元とそぎå‡Ļį†æ–šæŗ•ã¯æ˜Žįĸēではありぞせん。



ミãƒŧムį”ģ像があるはずです。 ã‚‚ãŖã¨æˇąãã€ãã“ã§äŊ•がčĩˇã“ãŖãĻいるぎか、äŊ•ãĢåŸēãĨいãĻいるぎかをčĻ‹ã‚‹ã“ã¨ãŒã§ããžã™ã€‚



これãĢはいくつかぎツãƒŧãƒĢがありぞす。 それらぎ1つは、dtraceとsystemtapīŧˆLinuxぎ場合īŧ‰ã§ã™ã€‚ ããŽåˆŠį‚šã¯ã€æ–‡å­—é€šã‚Šã™ãšãĻをčĻ‹ã‚‹ã“ã¨ãŒã§ãã‚‹ã“ã¨ã§ã™ã€‚ しかし、こぎためãĢã¯ã€ã„ãã¤ã‹ãŽã‚ŗãƒŧドを書くåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ これが最初です。 æŦĄãĢ、systemtapがPostgresãĢã‚ĸクã‚ģ゚できるようãĢPostgresã‚’å†æ§‹į¯‰ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ そしãĻæœ€å¤§ãŽå•éĄŒã¯ã€systemtapがおぎようãĒæĄäģļä¸‹ã§ã‚‚éŠį”¨ã§ããĒいことです。 č˛ čˇãƒ†ã‚šãƒˆį”¨ãŽã‚šã‚ŋãƒŗãƒ‰ã§äŊŋį”¨ã§ããžã™ã€‚ 常ãĢ厉厚しãĻ動äŊœã™ã‚‹ã¨ã¯é™ã‚‰ãšã€į”Ÿį”ŖãĢčŋŊ加される可čƒŊ性があるためです。 ã“ã‚Œã¯į§ãŸãĄã¨äŊ•åēĻかčĩˇã“りぞした。 åēƒå‘Šã¨ã—ãĻ、「ブログ」でsystemtapをäŊŋį”¨ã—ãŸãƒ‡ãƒãƒƒã‚°įŠļæŗãĢついãĻ書きぞした。



åˆĨぎツãƒŧãƒĢã¯å¤å…¸įš„ãĒGDBデバッã‚Ŧãƒŧであり、それをäŊŋį”¨ã—ãžã™ã€‚ 非常ãĢį°Ąå˜ãĢč¨€ãˆã°ã€ãƒ—ãƒ­ã‚ģ゚ãĢå›ēåŸˇã—ã€ã‚šãƒŦッドからバックトナックを削除しぞす。Postgresぎ場合、1つぎプロã‚ģ゚、1つぎ゚ãƒŦッドです。 ã—ãŸãŒãŖãĻ、バックトナックを削除するだけです。 そしãĻ、プロã‚ģッã‚ĩから切りé›ĸしぞす。



įĩčĢ–ã¯æŦĄãŽã¨ãŠã‚Šã§ã™ã€‚ ãƒãƒƒãƒ•ã‚Ąã‚­ãƒŖãƒƒã‚ˇãƒĨを操äŊœã™ã‚‹é ˜åŸŸã§čģŊ量ロックを垅抟しãĻいãĻã€ãŠã“ã‹ã§į°Ąå˜ã§ã¯ãĒãã€į‰šåŽšãŽã‚Ŋãƒŧã‚ščĄŒã§äŊœæĨ­ã—ãĻいることがわかりぞす。 591行bufmgr.cぎã‚Ŋãƒŧã‚šã‚ŗãƒŧドãĢį§ģ動しãĻ、そこでäŊ•がčĩˇã“るかをįĸēčĒã§ããžã™ã€‚ CをįŸĨらãĒくãĻも、非常ãĢč‰¯ã„ã‚ŗãƒĄãƒŗãƒˆãŒã‚ã‚Šã€ãŠã“ã§äŊ•がčĩˇã“ãŖãĻã„ã‚‹ãŽã‹ã‚’į†č§Ŗã§ããžã™ã€‚



GDBãĢ不愉åŋĢãĒæŦ é™Ĩがある唯一ぎこと。 プロã‚ģ゚ãĢしがãŋついãĻctrl + Cã¨č¨€ã†ã¨ã€ SIGTERMやSIGQUITではãĒくプロã‚ģ゚ãĢéŖ›ãŗãžã™ãŒã€ SIGKILLã¯éŖ›ãŗã€PostgresはそれをčŋŊ加しぞす。 ã—ãŸãŒãŖãĻ、非常ãĢ愚かãĒãƒã‚¤ãƒŗãƒ‡ã‚Ŗãƒŗã‚°ã‚’äŊœæˆã—ぞした。 ã“ãŽãƒã‚¤ãƒŗãƒ‡ã‚Ŗãƒŗã‚°ãĢ送äŋĄã™ã‚‹ã™ãšãĻãŽã‚ˇã‚°ãƒŠãƒĢをGDBãĢ送äŋĄã™ã‚‹ã‚ã‘ではありぞせん。 ã—ãŸãŒãŖãĻã€æ˜Žã‚‹ã„ãƒãƒƒã‚¯ã‚¨ãƒŗãƒ‰ãĢも到達しぞせん。

゚トナップをäŊŋį”¨ã™ã‚‹ã¨ã€ã‚ĸãƒ‰ãƒ›ãƒƒã‚¯ãƒãƒƒã‚¯ã‚¨ãƒŗãƒ‰ã‹ã‚‰ã‚šã‚ŋックトãƒŦãƒŧ゚を削除できぞす。そぎ垌、åŊŧã‚‰ã¯į›Žã‚’å‡čĻ–ã—ã€ãã“ã§äŊ•がčĩˇã“ãŖãĻã„ã‚‹ãŽã‹ã‚’į†č§Ŗã—ãžã™ã€‚ ãƒ—ãƒŠã‚šãŽį‚šã¯ã€åŽ‰åŽšã—ãĻ動äŊœã—、「æˆĻé—˜ã€ã‚’å‚ˇã¤ã‘ãĒいことです。 これが抟čƒŊするためãĢは、äŊ•ã‚‚å†æ§‹į¯‰ã™ã‚‹åŋ…čĻã¯ã‚ã‚Šãžã›ã‚“ã€‚ debuginfoãƒ‘ãƒƒã‚ąãƒŧã‚¸ã‚’ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢするだけですīŧšpostgresql-debuginfo、libc-debuginfo、kernel-debuginfo、そしãĻあãĒたはæē€čļŗã™ã‚‹ã§ã—ょう。 重čρãĒãŽã¯ã€ãƒãƒƒã‚¯ã‚¨ãƒŗãƒ‰ãŒæ™‚é–“ã‚’č˛ģやしãĻã„ã‚‹æ­ŖįĸēãĒå ´æ‰€ã‚’ã‚ŗãƒŧãƒ‰čĄŒãĢ寞しãĻæ­ŖįĸēãĢį†č§Ŗã§ãã‚‹ã‚ˆã†ãĢすることです。



プãƒŦã‚ŧãƒŗãƒ†ãƒŧã‚ˇãƒ§ãƒŗãŽ2į•Ēį›ŽãŽéƒ¨åˆ†ã¯ã€äŊ•らかぎパフりãƒŧãƒžãƒŗã‚šãŽå•éĄŒã‚’æ€ã„äģ˜ã‹ãĒã‹ãŖãŸå ´åˆãŽå¯žå‡Ļæ–šæŗ•ãĢ専åŋĩし、č‡ĒäŋĄã‚’æŒãŖãĻå†įžã—ãžã™ã€‚ あãĒたはåŊŧåĨŗã‚’さらãĢæ˛ģį™‚ã™ã‚‹æ–šæŗ•ã‚’įŸĨりぞせん。 そしãĻ、åŊŧらはあãĒたがニãƒĨãƒŧ゚ãƒŦã‚ŋãƒŧãĢäŊ•を書くずきかを教えãĻ、äŊ•をすずきか尋ねぞす。 ただし、ニãƒĨãƒŧ゚ãƒŦã‚ŋãƒŧãĢ書きčžŧむ前ãĢ、より多くぎč¨ē断を収集できぞす。



いくつかぎ䞋。 たとえば、そぎようãĒįŠļæŗãŒã‚ã‚Šãžã—ãŸã€‚ プロã‚ģッã‚ĩ上ãĢあるベãƒŧã‚šã‚’æ’ƒãĄãžã—ãŸã€‚ ここぎ2į•Ēį›ŽãŽå†™įœŸã§ã¯ã€éģ„č‰˛ãŒãƒĻãƒŧã‚ļãƒŧ゚ペãƒŧ゚ぎプロã‚ģッã‚ĩであり、ãģとんおäŊ•ã‚‚éŖŸãšãšãĢすずãĻæļˆč˛ģされãĻいることがわかりぞす。 同時ãĢ、こぎようãĒãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢč˛ čˇã§ã¯ã€ãƒ™ãƒŧã‚šãŒč˛ čˇã‚’ãžãŖãŸãå‡Ļį†ã—ãĒã‹ãŖãŸæœ€å¤§2分ぎ時間間隔がありぞした。 すずãĻãŒåˆŠåŽŗé–ĸäŋ‚でした。 ã‚ĒペãƒŦãƒŧãƒ†ã‚Ŗãƒŗã‚°ã‚ˇã‚šãƒ†ãƒ ã‹ã‚‰ãŽãƒãƒŧã‚šãƒˆã¯čĄ¨į¤ēされぞせんでした。



perftopぎå‡ēåŠ›ã‚‚į›Žã‚’åŧ•くもぎではありぞせん。 ããŽæ™‚į‚šã§æŗ¨æ„ã‚’æ‰•ãŖãŸå”¯ä¸€ãŽã“ã¨ã¯ã€ã“ãŽéšœåŽŗãŒå‡ē力ãĢ襨į¤ēされると、ginを操äŊœã™ã‚‹å‘ŧãŗå‡ēã—ãŒčĄ¨į¤ēされることです。 それãĢč˛ģやされる時間は非常ãĢ少ãĒいというäē‹åޟãĢもかかわらず。 ã—ã‹ã—ã€ã“ã“ã§å¤ąæ•—ã™ã‚‹ã¨ã™ããĢã€ãã‚Œã‚‰ãŒčĄ¨į¤ēされぞす。 すずãĻãŒč‰¯ããĒるとすぐãĢæļˆãˆãžã™ã€‚ こぎデãƒŧã‚ŋベãƒŧ゚ãĢã¯ã‚¸ãƒŗã‚¤ãƒŗãƒ‡ãƒƒã‚¯ã‚šãŒ1つありぞした。 ぞず、こぎgin-indexがäŊŋį”¨ã™ã‚‹ã‚¯ã‚¨ãƒĒをã‚ĒフãĢしãĻã‚ĒフãĢし、すずãĻãŒæ­Ŗå¸¸ã§ã‚ã‚‹ã“ã¨ã‚’įĸēčĒã—ãžã—ãŸã€‚



それからåŊŧã‚‰ã¯į†č§Ŗã—å§‹ã‚ãžã—ãŸã€‚ いつもぎようãĢ、ドキãƒĨãƒĄãƒŗãƒˆã‚’čĒ­ãžãĒã‹ãŖãŸã“ã¨ãŒåˆ¤æ˜Žã—ãžã—ãŸã€‚ 9.4では、ginぎfastupdateがį™ģ場しぞした。 ãģとんおぎ場合、æŒŋå…Ĩæ™‚é–“ã¯įŸ­į¸Žã•ã‚Œãžã™ãŒã€éžæąēåŽšįš„ãĒæŒŋå…Ĩ時間がį™ēį”Ÿã™ã‚‹å ´åˆãŒã‚ã‚Šãžã™ã€‚ į§ãŸãĄãĢã¨ãŖãĻã€æ™‚é–“ãŽåŽ‰åŽšæ€§ã¯ã€į›¸å¯žįš„ãĢč¨€ãˆã°ã€ã“ãŽæ™‚é–“č‡ĒäŊ“ぎ間隔よりも重čĻã§ã™ã€‚ fastupdateをã‚ĒフãĢしぞしたが、すずãĻãŒæ­Ŗå¸¸ã§ã—ãŸã€‚ ã—ãŸãŒãŖãĻ、最初ぎ推åĨ¨äē‹é …は、ニãƒĨãƒŧ゚ãƒŦã‚ŋãƒŧãĢ書きčžŧむ前ãĢドキãƒĨãƒĄãƒŗãƒˆã‚’čĒ­ã‚€ã“ã¨ã§ã™ã€‚ ãģとんおぎ場合、そこãĢį­”ãˆãŒã‚ã‚Šãžã™ã€‚



2į•Ēį›ŽãŽäž‹ã€‚ įš°ã‚Ščŋ”しãĢãĒりぞすが、撎åŊąä¸­ãĢã€éžå¸¸č­˜ãĒį§’å˜äŊãŽå›žį­”ぎバãƒŧã‚šãƒˆãŽã‚šã‚­ãƒŖãƒŗã‚’čĻŗå¯Ÿã—ãžã—ãŸã€‚ ぞた、č‡Ē動バキãƒĨãƒŧãƒ ã€ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒŗãƒˆã€ãžãŸã¯äģ–ãŽã‚ˇã‚šãƒ†ãƒ ãƒ—ãƒ­ã‚ģã‚šã¨æ™‚é–“įš„ãĢᛏé–ĸしぞせんでした。



perfoぎ側éĸからは、こぎようãĢčĻ‹ãˆãžã—ãŸã€‚ compaction_allocぎ最上部ãĢã¯ã€į•°å¸¸ãĒもぎはäŊ•もありぞせんでした。 プロã‚ģッã‚ĩæļˆč˛ģãŽå¤å…¸įš„ãĒå›ŗã€‚



GDBã§ã¯ã€å…ąæœ‰ãƒĄãƒĸãƒĒãŽå•éĄŒãŽã‚ˆã†ãĢčĻ‹ãˆãžã—ãŸãŒã€ã‚„ã¯ã‚Šãƒãƒƒãƒ•ã‚Ąã‚­ãƒŖãƒƒã‚ˇãƒĨぎ領域ãĢありぞした。 重čρãĒぎは、9.4ãĢ更新した垌ãĢå‡ē始めぞした。 9.3ではそうではありぞせんでした。 9.4で大čĻæ¨Ąãƒšãƒŧジがã‚ĩポãƒŧトされ、čĩ¤ã„å¸Ŋ子ベãƒŧ゚ぎã‚ĒペãƒŦãƒŧãƒ†ã‚Ŗãƒŗã‚°ã‚ˇã‚šãƒ†ãƒ ã§ã¯ãƒ‡ãƒ•ã‚ŠãƒĢトで透明ãĒ大čĻæ¨Ąãƒšãƒŧジがã‚ĒãƒŗãĢãĒり、うんざりしãĻいたため、åŊŧらはそれをčĻ‹ã¤ã‘å§‹ã‚ãžã—ãŸã€‚ åŽŸéš›ã€į§ãŸãĄã¯ã“ãŽå•éĄŒãĢ最初ãĢ遭遇したことãĢはãģお遠い。



ã“ãŽå•éĄŒã‚’č­°čĢ–ã—ãĻいる゚ãƒŦッドへぎãƒĒãƒŗã‚¯ã¯ã“ãĄã‚‰ã§ã™ã€‚ 透明ãĒåˇ¨å¤§ãƒšãƒŧジをã‚ĒフãĢすると、すずãĻãŒéŖ›ãŗå§‹ã‚ãžã—ãŸã€‚ これは2į•Ēį›ŽãŽæŽ¨åĨ¨äē‹é …であり、ドキãƒĨãƒĄãƒŗãƒˆãŽčĒ­ãŋ斚がåŊšãĢįĢ‹ãŸãĒã‹ãŖãŸåˆ†é‡Žã§ã™ã€‚ ãŸã ã—ã€ã‚ąãƒŧ゚ぎ95īŧ…でåŊšįĢ‹ãĄãžã™ã€‚ ã‚¤ãƒŗã‚ŋãƒŧネットを検į´ĸã™ã‚‹ãŽã¯į†ãĢかãĒãŖãĻいぞす。おそらく、あãĒたäģĨ外ぎčĒ°ã‹ãŒã“ãŽå•éĄŒãĢ遭遇したでしょう。



3į•Ēį›ŽãŽäž‹ã€‚ ãƒ‡ã‚Ŗã‚šã‚¯IOぎåĸ—加垌しばらくしãĻから、デãƒŧã‚ŋベãƒŧã‚šãŒã‚ˇã‚šãƒ†ãƒ ã§ã™ãšãĻぎ時間をč˛ģã‚„ã—å§‹ã‚ãŸã¨ããŽåŒã˜å•éĄŒã€‚ プロã‚ģッã‚ĩ全äŊ“。



ぞた、perfå‡ēåŠ›ã§ã¯ã€ã‚šãƒ”ãƒŗãƒ­ãƒƒã‚¯ãŽã‚ˆã†ãĢčĻ‹ãˆãžã™ã€‚



一厚数ぎbacktrace'ovã‚’æ’ŽåŊąã—、さらãĢ分析しãĻã€ãƒãƒƒãƒ•ã‚Ąã‚­ãƒŖãƒƒã‚ˇãƒĨぎ操äŊœãĢé–ĸするãģãŧすずãĻぎことがわかりぞした。 ã‚Ŋãƒŧ゚ãĢčĄŒãåŋ…čĻã•ãˆã‚ã‚Šãžã›ã‚“ã€‚



ã“ãŽå ´åˆãŽå¤å…¸įš„ãĒ推åĨ¨äē‹é …ã¯ã€å…ąæœ‰ãƒãƒƒãƒ•ã‚Ąã‚’æ¸›ã‚‰ã™ã“ã¨ã§ã™ã€‚ 通常、PostgresでäŊœæĨ­ã‚’開始するãƒĻãƒŧã‚ļãƒŧã¯ã€å…ąæœ‰ãƒãƒƒãƒ•ã‚ĄãƒŧãĢäŊŋį”¨å¯čƒŊãĒすずãĻぎRAMを切断しぞす。 ã“ã‚Œã¯é€šå¸¸ã˛ãŠãįĩ‚わりぞす。 åž“æĨぎ推åĨ¨äē‹é …は、すずãĻãŽãƒĄãƒĸãƒĒぎ25īŧ…ですが、8 GBäģĨ下です。 原際ãĢ、 8 GBãĢæ¸›ã‚‰ã™ã¨ã€ã“ãŽå•éĄŒã¯č§Ŗæļˆã•れぞす。 でも、ãĒã‚“ã‚‰ã‹ãŽį†į”ąã§ã€å…ąæœ‰ãƒãƒƒãƒ•ã‚ĄãŽä¸‹ã§å¤šãã‚’å‰Šæ¸›ã—ãŸã‹ãŖãŸãŽã§ã™ã€‚

ã‚Ŋãƒŧ゚ãĢčĄŒãã€ã“ã‚Œã‚‰ãŽčĄŒãŒãŠã“ãĢあるかをčĒŋずぞした。 ãƒãƒƒãƒ•ã‚Ąã‚­ãƒŖãƒƒã‚ˇãƒĨぎパãƒŧãƒ†ã‚Ŗã‚ˇãƒ§ãƒŗãŽãƒ­ãƒƒã‚¯ãŽå‘¨ã‚ŠãĢあることがわかりぞした。 9.5では、128ぎ値がデフりãƒĢトãĢãĒりぞす。 9.4で、ぞだ16です。 これãĢより、ロックぎ数が削減されぞした。 さらãĢ、9.5ãĢはæ—ĸãĢč¨€åŠã•ã‚ŒãŸãƒ‘ãƒƒãƒãŒã„ãã¤ã‹ã‚ã‚Šãžã™ã€‚ これは、多くぎã‚ŋイプぎワãƒŧクロãƒŧドでパフりãƒŧãƒžãƒŗã‚šãŒå‘ä¸Šã—ãžã™ã€‚ 唯一ぎことは、これらぎパッチはä¸ģãĢčĒ­ãŋčžŧãŋãŽč˛ čˇãĢé–ĸするもぎです。 そこãĢ多くぎčĒ­ãŋ取り値を持つデãƒŧã‚ŋベãƒŧ゚がある場合、 å…ąæœ‰ãƒãƒƒãƒ•ã‚ĄãŽä¸‹ãŽãģとんおすずãĻãŽãƒĄãƒĸãƒĒを切断でき、ãģã¨ã‚“ãŠãŽå ´åˆã€å•éĄŒã¯į™ēį”Ÿã—ãžã›ã‚“ã€‚

そこãĢå¤šããŽã‚¨ãƒŗãƒˆãƒĒãŒã‚ã‚‹å ´åˆã¯ã€é…ã‹ã‚Œæ—Šã‹ã‚Œã“ãŽå•éĄŒãŒį™ēį”Ÿã—ãžã™ã€‚ é‚Ēæ‚ĒãĒã‚Ļã‚Ŗã‚­ã¯ã€å°†æĨこぎįŠļæŗã‚’æ”šå–„ã™ã‚‹æ–šæŗ•ãĢé–ĸするã‚ĸイデã‚ĸを集めãĻいぞす。 原際、ドキãƒĨãƒĄãƒŗãƒ†ãƒŧã‚ˇãƒ§ãƒŗã‚’įǁį„ļčĒ­ã‚“ã§ã‚¤ãƒŗã‚ŋãƒŧネットを検į´ĸしãĻã‚‚å•éĄŒãŽč§Ŗæąēį­–ãŒåž—ã‚‰ã‚ŒãĒい場合は、ã‚Ŋãƒŧã‚šã‚’å¸ãŖãĻ1ã¤ãŽå¤‰æ•°ã‚’ã­ã˜ã‚‹ã“ã¨ãŒį†ãĢかãĒãŖãĻãŠã‚Šã€å•éĄŒã‚’č§Ŗæąēしぞす。 しかし、これは非常ãĢぞれãĒようです。



4į•Ēį›ŽãŽäž‹ã€‚ å•éĄŒãŽčĒŦæ˜Žã¯ã“ãĄã‚‰ã‹ã‚‰å…Ĩ手できぞす。 æœŦčŗĒはおよそæŦĄãŽã¨ãŠã‚Šã§ã™ã€‚ã‚ĩイã‚ēãŒį´„10å„„čĄŒãŽå¤§ããĒã‚ŋブãƒŦット、大きãĒBツãƒĒãƒŧã‚¤ãƒŗãƒ‡ãƒƒã‚¯ã‚šīŧˆã‚ĩイã‚ēが200 GBīŧ‰ã€‚ こぎプãƒŦãƒŧトでVACUUMã¨č¨€ã„ã€15分äģĨ内ãĢãƒŦプãƒĒã‚Ģへぎ変更ぎロãƒŧãƒĢã‚Ēãƒŧバãƒŧが停æ­ĸしぞす。 ゚トãƒĒãƒŧãƒŸãƒŗã‚°č¤‡čŖŊãĢついãĻです。



同時ãĢ、デãƒŧã‚ŋč‡ĒäŊ“が存在するã‚ģã‚¯ã‚ˇãƒ§ãƒŗã‹ã‚‰ã€ãƒŦプãƒĒã‚ĢãŒãƒ‡ã‚Ŗã‚šã‚¯ã‹ã‚‰å¤§é‡ãŽčĒ­ãŋ取りを開始することは明らかです。 čĩˇå‹•プロã‚ģ゚は、xlogã‚’åŽŸčĄŒã—ã€å¤šããŽäŋĄį”¨ã‚’å‚ˇã¤ã‘ã‚‹ã‚‚ãŽã¨åŒã˜ã§ã‚ã‚‹ã“ã¨ãŒã‚ã‹ã‚Šãžã™ã€‚



こぎ場合、プロã‚ģッã‚ĩではãĒくAIãĢすずãĻをč˛ģやしãĻいるため、トップマãƒŧクぎå‡ē力をčĻ‹ã‚‹ãŽã¯į„Ąæ„å‘ŗã§ã™ã€‚ GDBã§ã¯ã€ãƒ‡ã‚Ŗã‚šã‚¯ã‹ã‚‰ãŽčĒ­ãŋ取りãĢæœŦåŊ“ãĢãƒãƒŗã‚°ã—ãĻいることがわかりぞす。 これはlibcå‘ŧãŗå‡ēしです。 そしãĻ、1čĄŒãŽã‚ŗãƒŧãƒ‰ãžã§ã€ã“ã‚Œã‚’ãŠã“ã§čĄŒãŖãĻいるかをčĻ‹ã‚‹ã“ã¨ãŒã§ããžã™ã€‚ ã‚Ŋãƒŧ゚ãĢį§ģ動しãĻそこでäŊ•がčĩˇã“るかをčĻ‹ã‚‹ã¨ã€ã“ã“ã§čĄŒã‚ã‚ŒãŸã“ã¨ãŒæœ€éŠã§ã¯ãĒã„ã“ã¨ãŒéžãƒ­ã‚ˇã‚ĸčĒžãŽį™Ŋã§į›´æŽĨ書かれãĻいぞす。 攚善できぞす。



ã“ãŽå•éĄŒãŽč­°čĢ–ã¸ãŽãƒĒãƒŗã‚¯ã€ãã‚Œã‚’č§Ŗæąēã™ã‚‹æ–šæŗ•ãĢついãĻ。 これはすずãĻ、Postgresぎパッチでįĩ‚わりぞした。これãĢより、ãƒŦプãƒĒã‚Ģぎバックログを削減できぞす。 ãžãŖãŸãå–ã‚Šå¤–ã•ãĒã„ã§ã€įŸ­ãã—ãĻください。 ã“ãŽå›ŗãĢは、2つぎãƒŦプãƒĒã‚Ģがありぞす。 įˇ‘č‰˛ãŽã‚‚ãŽã¯ãƒ‘ãƒƒãƒãŽãĒいãƒŦプãƒĒã‚Ģです。 青いもぎは、パッチぎあるãƒŦプãƒĒã‚Ģです。 グナフは遅れをį¤ēしãĻいぞす。 そしãĻã€ã“ã‚Œã¯ãƒ‡ã‚Ŗã‚šã‚¯ã‹ã‚‰ãŽčĒ­ãŋ取りぎグナフãĢありぞす[į´„ã€‚ Ed。īŧšåŗå´]。 čĒ­ãŋ取りボãƒĒãƒĨãƒŧムはåĸ—加しぞせん。 つぞり、ドキãƒĨãƒĄãƒŗãƒˆã‚’čĒ­ã‚“ã§ã€ã‚¤ãƒŗã‚ŋãƒŧネットを検į´ĸし、ã‚Ŋãƒŧ゚を愚かãĢį†Ÿč€ƒã—ãĻもあãĒたぎčŗĒ問ãĢå¯žã™ã‚‹į­”ãˆãŒåž—ã‚‰ã‚ŒãĒã‹ãŖãŸã‚‰ã€ãã‚Œã‚‰ã‚’äŋŽæ­Ŗã™ã‚‹ãŽã¯ã„いことだと思いぞす。 ã—ã‹ã—ã€į§ãŽã‚ˆã†ãĒCがわからãĒã„å ´åˆã€ã“ãŽį‰šåŽšãŽįŠļæŗã§ã¯ã€å¤§ããĒプãƒŦãƒŧト、大きãĒBツãƒĒãƒŧã‚¤ãƒŗãƒ‡ãƒƒã‚¯ã‚šãŒã‚ã‚Šã€ãã“ãĢãģとんお変更がãĒく、åŸēæœŦįš„ãĢæŒŋå…Ĩぎãŋぎロãƒŧドである場合、パãƒŧãƒ†ã‚Ŗã‚ˇãƒ§ãƒŗåŒ–ã™ã‚‹ãŽãŒį†ãĢかãĒãŖãĻいぞすそぎようãĒå•éĄŒã¯į™ēį”Ÿã—ãžã›ã‚“ã€‚



ã“ãŽæ™‚į‚šã§ã€é ­ãĢæŦĄãŽã“ã¨ã‚’č€ƒãˆãĻおくåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ã¯ã„ã€ã†ãžãčĄŒã‹ãĒã‹ãŖãŸã€GDBはæˆĻ闘中、Postgresぎã‚Ŋãƒŧã‚šã‚ŗãƒŧドãĢパッチをåŊ“ãĻぞす。通常ぎDBAがこれをå‡Ļį†ã™ã‚‹ã‚ã‘ã§ã¯ã‚ã‚Šãžã›ã‚“ã€‚ そしãĻã€ã“ãŽč€ƒãˆã¯æ­Ŗã—ã„ã§ã™ã€‚ į§ãŸãĄã‚‚ãã†æ€ã„ãžã—ãŸã€‚ ã—ãŸãŒãŖãĻã€į§ã¯ã“ã“ã§ã‚¤ãƒĢドã‚Ĩ゚を招垅しぞす。イãƒĢドã‚Ĩã‚šã¯į§ãŸãĄã‚’åž…ãŖãĻいる明るいæœĒæĨãĢついãĻ教えãĻくれぞす。



Ildus Kurbangaliev īŧšãŋãĒさん、こんãĢãĄã¯ã€‚ į§ãŽåå‰ã¯ã‚¤ãƒĢドã‚Ĩ゚です。 į§ã¯Postgres Professionalで開į™ēč€…ã¨ã—ãĻ働いãĻいぞす。 įžæ™‚į‚šã§ã¯ã€į›ŖčĻ–ã‚’čĄŒãŖãĻいぞす。 つぞり、Postgresã§ã“ã‚Œã‚‰ãŽæœŸåž…ã‚’į›ŖčĻ–ã§ãã‚‹ã‚ˆã†ãĢã™ã‚‹į›ŖčĻ–ãƒ‘ãƒƒãƒã‚’äŊœæˆã—ãĻいぞす。 åž…ãŖãĻいることがぞさãĢPostgresぎ栚嚚です。 ã“ã‚Œã¯ã€ãŸã¨ãˆã°ã€ãƒ‡ã‚Ŗã‚šã‚¯ã€ãƒãƒƒãƒˆãƒ¯ãƒŧク、「ナッチ」、内部でį™ēį”Ÿã™ã‚‹čģŊ量ぎ「ロック」、ぞたは重量ぎある「ロック」č‡ĒäŊ“です。 これらぎ期垅は多くぎã‚ĩブã‚ŋイプãĢ分けられぞす。 čģŊ量ロックは50個、ロックは9個です。 ネットワãƒŧク-čĒ­ãŋ取りぞたは書きčžŧãŋ可čƒŊ。 ゚トãƒŦãƒŧジは同じです。



åˆĨãŽį›ŖčĻ–ãƒ„ãƒŧãƒĢがåŋ…čρãĒぎはãĒぜですかīŧŸ 多くぎ場合、2į•Ēį›ŽãŽãƒã‚¤ãƒŗãƒˆã¯åŽŸéš›ãĢã¯æœ€åˆãŽãƒã‚¤ãƒŗãƒˆã§ã™ã€‚ それらはたくさんあり、それぞれ個åˆĨãĢ寞å‡Ļするåŋ…čĻãŒã‚ã‚‹ãŸã‚ã§ã™ã€‚ これらをįĩ„ãŋ合わせたツãƒŧãƒĢをäŊŋį”¨ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ãžã™ã€‚ ᧁãĢはそぎようãĒäģ•äē‹ãŒã‚りぞした。たとえば、systemtapはå„ĒれたツãƒŧãƒĢですが、原į¨ŧ働ではäŊŋį”¨ã§ããžã›ã‚“ã€‚



ã—ãŸãŒãŖãĻã€į§ã¯pg_stat_waitを開į™ēã—ãžã—ãŸã€‚ã“ã‚Œã¯ã€ãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĒãƒŗã‚°ã€ãƒ•ã‚Ąã‚¤ãƒĢへぎトãƒŦãƒŧã‚šã€ãŠã‚ˆãŗåž…æŠŸåąĨæ­´ã‚’åŽŸčĄŒã§ããžã™ã€‚į‰šåˆĨãĒãƒ‘ãƒŠãƒĄãƒŧã‚ŋãƒŧがあり、書きčžŧãŋとäŋå­˜ãŒã§ãã€å€‹åˆĨãĢčĒ­ãŋå–ã‚‹ã“ã¨ãŒã§ããžã™ã€‚ãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĒãƒŗã‚°ã¯ã€å„æœŸåž…å€¤ãŽæœŸåž…å€¤ãŽæ•°ã¨æ™‚é–“ã‚’čĒ­ãŋ取りぞす。個々ぎプロã‚ģ゚ぎトãƒŦãƒŧ゚を有劚ãĢできぞす。プロã‚ģ゚ぎPIDã€ãƒ•ã‚Ąã‚¤ãƒĢåã€ãŠã‚ˆãŗã“ãŽãƒ—ãƒ­ã‚ģ゚ãĢ寞するすずãĻぎ期垅値がそこãĢ書きčžŧぞれぞす。トãƒŦãƒŧ゚ぎマイナ゚éĸは、大きãĒã‚Ēãƒŧバãƒŧヘッドであることが判明し、ã‚ĒãƒŗãƒŠã‚¤ãƒŗã§äŊŋį”¨ã§ããĒã„ã“ã¨ã§ã™ã€‚ãƒ—ãƒ­ãƒ€ã‚¯ã‚ˇãƒ§ãƒŗã§ãƒ—ãƒ­ãƒ€ã‚¯ã‚ˇãƒ§ãƒŗã§äŊŋį”¨ã§ãã‚‹ã‚ˆã†ãĢしぞした。



ã“ã“ã§ã€č¨­åŽšã•ã‚ŒãŸčρäģļã‚’č¨˜čŋ°ã—ぞした。つぞり、パッチはã‚ĒãƒŗãƒŠã‚¤ãƒŗã§å‹•äŊœã™ã‚‹ã¯ãšã§ã™ã€‚デãƒŧã‚ŋベãƒŧ゚č‡ĒäŊ“ãĢéŽč˛ čˇã‚’ã‹ã‘ãĒいでください。すずãĻぎ期垅ãĢã‚ˆã‚Šã€æ­ŖįĸēãĒデãƒŧã‚ŋを取垗することが望ぞしいです。つぞり、ミãƒĒį§’å˜äŊãŽæ™‚é–“ã€é‡ã€ãŠã‚ˆãŗä¸ģčρãĒį›Žæ¨™ã§ã‚ã‚Šã€å¤šæ•°ãŽãƒ„ãƒŧãƒĢを1つãĢぞとめることです。でそうčĻ‹ãˆã‚‹ã€‚



こぎデãƒŧã‚ŋをčŋ”すだけぎåˆĨ個ぎé–ĸ数をå‘ŧãŗå‡ēã™ãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒŠãƒŧį”¨ãŽãƒãƒƒãƒ—ãŒã‚ã‚Šãžã™ã€‚ã¤ãžã‚Šã€ä爿ƒŗã”とãĢã€ãŠã‚Œã ã‘æ™‚é–“ãŒã‹ã‹ãŖãŸã‹ã€é‡ã‚’įĸēčĒã§ããžã™ã€‚ãŸã¨ãˆã°ã€įžŽã—ã„ã‚°ãƒŠãƒ•ã‚’äŊœæˆã—たり、äēˆį´„ã‚’å…Ĩれたり、もう一åēĻčŗĒ問したり、すずãĻãŒčĄ¨į¤ēされるグナフをäŊœæˆã—たりできぞす。ここでは、ここでぎä¸ģãĒ時間は「ナッチ」でネットワãƒŧクを操äŊœã™ã‚‹ãŽãĢč˛ģやされãĻいることがわかりぞす。そしãĻ、ここãĢLWLockが1つありぞした。



į‰ŠčĒžã¯ã“ãŽã‚ˆã†ãĢčĻ‹ãˆãžã™ã€‚ãƒ‘ãƒŠãƒĄãƒŧã‚ŋãƒŧが5,000ぎ場合、最垌ぎ5,000ぎ期垅値を取垗しぞす。それらはすぐãĢæļˆåŽģされるため、すぐãĢčĻæą‚ã™ã‚‹åŋ…čĻã‚‚ã‚ã‚Šãžã™ã€‚ãžãŸã€å„æœŸåž…å€¤ãŽãƒ‘ãƒŠãƒĄãƒŧã‚ŋãƒŧぎãŋãŒčĄ¨į¤ēされぞす。上ぎ゚トãƒŦãƒŧジãĢã¯ã€į‰šåŽšãŽãƒ–ãƒ­ãƒƒã‚¯ãŒæ›¸ãčžŧぞれãĻいるかをčĻ‹ã‚‹ã“ã¨ãŒã§ããžã™ã€‚ãã—ãĻ、ã‚ĸãƒŗãƒ­ãƒŧドするテãƒŧブãƒĢč‡ĒäŊ“ã‚’č¨ˆįŽ—ã—ãžã™ã€‚





トãƒŦãƒŧã‚šãŽé–‹å§‹į‚šã¯æŦĄãŽã¨ãŠã‚Šã§ã™ã€‚é–ĸ数īŧˆpid、fileīŧ‰ã‚’å‘ŧãŗå‡ēすと、そぎようãĒįĩæžœãŒčĄ¨į¤ēã•ã‚Œãžã™ã€‚é–‹å§‹ãŒã„ã¤čĄŒã‚ã‚ŒãŸã‹ãŒã“ã“ãĢ襨į¤ēされ、すずãĻがįĩ‚äē†ã™ã‚‹ã¨ã€æ™‚é–“ã‚’č¨ˆįŽ—ã—ãĻã€ã“ãŽč¨˜éŒ˛ãŒčĄŒã‚ã‚ŒãŸå ´æ‰€ã‚’įĸēčĒã§ããžã™ã€‚



åŽŸčŖ…ãĢついãĻ少し。åŊ“åˆã€į›ŖčĻ–ãĢã¯ãƒ‘ãƒŠãƒĄãƒŧã‚ŋが1つしかありぞせんでした。これらぎ5つぎã‚ŋイプは、ã‚ĩãƒŗãƒ—ãƒĒãƒŗã‚°ãĢã‚ˆãŖãĻåŽé›†ã•ã‚Œã€ãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢがäŊœæˆã•れぞした。ã‚ĩãƒŗãƒ—ãƒĒãƒŗã‚°ã¯æœ€åˆãĢプロã‚ģ゚ぎãƒĒ゚トãĢブロックをįŊŽããŸã‚ã€ã“れはあぞりåŊšãĢįĢ‹ãŸãĒいことが判明しぞした。æŦĄãĢ、検į´ĸがįļščĄŒã•れると、äģ–ぎプロã‚ģã‚šãŒãƒ­ãƒƒã‚¯ã‚’ã‹ã‘ã‚‹ã“ã¨ãŒã§ãã€ãã‚Œã‚‰ã¯ã‚šã‚­ãƒƒãƒ—ã•ã‚Œãžã™ã€‚å°‘ã—é•ãŖãŸã‚„ã‚Šæ–šã§ã‚„ãŖãŸã€‚ã¤ãžã‚Šã€å„ãƒãƒƒã‚¯ã‚¨ãƒŗãƒ‰ã¯ãã‚Œč‡ĒäŊ“å†…ã§é›†č¨ˆã‚’åŽé›†ã—ã€å…ąæœ‰ãƒĄãƒĸãƒĒãĢæ™‚ã€…ãƒ‰ãƒ­ãƒƒãƒ—ã—ãžã™ã€‚ãã“ã‹ã‚‰ã€ãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢだけが与えられぞす。

゚トãƒŧãƒĒãƒŧはéģ„č‰˛ãŽã‚ŗãƒŦクã‚ŋãƒŧãĢã‚ˆãŖãĻ収集されãĻいぞす。ProcArrayを反垊å‡Ļį†ã—ã€įžåœ¨ãã“ã§čĩˇã“ãŖãĻã„ã‚‹ã“ã¨ã‚’č¨˜éŒ˛ã—ãžã™ã€‚įžåœ¨ãŽãƒ“ãƒĨãƒŧがありぞす個åˆĨãĢã€į‰šåŽšãŽãƒ—ãƒ­ã‚ģã‚šãŒįžåœ¨äŊ•をしãĻいるぎかをčĻ‹ã‚‹ã“ã¨ãŒã§ããžã™ã€‚ã‚Ēãƒŧバãƒŧヘッドを回éŋするためãĢ、すずãĻがブロックフãƒĒãƒŧã‚ĸãƒĢゴãƒĒã‚ēムãĢåŽŸčŖ…ã•ã‚ŒãĻいぞす。



äģĨ下ãĢ、こぎようãĒブロックぎãĒいã‚ĸãƒĢゴãƒĒã‚ēムがåąĨæ­´ãĢ寞しãĻおぎようãĢäŊœæˆã•れるかぎ䞋をį¤ēしぞす。期垅ごとãĢ2つぎブロックをäŋæŒã—ぞす。そしãĻã€ãƒãƒƒã‚¯ã‚¨ãƒŗãƒ‰ãŒä¸€æ–šãĢ書きčžŧむと、もう一斚をčĒ­ãŋå–ã‚Šãžã™ã€‚ã—ãŸãŒãŖãĻ、ブロックをéŋけãĻください。







そしãĻã€į§ã¯å¤šããŽã‚Ēãƒŧバãƒŧヘッドæ¸ŦåŽšã‚’čĄŒã„ãžã—ãŸã€‚ã“ã‚Œã‚‰ãŽãƒ†ã‚šãƒˆã¯ã€ã‚Ēãƒŧバãƒŧヘッドがこぎ場合0.5īŧ…æœĒæē€ã§ã‚ることをį¤ēしぞした。しかし、SELECTクエãƒĒでこれをテ゚トしたことを明įĸēãĢしぞす。そぎため、pg_benchぎįĩæžœãŽæ•Ŗå¸ƒå›ŗãŒå–åž—ã•ã‚Œãžã™ã€‚ã€‚ãã“ã§ã¯ã€į›ŖčĻ–ãŽæœ‰į„ĄãĢかかわらず、ã‚Ēãƒŧバãƒŧãƒ˜ãƒƒãƒ‰ã‚’čŠ•äžĄã™ã‚‹ã“ã¨ã¯ä¸å¯čƒŊです。そしãĻ、čĒ°ã‹ãŒã“ã‚Œã‚’čĄŒã†æ–šæŗ•ã‚’æ€ã„ã¤ã„ãŸã‚‰ã€į§ã¯éžå¸¸ãĢ感čŦã—ãžã™ã€‚åŽ‰åŽšã—ãŸéŒ˛éŸŗįĩæžœã‚’垗るぎは非常ãĢé›Ŗã—ã„ãŸã‚ã§ã™ã€‚



ã“ã“ã§ã€ã‚ŗãƒŧドはã‚Ēãƒŧãƒ—ãƒŗã‚Ŋãƒŧ゚で開かれãĻおり、gitgubではこぎプロジェクトがあり、äŊ•かがčļŗã‚ŠãĒã„å ´åˆã¯å•éĄŒã‚’äŊœæˆã—ã€į›ŖčĻ–ã‚’ãƒ†ã‚šãƒˆã—ã€ãƒ‡ãƒŧã‚ŋベãƒŧã‚šã‚’ãƒã‚§ãƒƒã‚¯ã‚¤ãƒŗã—ã€ãƒã‚°ã‚‚æŽĸしぞす。これは非常ãĢåŊšįĢ‹ãĄãžã™ã€‚ã“ã‚Œã‚‰ãŽå•éĄŒãĢé–ĸする寞åŋœã‚’įĸēčĒã§ãã‚‹ãƒĒãƒŗã‚¯ãŒ2つあり、そこãĢも参加できぞす。



ã“ãŽį›ŖčĻ–ãŽäŊŋį”¨äž‹ãŒã‚ã‚Šãžã™ã€‚ã“ã‚ŒãĢついãĻは、VovaãĢäŧãˆãžã™ã€‚



ã‚ĻナジミãƒŧãƒĢãƒģãƒœãƒ­ãƒ‡ã‚Ŗãƒŗīŧšäž‹ãĢついãĻ少し。 Ildusは、バグをダã‚Ļãƒŗãƒ­ãƒŧド、čŠĻį”¨ã€ãƒ†ã‚šãƒˆã€æ¤œį´ĸできるとčŋ°ãšãžã—た。ダã‚Ļãƒŗãƒ­ãƒŧド、čŠĻį”¨ã€æ¤œį´ĸã€ãƒ†ã‚šãƒˆã‚’čĄŒã„ãžã—ãŸã€‚ã™ãšãĻãŽãƒžã‚ˇãƒŗã§ã™ã§ãĢ9.4が原į¨ŧ働しãĻいぞす。パッチは9.4į”¨ã§ã‚ã‚Šã€įžåœ¨ãŽãƒžã‚šã‚ŋãƒŧį”¨ãŽãƒ‘ãƒƒãƒãŒã‚ã‚Šãžã™ã€‚ã“ã‚Œã¯įžåœ¨ã€ã‚ĸップ゚トãƒĒãƒŧムãĢãƒ—ãƒƒã‚ˇãƒĨされãĻいぞす。

äģĨ前はおうでしたかīŧŸį§ãŸãĄãĢは、äŊ•ãĢ寞しãĻもäŧ‘ぞãĒいようãĢ思えるが、それäģĨ上それをį™ēčĄŒã—ãĒいåŸēį›¤ãŒã‚ã‚Šãžã™ã€‚ 1į§’ã‚ãŸã‚Š1ä¸‡ãƒˆãƒŠãƒŗã‚ļã‚¯ã‚ˇãƒ§ãƒŗãŠã‚ˆãŗãƒã‚¤ãƒŗãƒˆã€‚ã‚‚ã†æŠŸčƒŊしぞせん。 GDBでは、ProcArrayEndTransactionã§ãƒãƒŗã‚°ã—ã€čģŊ量ロックを取垗しãĻã„ã‚‹ã“ã¨ãŒã‚ã‹ã‚Šãžã—ãŸã€‚įš°ã‚Ščŋ”しãĢãĒりぞすが、最大1čĄŒãŽã‚ŗãƒŧドで、ProcArrayLockã§ãƒãƒŗã‚°ã—ãĻいることがわかりぞす。こぎGDBをæŽĨįļšã—ã€į‰šåŽšãŽãƒãƒƒã‚¯ã‚¨ãƒŗãƒ‰ã§ã‚­ãƒŖãƒƒãƒã—ãĻ、これをįĸēčĒã§ããžã™ã€‚



そしãĻäģŠã€ã“れは1つぎSELECTクエãƒĒですpg_stat_wait_currentぞたはpg_stat_wait_historyã§ã€įžåœ¨ãŽįŠļæŗã‚’čĻ‹ãĻいるか、過åŽģぎåąĨ歴をčĻ‹ãĻいるかãĢã‚ˆãŖãĻį•°ãĒりぞす。そしãĻ、ここでは、それらすずãĻがProcArrayLockãĢã‹ã‹ãŖãĻいることがわかり、こぎProcArrayLockを垅抟するぎãĢおれだけぎ時間をč˛ģやしたかがわかりぞす。



これはčĻ–čĻšåŒ–ã§ããžã™ã€‚ã“ã‚Œã¯ã€å„åž…æŠŸã‚¯ãƒŠã‚šã§ãƒ™ãƒŧ゚がč˛ģやす時間ぎグナフです。čĩ¤ã¯ãƒ‡ã‚Ŗã‚šã‚¯ã€įˇ‘はčģŊ量ロック、青は重ロックです。ネットワãƒŧクと「ナッチ」はここではã‚ĒフãĢãĒãŖãĻã„ãžã™ã€‚ã“ã‚Œã¯é€šå¸¸ã€å¤šããŽæ™‚é–“ãŒã‹ã‹ã‚‹ãŸã‚ã§ã™ã€‚ãƒãƒƒã‚¯ã‚¨ãƒŗãƒ‰ãŒãƒãƒŗã‚°ã—ãĻäŊ•もしぞせんが、ネットワãƒŧク垅抟クナ゚があり、垅抟時間が非常ãĢé•ˇããĒãŖãĻã„ãžã™ã€‚ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒŗãƒˆãŒãƒãƒŗã‚°ã—ãĻäŊ•もしãĒã„å ´åˆã€ãƒŠãƒƒãƒåž…æŠŸã‚¯ãƒŠã‚šãŒã‚ã‚Šãžã™ã€åž…æŠŸæ™‚é–“ã¯į„Ąé™ã§ã™ã€‚ãžã‚ã€į„Ąé™ã§ã¯ãĒいが、非常ãĢ大きい。そしãĻここで、ãģとんおぎ場合、ベãƒŧ゚はäŊ•ã‹ã‚’åž…ãŖãĻいるときãĢãƒ‡ã‚Ŗã‚šã‚¯IOã‚’åž…ãĄãžã™ãŒã€čģŊé‡ãƒ­ãƒƒã‚¯ã§ãƒãƒŗã‚°ã™ã‚‹ã“ã¨ãŒã‚ã‚Šãžã™ã€‚ yčģ¸ã¯åž…抟時間、xčģ¸ã¯ã‚ĢãƒŦãƒŗãƒ€ãƒŧ時間です。



čģŊ量ロック内でäŊ•がčĩˇã“るかと同じグナフをプロットできぞす。ãģとんおすずãĻがéģ„č‰˛ã§ã€éģ„č‰˛ãŒBufferPartitionLockã§ã‚ã‚‹ã“ã¨ãŒã‚ã‹ã‚Šãžã™ã€‚ãƒãƒƒãƒ•ã‚Ąã‚­ãƒŖãƒƒã‚ˇãƒĨぎ同じロックとパãƒŧãƒ†ã‚Ŗã‚ˇãƒ§ãƒŗã‚’ã€ãã‚Œã ã‘ã§ã¯ãĒく、16から128ãĢåĸ—やしぞした。9.5ぎようãĢ、それらは大嚅ãĢ最遊化されぞした。



たとえば、これは、デãƒŧã‚ŋベãƒŧ゚内ぎすずãĻãŒä¸č‰¯ãĢãĒãŖãŸįžŦé–“ãŽåž…æŠŸã‚¯ãƒŠã‚šãŽæ§˜å­ã§ã™ã€‚æœ€åˆã¯ãã‚Œã‚‰ãŒįˆ†į™ēし、čģŊ量ぎロックãĢ期垅しãĻãļã‚‰ä¸‹ãŒãŖãŸã“ã¨ãŒã‚ã‹ã‚Šãžã™ã€‚ã—ã°ã‚‰ãã—ãĻから、重量ぎあるロックãĢプãƒŦãƒŧãƒˆãŽãƒŠã‚¤ãƒŗãŽãƒŦベãƒĢでロックã‚ĸップしぞした。čģŊ量ロックが



原因であるもぎをčĻ‹ã‚‹ã¨ã€į†čĢ–įš„ãĢは、ProcArrayLockとBuffFreelistLockがあるはずです。上įĩžéĻ–åˆ‘BuffFreelistLock「Eã€ãŠã‚ˆãŗProcArrayLockã€ã¨ã‚ã‚‹ãŸã‚ã€ãƒãƒƒã‚¯ã‚¨ãƒŗãƒ‰ãŽå¤§čĻæ¨ĄãĒ数をäŊœæˆã™ã‚‹ãŸã‚ãĢã€įžæ™‚į‚šã§ã¯ã€å¤šããŒã‚ãŖãŸã€æ–°ã—ã„æŽĨįļšãŒé–‹ã‹ã‚Œã€ãã—ãĻこぎ-負荷ProcArrayã€‚ã“ãŽå•éĄŒãŽä¸ģãĒ原因はBuffFreelistLockであり、これは9.5ではãĒくãĒり、最遊化ぎ1つでčĻ‹ã‚‰ã‚Œãžã—ãŸã€‚



在åēĢをįĸēčĒã™ã‚‹æ™‚ãŒæĨぞした。これは垅望ぎ抟čƒŊであり、äģ–ぎ多くぎデãƒŧã‚ŋベãƒŧ゚ãĢあり、DBAぎå¯ŋå‘Ŋを大嚅ãĢäŋƒé€˛ã—ãĻいるようです。



PG Day'17ぎæŦĄãŽå¤ã€Yandexぎ専門åŽļは、いくつかぎクãƒŧãƒĢãĒãƒŦポãƒŧトをæē–備しãĻいぞす。Vladimir Krasilshchikが ビッグデãƒŧã‚ŋãŽč´čĄ†ã¨čŠąã‚’ã—ã€Vasily SozykinがYandex.MoneyでぎPostgreSQLへぎį§ģčĄŒãŽåŖŽå¤§ãĒ゚トãƒŧãƒĒãƒŧをčĒžã‚Šã€äēēæ°—ぎClickHouse分析デãƒŧã‚ŋベãƒŧ゚ぎãƒĒãƒŧド開į™ēč€…ã§ã‚ã‚‹Alexey Milovidov がåŊŧぎį™ē明ぎ内部構造ãĢついãĻčĒžã‚Šãžã™ã€‚äģŠã™ãå‚加しようīŧ

Source: https://habr.com/ru/post/J329178/


All Articles