Slide 1

Slide 1 text

ϐΫγϒ޿ࠂαʔόʔ ։ൃɾӡ༻ͷي੻ ʙΠϯϑϥͬͯԿ͍ͯ͠Δͷʁʙ ϐΫγϒΠϯϑϥDBUBUTVZ

Slide 2

Slide 2 text

ॾ஫ҙ • ՆΠϯλʔϯͷߨٛͱ಺༰͕ॏෳʢಛʹલ൒ʣ͍ͯ͠·͢ • ՆΠϯλʔϯͷࢿྉΛݟͨਓ͸ͲΜͲΜ࣭໰͍ͯͩ͘͠͞ʂ • εϥΠυͷຕ਺͕ଟ͍ͷͰ͕Μ͹ͬͯ෇͍͖͍ͯͯͩ͘͞ • ࣭໰׻ܴʂ • Ή͠Ζ࣭໰͕དྷΔ͜ͱલఏͷࢿྉͰ͢ • جຊతͳ͜ͱͰ΋ฉ͚Δػձ͸গͳ͍ͱࢥ͏ͷͰԕྀͤͣ

Slide 3

Slide 3 text

ࣗݾ঺հ • catatsuy ͱ͍͏ ID ͰΠϯλʔωοτ্Ͱ׆ಈ • ͔͍ͨͭͬͯݺ͹Ε͍ͯΔ • ౦ژ޻ۀେֶ޻ֶ෦৘ใ޻ֶՊଔۀ • 2013/9ʹେֶΛଔۀޙʹϐΫγϒೖࣾ • ΠϯϑϥͰमߦத • ޿ࠂαʔόʔͷΠϯϑϥ୲౰ʹ • ISUCON4४༏উ

Slide 4

Slide 4 text

ࠓ೔࿩͢͜ͱ • ৽޿ࠂαʔόʔΛ࡞ͬͨཧ༝ • ϐΫγϒͷΠϯϑϥͷڌ఺ • ϐΫγϒ৽޿ࠂαʔόʔͷ։ൃͱឯ༨ۂં • ϐΫγϒ৽޿ࠂ഑৴αʔόʔΠϯϑϥશମ૾ • ϐΫγϒ৽޿ࠂαʔόʔσϓϩΠ • ϐΫγϒ৽޿ࠂαʔόʔ؂ࢹํ๏ • ຊ֨ӡ༻લʹىͬͨ͜໰୊ͱରԠ • ຊ֨ӡ༻ޙʹىͬͨ͜໰୊ͱରԠ

Slide 5

Slide 5 text

޿ࠂαʔόʔ։ൃϝϯόʔʢ3ਓʣ CBTI$ ؅ཧɾ഑৴αʔόʔϓϩτλΠϓ࡞੒ ؅ཧɾ഑৴αʔόʔ։ൃ୲౰ QJYJWͷ։ൃ΋૯ׅ 3BJMTΤϯδχΞ ؅ཧαʔόʔ։ൃ୲౰ DBUBUTVZʢࣗ෼ʣ ؅ཧαʔόʔΠϯϑϥ୲౰ ഑৴αʔόʔ։ൃɾΠϯϑϥ୲౰ ͳ͔ͥ؅ཧαʔόʔͷ+4΋ॻ͍ͨ POJPO

Slide 6

Slide 6 text

޿ࠂαʔόʔಛ௃ • ؅ཧαʔόʔͱ഑৴αʔόʔͷ 2 ͕ͭ͋Δ • ؅ཧαʔόʔ͸ϚʔένʔϜ͕޿ࠂΛೖߘ͢Δ • ഑৴αʔόʔ͸ೖߘ͞Εͨ޿ࠂΛ഑৴ͯ͠ΠϯϓϨογϣϯ਺ʢද ࣔ਺ʣͱΫϦοΫ਺Λܭଌ͢Δ • ഑৴αʔόʔ͸গͳ͍αʔόʔ୆਺Ͱpixivͱಉఔ౓ͷΞΫηεʹ ଱͑ͳ͍ͱ͍͚ͳ͍ • ॠ࣌ʹϨεϙϯεΛฦͤͳ͍ͱpixivͷϢʔβʔମݧͷ࣭͕௿Լ͢ Δ

Slide 7

Slide 7 text

چ޿ࠂαʔόʔ • Debian6/PHP5.3 ͱࣾ಺Ͱ͸ϨΨγʔ؀ڥ • Debian7/PHP5.5 ͕ࣾ಺ඪ४؀ڥ • APC ͱ͍͏ڞ༗ϝϞϦͷػߏΛϑϧ׆༻ͯ͠ߴ଎ʹϨεϙϯεΛฦ͢ • APC ͸ PHP5.5 Ͱഇࢭ͞Ε͍ͯͯ pixiv Ͱ͸୅ସͷ APCu Λ࢖༻ • ͔͠͠ APCu ͸όΪʔͳͷͰ pixiv Ͱ͸ݶఆతʹ࢖༻ • ݱ޿ࠂαʔόʔ͸ APC ͷػೳΛ͔ͳΓ࢖͍ͬͯΔͨΊҠߦෆՄೳ • ΠϯϓϨογϣϯ਺ͷߋ৽͸ 1 ͓͖࣌ؒͳͲ͔ͳΓׂΓ੾ͬͨઃܭͰߴ଎ͳϨεϙϯεΛ࣮ݱ • ΠϯϓϨογϣϯ਺͕ϦΞϧλΠϜʹ෼͔Βͳ͍ͱ໨ඪΠϯϓ਺ʹ౸ୡͤ͞Δͷ͕೉͍͠ • ࣗಈΠϯϓϨογϣϯ਺ௐઅػೳ΋ͳ͍ͷͰखಈରԠ • ػೳ֦ு΋΄΅ෆՄೳ

Slide 8

Slide 8 text

ϐΫγϒͷαʔόʔڌ఺ ࣗࣾαʔόʔϧʔϜ ϕχϠ൘αʔόʔ ։ൃ ৽॓%$ QJYJW %#ɾը૾ɾ"1 നՏ%$ ը૾഑৴ ޿ࠂαʔόʔ w ্ͷڌ఺ʢެ։৘ใʣ w ͦΕͧΕઐ༻ઢͰܨ͕͍ͬͯΔ w ࠓճͷ޿ࠂαʔόʔ͸നՏʹ͋Δ

Slide 9

Slide 9 text

؅ཧαʔόʔ • ϚʔένʔϜ͕޿ࠂΛೖߘ͢Δͷͱ഑৴αʔόʔͷܭଌ݁ՌΛอଘͯ͠ݟΕΔΑ ͏ʹ͢Δ • ࣾ಺ͷਓ͔ؒ͠৮Βͳ͍ͷͰϦιʔε͸͋·Γׂ͚ͳ͍͕ɼۀ຿ޮ཰ʹؔΘΔͷ ͰϚʔένʔϜͷػೳཁ๬ʹ͸ਝ଎ʹରԠ͢Δඞཁ͕͋Δ • ؅ཧαʔόʔ͕޿ࠂαʔόʔͷ୯Ұো֐఺ʹͳΒͳ͍Α͏ʹ͢Δඞཁ͕͋Δ • ؅ཧαʔόʔ͕ࢮΜͰ΋޿ࠂͷ഑৴͸΍Γଓ͚ΔΑ͏ʹ • Ruby on RailsͰগͳ͍ϦιʔεͰAPIΛؚΊͯ࡞੒͢Δ͜ͱʹ • Rails͸ϑϧελοΫϑϨʔϜϫʔΫͰ࠷খݶͷ࣮૷Ͱ༷ʑͳػೳ͕࢖͑Δ • JSONܗࣜͷAPI΋Rubyͩͱ࡞Γ΍͍͢

Slide 10

Slide 10 text

؅ཧαʔόʔ • σʔλϕʔε͸MySQLΛ࢖༻ • pixiv͸MySQLͳͷͰେن໛MySQLӡ༻ͷϊ΢ϋ΢͕͋Δ • ޿ࠂσʔλ͸ফ͑Δͱ࠷ѱձ͕ࣾࢮ͵ͷͰ৴པੑͷߴ͍σʔλετΞΛ࢖͍͍ͨ • ࠓ·ͰMySQL͕ݪҼͰσʔλΛফࣦͨ͜͠ͱ͕ແ͍ͷͰ৴པੑ͸ߴ͍ • ഑৴͢Δ޿ࠂσʔλΛJSONͷAPIܦ༝Ͱ഑৴αʔόʔʹ • ؅ཧαʔόʔ͕Ұ࣌తʹࢮΜͰ΋഑৴αʔόʔʹӨڹ͕ग़ͳ͍Α͏ʹ • ഑৴αʔόʔ͕දࣔɾΫϦοΫ਺ͷूܭ݁ՌΛ؅ཧαʔόʔͷMySQLʹ௚઀ॻ͖ࠐΉ • MySQLʹ௚઀τϥϯβΫγϣϯΛ࢖ͬͯॻ͖ࠐΉ • ࣦഊͨ͠ΒϩʔϧόοΫͯ͠Ұఆ࣌ؒޙʹfluentd͕ϦτϥΠ

Slide 11

Slide 11 text

؅ཧαʔόʔ • Ruby on Rails ͸ࣾ಺Ͱ΋࠾༻ྫ͕ଟ͍ͷͰϊ΢ϋ΢͕͋Δ • BOOTH/pixivFACTORY/WorldCosplay/pixivίϛοΫetc • αʔόʔ͸ Unicorn ͰσϓϩΠ͸ Capistrano • ࣾ಺Ͱ΋࠾༻࣮੷͕͋Δ • Capistrano ͸ Ruby ੡ͳͷͰ Ruby पΓͷػೳ͕ॆ࣮͍ͯ͠Δ • Unicorn ͸ Rack ΞϓϦέʔγϣϯ޲͚ͷ prefork ܕαʔόʔ • ΠϯϑϥΤϯδχΞͱͯ͠޻෉ͨ͠ͱ͜Ζ͸ಛʹͳ͍ • ࣾ಺͔Β͔͠ΞΫηε͕དྷͳ͍ͷͰ Rails ΞϓϦ͕ಈ͔ͤΕ͹े෼

Slide 12

Slide 12 text

Rack/Capistrano/Unicorn • Rack • RubyͷͨΊͷαʔόʔͱWebΞϓϦέʔγϣϯؒͷ΍ΓऔΓΛ୲౰ • Rackʹଇͬͯ࡞ΒΕͨWebΞϓϦέʔγϣϯ͸Rack༻ͷαʔόʔͰಈ͔͢͜ͱ͕Մೳ • Rails/SinatraͳͲओཁͳRubyͷWebϑϨʔϜϫʔΫ͸ରԠ • Capistrano • σϓϩΠͳͲࣗಈԽ͍ͨ͠αʔόʔૢ࡞ΛࣗಈԽ͢Δπʔϧ • Ruby੡ͳͷͰRubyपΓͷػೳ͕ॆ࣮ • γΣϧεΫϦϓτͩͱԿ͔ΒԿ·Ͱࣗ෼Ͱॻ͔ͳ͍ͱ͍͚ͳ͍ͷͰָͰอकੑ΋ߴ͘ͳΔ • Unicorn • ਓؾͷߴ͍Rack༻αʔόʔ

Slide 13

Slide 13 text

• ਌ϓϩηε͕ΞϓϦέʔγϣϯΛϩʔυͯ͠ιέοτϑΝΠϧΛ࡞੒͢Δʢˠmasterϓϩηεʣ • forkͯ͠ࢠϓϩηεΛ࡞Δʢˠworkerϓϩηεʣ • forkͳͷͰιέοτϑΝΠϧͷϑΝΠϧσΟεΫϦϓλͳͲͷϦιʔε͸ڞ༗͞ΕΔ • Copy on WriteͳͷͰࢠϓϩηε͕վΊͯΞϓϦέʔγϣϯΛϩʔυ͢Δඞཁ͸ͳ͍ • ͋Β͔͡ΊforkΛ͓ͯ͘͠ͷͰpreforkͱݺ͹ΕΔ • worker͕1 requestΛҾ͖ड͚ͯऴྃ࣍ୈ࣍ͷϦΫΤετΛड͚Δ • worker͸͋Δఔ౓ͷϦΫΤετΛड͚ΔͱmasterͱͷϝϞϦͷဃ཭͕େ͖͘ͳΓϝϞϦΛᷰ͏Α͏ʹͳΔͷ Ͱmasterϓϩηε͕workerΛఆظతʹkillͯ͠৽͘͠fork͢Δ unicorn(master) unicorn(worker) unicorn(worker) unicorn(worker) unicorn(worker) ਌ϓϩηε ࢠϓϩηε socket 'PSL 4PDLFU࡞੒ ϑΝΠϧ σΟεΫϦϓλ

Slide 14

Slide 14 text

഑৴αʔόʔ • ࠷΋ٕज़త՝୊͕େ͖͍ • গͳ͍αʔόʔ୆਺Ͱ pixiv ͱ΄΅ಉ͡ΞΫηε਺Λ͞͹͘ඞཁ͕͋Δ্ʹߴ଎ʹ޿ࠂσʔ λΛฦ͢ඞཁ͕͋Δ • ܭଌϛε͸͋ͬͯ͸ͳΒͳ͍ͷͰ৴པੑͷߴ͍γεςϜͰ͋Δඞཁ͕͋Δ • མͪͨΒͦͷ෼ձࣾͷऩӹ͕མͪΔ্ʹ௕࣌ؒ෮ؼͰ͖ͳ͍ͳΒิరͷඞཁ͕ग़ͯେ੺ࣈ • ΠϯϑϥΤϯδχΞͱͯ͠։ൃʹ΋ؔΘΔ • ϐΫγϒͰ͸ΠϯϑϥͰ΋ඞཁʹԠͯ͡։ൃ͢Δ • Πϯϑϥ͔ͩΒίʔυ͸ॻ͔ͳ͍Έ͍ͨͳձࣾ΋͋ΔΒ͍͕͠ɼϐΫγϒͰ͸ͦ͏͍͏ ͜ͱ͸ͳ͍ • ಛʹύϑΥʔϚϯεपΓ΍ϛυϧ΢ΣΞͷબ୒ͳͲ͸Πϯϑϥ͕ਂؔ͘ΘΔඞཁ͕͋Δ

Slide 15

Slide 15 text

%/4 UZQFUBJM ޿ࠂ഑৴αʔόʔ ؅ཧαʔόʔ .Z42- qVFOUE qVFOUE /(*/9 ը૾ $"$)& LTLMPH NFNDBDIFE ޿ࠂσʔλ "QQMJDBUJPO (PMBOH දࣔ਺ ΫϦοΫ਺ 6/*9υϝΠϯιέοτ $JSDVT ޿ࠂσʔλ ܭଌ݁Ռ ϥ΢ϯυϩϏϯ 6/*9υϝΠϯιέοτ ϑΝΠϧσΟεΫϦϓλ

Slide 16

Slide 16 text

഑৴αʔόʔઃܭ • ܰྔͳ KVS ʹ޿ࠂσʔλΛอଘ͓͍ͯͯ͠ϦΫΤετʹԠͯͦ͡ͷσʔλΛฦ͢ΞϓϦέʔ γϣϯ • ը૾σʔλ΋ಉ༷ʹ഑৴͢Δ͕Ωϟογϡ͓͖ͯ͠ը૾ੜ੒͕ෳ਺ճߦΘΕͳ͍Α͏ʹ͢Δ • ը૾σʔλࣗମͷදࣔ਺ΛܭଌΛ͢Δ͜ͱ͸ͳ͍ • ը૾σʔλΛ౎౓ੜ੒ͨ͠Β͕͔͔࣌ؒΓ͗͢Δ • දࣔ΍ΫϦοΫ͕͞ΕΕ͹ϑΝΠϧʹॻ͖ࠐΉʢksk.logʣ • fluentd Ͱ ksk.log Λ؂ࢹͯ͠ܭଌ݁ՌΛ؅ཧαʔόʔͷ MySQL ʹॻ͖ࠐΉ • άϩʔόϧIPͰϢʔβʔͷϦΫΤετΛ௚઀ड͚Δ͜ͱͰߴ଎ʹϨεϙϯεฦ٫ • DNSϥ΢ϯυϩϏϯෳ਺ͷάϩʔόϧIP͕ొ࿥͞Ε͍ͯΔͷͰͲΕ͔Λબ୒

Slide 17

Slide 17 text

%/4 w %/4͸*1ΞυϨεʹ໊લΛ෇͚Δ࢓૊Έ w %/4αʔόʔʹฉ͘ͱ*1ΞυϨεΛڭ͑ͯ͘ΕΔ w ෳ਺ͷ*1ΞυϨεΛొ࿥ͯ͠ΞΫηεΛ෼ࢄͤ͞Δͷ͕%/4ϥ΢ϯυϩϏϯ w XXXQJYJWOFUͷ৔߹ w Ϣʔβʔ͕Ωϟογϡ%/4αʔόʔʹXXXQJYJWOFUͷ໊લղܾΛཁٻ͢Δ w Ωϟογϡ%/4αʔόʔ͕ϧʔταʔόʔʹOFUΛ؅ཧ͍ͯ͠ΔݖҖ%/4αʔόʔͷ*1ΞυϨεΛฉ͘ w Ωϟογϡ%/4αʔόʔ͕OFUͷݖҖ%/4αʔόʔʹQJYJWOFUͷݖҖ%/4αʔόʔͷ*1ΞυϨεΛฉ͘ ʢࣾ಺Ͱ؅ཧ͍ͯ͠Δαʔόʔʣ w QJYJWOFUͷݖҖ%/4αʔόʔʹXXXQJYJWOFUͷ*1ΞυϨεΛฉ͘ %/4 XXXQJYJWOFU

Slide 18

Slide 18 text

fluentd • Ruby੡ͷϩάऩूιϑτ΢ΣΞ • DSLͰॲཧΛॻ͍͍ͯ͘ • ϩάϑΝΠϧΛଞͷαʔόʔʹू໿ͤ͞Δ • ϩάΛղੳͯ݁͠ՌΛͲ͔͜ʹ౤͛Δ • ϓϥάΠϯ͕ॆ࣮͍ͯͯ͠ઃఆΛॻ͚ͩ͘Ͱ༷ʑͳػೳ͕ར༻Մೳ • ࣦഊ࣌ʹϦτϥΠͨ͠Γɼॏෳͯ͠ૹΒͳ͍ػೳͳͲ͕͋Δ • pixivͰ͸ओʹΞΫηεϩάɾΤϥʔϩάऩूΛͯ͠Ϣʔβʔͷಈ޲֬ೝ΍ Τϥʔݕ஌ͳͲʹ࢖ΘΕΔ͜ͱ͕ଟ͍

Slide 19

Slide 19 text

ωοτϫʔΫͷ৑௕Խ • άϩʔόϧIPͰ௨৴͢ΔͷͰԿ͔͕ނোͯ͠௨৴Ͱ͖ͳ͘ͳΔͱҰ੾Կ΋Ͱ͖ͳ ͘ͳΔ • έʔϒϧͷஅઢɾNICނোɾεΠονϙʔτނোɾεΠονނো • ͜͏͍ͬͨނো͸සൟʹى͜Δ • ނোͯ͠΋େৎ෉ͳΑ͏ʹ৑௕Խ͢Δඞཁ • ৑௕Խͱ͸Ұ෦ͷγεςϜো֐ʹඋ͑ͯ༧උ૷ஔͳͲΛ༻ҙ͓ͯ͘͜͠ͱ • ෳ਺ͷNICΛ༻ҙͯ͠ผͷεΠονʹ઀ଓ • ͦΕͧΕͷNICʹಉ͡IPΞυϨεΛ෇͚ͯยํ͕ނোͨ͠ΒࣗಈͰ੾ΓସΘΔ Α͏ͳ࢓૊Έʹ͍ͨ͠

Slide 20

Slide 20 text

Bonding • LinuxΧʔωϧͷϞδϡʔϧͷ1ͭ • ෳ਺ͷNICΛ·ͱΊͯ1ͭͷ࿦ཧNICͱͯ͠ѻ͑ΔΑ͏ʹͳΔ • ϐΫγϒͰ͸جຊతʹނো͢Δ·Ͱ1ͭΊͷ෺ཧNICͷΈΛ࢖ͬͯނো࣌ʹ੾Γସ͑Δ active-backupΛ࢖༻ • ͜Ε͕Ұ൪ѻ͍΍͍͢Β͍͠ • ݱࡏMII(Media Independent Interface)؂ࢹΛ࢖ͬͯ෺ཧNICͷLink Downͯ͠ͳ͍͔؂ࢹ • ௿ίετʹ؂ࢹՄೳ • Link Downͯ͠ͳ͍ͷʹ௨৴Ͱ͖ͳ͍ঢ়گͰରԠ͕Ͱ͖ͳ͍ • ARP؂ࢹΛ͢Ε͹௨৴Ͱ͖ͳ͍ঢ়گͰ΋೺ѲͰ͖Δ͕ߴίετ

Slide 21

Slide 21 text

഑৴αʔόʔϓϩτλΠϓ • ϓϩτλΠϓ͸RubyͷϑϨʔϜϫʔΫPadrino੡ͰσʔλετΞͱͯ͠GroongaΛ࢖༻ • Groonga͸શจݕࡧΤϯδϯͱͯ͠։ൃ͞Ε͓ͯΓܰྔͳKVSͱͯ͠࢖͏ʹ͸޲͔ͳ͍ • ଎౓ɾ҆ఆੑɾ৴པੑతʹࠓճͷ഑৴αʔόʔʹ͸޲͔ͳ͍ͱ൑அ • ܰྔͳKVSͱͯ͠memcachedΛఏҊ • ొ࿥͞Ε͍ͯΔ޿ࠂσʔλ͸๲େ͕࣮ͩࡍʹͦͷ࣌഑৴͠ͳ͚Ε͹޿ࠂσʔλ͸গ ͳ͍ • ݩσʔλ͸؅ཧαʔόʔ͕શ͍ͯ࣋ͬͯΔͷͰ഑৴αʔόʔ্ʹӬଓσʔλΛ࣋ͭ ඞཁ͸ͳ͍ • େن໛ͳ Web ΞϓϦέʔγϣϯͰ΋࠾༻ྫ͕ଟ͘ɼ଎౓ɾ҆ఆੑɾ৴པੑͲΕ΋ ߴ͍

Slide 22

Slide 22 text

Padrino • Sinatraϕʔεͷ Web ΞϓϦέʔγϣϯϑϨʔϜϫʔΫ • Sinatra͸ඇৗʹγϯϓϧͳRackϕʔεͷWebΞϓϦέʔγϣϯϑϨʔϜϫʔΫ • جຊతʹDSLͰϧʔςΟϯάͷΈΛߦ͏ • ੔ͬͨSinatraͱ͍͏ײ͡ • Sinatraͷ஌ࣝ͸΄΅ͦͷ··׆͔ͤΔ • RailsΑΓ΋ػೳ͸গͳ͍͕΄ͱΜͲͷ৔߹ࠔΒͳ͍ͱࢥ͏ • ࠓճ͸αʔόʔʹUnicornΛ࢖༻ • RailsΞϓϦͰࣾ಺Ͱ΋ಋೖ࣮੷͕͋Δ • ؅ཧαʔόʔͰ΋࢖͍ͬͯΔ

Slide 23

Slide 23 text

memcached • KVSͱͯ͠ͱͯ΋ஶ໊Ͱ࠾༻ྫ΋ଟ͍ • Key-Value Store • memcached͸Ωʔ΋όϦϡʔ΋จࣈྻͷΈ • Facebook/GoogleͳͲ౤ೖ࣮੷͸਺஌Εͣ • ϝϞϦΩϟογϡͳͷͰӬଓσʔλ͸อଘͰ͖ͳ͍ • ऴྃͨ͠Βσʔλ͸ফ͑ͯ͠·͏ • อଘͰ͖Δ༰ྔ͸ϝϞϦΩϟογϡͳͷͰগͳ͍ • ઃఆʹΑΔ͕౥ࡌϝϞϦҎ্͸อଘͰ͖ͳ͍ • ߴ଎͔ͭ҆ఆ͍ͯ͠ΔͷͰΩϟογϡͱͯ͠Α͘ར༻͞ΕΔ

Slide 24

Slide 24 text

RubyʹΑΔ഑৴αʔόʔ • Padrino੡ͰKVSͱͯ͠memcachedΛ࢖༻ͯ͠ݕূ • ϓϩϑΝΠϦϯάΛऔΓͳ͕ΒϘτϧωοΫΛͳ͍ͯ͘͘͠ • ϓϩϑΝΠϦϯάʹϑϨʔϜϫʔΫ૚͔͠ग़ͯ͜ͳ͘ͳ͖ͬͯͨͷͰ Padrino ґଘΛ֎ͯ͠ Sinatra Ξ ϓϦʹ • ab(Apache Bench)/Apache JMeterΛ࢖ͬͯੑೳΛνΣοΫ • ͦΕͰ΋໨ඪͷੑೳ͕ग़ͤͣɼUnicornҎ֎ͷαʔόʔͰݕূ • Unicorn͕΋ͬͱ΋ੑೳ͕ߴ͍ͱ͍͏݁Ռʹ • JRubyͰಈ͘Α͏ʹϦϥΠτͯ͠JRuby༻ͷଞͷαʔόʔ΋ݕূ • ݁ہUnicornΛ௒͑ΔੑೳΛग़ͤͣRubyʹΑΔ࣮૷Λஅ೦ • ࠓճͷ޿ࠂ഑৴αʔόʔͰͷ࿩ͰҰൠతʹUnicorn͕଎͍ͱ͍͏Θ͚Ͱ͸ͳ͍

Slide 25

Slide 25 text

GolangͰϦϥΠτ • ύϑΥʔϚϯεΛٻΊͯGoݴޠͰͷϦϥΠτ • Goݴޠ͸Google͕࡞ͬͨ৽͍͠ϓϩάϥϛϯάݴޠ • LLΑΓ΋Cݴޠʹ͍ۙ • ίϯύΠϧܕ • GoroutinesΛ࢖͏ͱ؆୯ʹϚϧνεϨουʹ • GoroutinesΛ࢖ͬͯϚϧνεϨουͳαʔόʔΛ࣮૷ • ୯७ʹϦϥΠτ͚ͩͰ଎͘ͳΔΘ͚Ͱ͸ͳ͔ͬͨ • memcachedΛ࢖͏఺ͳͲجຊతͳ෦෼͸શͯ౿ऻ • αʔόʔͱͯ͠ͷ౤ೖ͸౰࣌ࣾ಺ॳ

Slide 26

Slide 26 text

௒ࢲత PHP vs Ruby vs Go • PHP ͸ Apache ্Ͱಈ͘ศརςϯϓϨʔτΤϯδϯΛॻ͘ײ͡ • ศརؔ਺͸ php.net Ͱݕࡧ͢Ε͹ḿΔ • Ruby ͸ϑϨʔϜϫʔΫΛ௨ͯ͡ Rack ΞϓϦέʔγϣϯΛॻ͘ײ͡ • ϑϨʔϜϫʔΫͷίʔυΛಡΉ͜ͱ͕ଟ͍ • ίʔυΛॻ͘ͱ͖͸ Rack ΑΓԼͷ͜ͱΛҙࣝ͢Δ͜ͱ͸͋·Γͳ͍ • Go ͸ import ‘net’ ͱ͔͢Δͱ਺ߦͰαʔόʔΛىಈͰ͖ΔͷͰޙ͸Α͠ͳʹͰ͖Δ • godoc ͕෼͔Γ΍͍͢ͷͰͦΕΛಡΉ • جຊతʹඞཁͳॲཧΛશ෦ࣗ෼Ͱॻ͘ඞཁ͕͋Δ

Slide 27

Slide 27 text

NginxͱGoΛܨ͙ • ϢʔβʔͷϦΫΤετΛ௚઀ Go ͕ड͚ΔͷͰ͸ͳ͘ Nginx Ͱड͚͍ͨ • ϢʔβʔͷϦΫΤετΛόοϑΝϦϯάͯ͘͠ΕΔͷͰίωΫγϣϯͷอ࣋ͳͲ໘౗ͳ͜ ͱΛߟ͑Δඞཁ͕ͳ͘ͳΔ • GoͰ͸௿஗ԆͰϨεϙϯεΛฦ͢͜ͱ͚ͩΛߟ͑Ε͹Α͍ • ΞΫηεϩάͳͲ͕؆୯ʹ࢒ͤΔ • ΞΫηε੍ޚͳͲ؆୯ • ΩϟογϡͷػߏͳͲ͕؆୯ʹ࢖͑Δ • ࣾ಺ʹϊ΢ϋ΢͕ଟ͋͘Δ • ޿ࠂ͸খ͍͞ύέοτΛ΍ΓͱΓ͢ΔͷͰtcpͩͱΦʔόʔϔου͕େ͖͍ • UNIX domain socketܦ༝Ͱܨ͙ඞཁ͕͋Δ

Slide 28

Slide 28 text

UNIX domain socket • ϓϩηεؒ௨৴ • ಉҰϚγϯ্ͳΒ਌ࢠؔ܎ͳͲ͕ແͯ͘΋௨৴͕Ͱ͖Δ • tcpͳͲΑΓ΋҆ఆɾߴ଎ʹಈ͘ • memcachedͱͷ௨৴ʹ΋࢖༻͢Δͱߴ଎͔ͭ҆ఆతʹಈ࡞ͤ͞Δ͜ͱ͕Ͱ͖Δ • ΋ͪΖΜ࢖༻͍ͯ͠Δ • ϐΫγϒࣾ಺Ͱ͸গͳ͍ϦιʔεͰେྔͷΞΫηεΛߴ଎ʹ͞͹ͨ͘ΊʹࢸΔͱ ͜ΖͰ࠾༻͞Ε͍ͯΔ • Go ͷ৔߹ net.Listen("unix", path) ͷΑ͏ʹ͢Ε͹Α͍

Slide 29

Slide 29 text

hot deploy • DNSϥ΢ϯυϩϏϯͷͨΊִ཭͕ࠔ೉ • ޿ࠂαʔόʔ͸AWSͰ͸ͳ͍ͷͰELB͸࢖͑ͳ͍ • pixivपลαʔϏε͸ίετ໘͔ΒAWSΛ࢖Θͳ͍ • ௒େྔֆഅɾpixivࣣ༦୹࡭ࡇͳͲظؒݶఆͷ΋ͷʹ͸AWS͸࢖ΘΕ͍ͯ Δ • ݱࡏͷ޿ࠂۀքͰ͸AWSΛ࢖͏ͷ͕ଟ͍ͷͰELBΛ࢖ͬͯhot deployΛ ࣮ݱ͍ͯ͠Δձ͕ࣾଟ͍ • ޿ࠂαʔόʔͳͷͰσϓϩΠ࣌ʹμ΢ϯλΠϜ͕ൃੜͯ͠͸͍͚ͳ͍

Slide 30

Slide 30 text

Circus w .P[JMMB͕࡞ͬͨ1ZUIPO੡ͷϓϩηε؅ཧπʔϧ w $JSDVTࣗମ͕ιέοτϑΝΠϧΛ࣋ͬͯɼΞϓϦέʔγϣϯ͸ϑΝΠϧσΟεΫϦϓ λΛ-JTUFOͤͯ͞ىಈ͢Δ w σϓϩΠ࣌ʹ৽͍͠ϓϩηε͕ىಈ͔ͯ͠Βݹ͍ϓϩηεΛLJMM͢Δ w μ΢ϯλΠϜͳ͠ͰΞϓϦέʔγϣϯΛೖΕସ͑Δ͜ͱ͕Ͱ͖Δ w ઃఆϑΝΠϧΛॻ͘ͱ͍͍ײ͡ʹىಈͯ͘͠ΕΔ w FYBNQMF͕๛෋ͳͷͰׂͱॻ͚Δ w (PଆͰ͸ϩά͸ඪ४ग़ྗͱඪ४Τϥʔग़ྗʹॻ͚ͩ͘Ͱ$JSDVT͕ϩάϑΝΠϧԽͱϩ άϩʔςʔτΛશͯ୲͏ w (Pଆͷ։ൃίετΛԼ͛Δ w DJSDVTDUMͱ͍͏ίϚϯυπʔϧܦ༝Ͱૢ࡞͢Δ

Slide 31

Slide 31 text

Circus΁ϓϧϦΫ • Circus͸GitHubͰ։ൃ͞Ε͍ͯΔ • Debianͷinit.dεΫϦϓτ͸CircusࣗମͷϩάΛग़ྗ͠ͳ͔ͬͨ • ग़ྗͰ͖ΔΑ͏ʹมߋͯ͠ϓϧϦΫ΋ͯ͠ΈΔ • merge͞Εͨ • ϐΫγϒͰ͸ࣾ಺Ͱ࢖༻͍ͯ͠ΔΦʔϓϯιʔεϓϩμΫτʹύονΛૹΔͷ͸ਪ ঑͞Ε͍ͯΔ • ༗໊ͳϓϩμΫτͰ΋ࡉ͔͍෦෼͸ద౰ͳ͜ͱ͕ଟ͍ • Mozillaͷϓϩηε؅ཧπʔϧcircusʹϓϧϦΫͨ͠࿩ - catatsuyͱ͸ http:// catatsuy.hateblo.jp/entry/2014/08/18/215602

Slide 32

Slide 32 text

socket TPDLFU࡞੒ ϑΝΠϧ σΟεΫϦϓλ socket ϑΝΠϧ σΟεΫϦϓλ ϓϩηε؂ࢹ DJSDVT͸ϓϩηε؂ࢹ͚ͩ ͰϦΫΤετ͸ײ஌͠ͳ͍ BQQ͸ϑΝΠϧσΟεΫϦϓλΛ -JTUFO͢ΔαʔόʔͰ͋Δඞཁ͕͋Δ αʔόʔىಈ࣌ αʔόʔىಈޙ circus app circus app GPSLFYFD

Slide 33

Slide 33 text

circus socket ϑΝΠϧ σΟεΫϦϓλ app_old GPSLFYFD app_new ϓϩηε؂ࢹ αʔόʔϦϩʔυ αʔόʔϦϩʔυ BQQ@OFX͕ىಈ͢Δ·Ͱ଴ͭ BQQ@OFX͕ىಈͨ͠Β BQQ@PMEΛLJMM͢Δ circus socket ϑΝΠϧ σΟεΫϦϓλ app_old app_new ϓϩηε؂ࢹ LJMM

Slide 34

Slide 34 text

w qBHͰίϚϯυϥΠϯΦϓ γϣϯΛ౉ͤΔΑ͏ʹ w TZTDBMM͸(PͰϑϦʔζ͞ ΕΔͷͰ(PҎ߱͸࢖Θͳ ͍ํ͕ྑͦ͞͏ w OFU-JTUFOFSΛ༻ҙ͢Δͱ෼ ذ͕ͭͰࡁΉ w खݩͰͷ։ൃΛ͠ʹ͘͘͠ͳ ͍Α͏ʹUDQͰͷαʔόʔىಈ ΋αϙʔτͰ͖Δ

Slide 35

Slide 35 text

ΩϟογϡԽ • ΞΫηεͷ౓ʹmemcachedʹΞΫηεΛͨ͠Β஗্͍ʹ CPU ࢖༻཰΋্͕ͬͯ͠·ͬͨ • memcachedͷऔಘ݁ՌΛΞϓϦέʔγϣϯଆͰ30ඵؒΩϟογϡ͢Δ͜ͱʹ • ௕͗͢Δͱ޿ࠂσʔλͷ൓ө͕஗ΕΔ • ΩϟογϡԽ͸ۜͷ஄ؙͰ͸ͳ͍ • ifจ͸δϟϯϓ໋ྩͳͷͰҋӢʹ࢖͏ͱ஗͘ͳΔ • ܭࢉ݁ՌͷΩϟογϡͳͲ΋෼ذ༧ଌ͕౰ͨΓʹ͍͘ܗͩͬͨΓ͢Δͱ౎౓ܭࢉͤͨ͞ํ ͕଎͍ࣄ͕ଟ͍ • ΞϓϦέʔγϣϯͷෳࡶ౓Λ্͛Δ • ΩϟογϡԽ͸ଌఆͯ͠ޮՌ͕͋Δ෺Ҏ֎͸࢖༻͠ͳ͍ • ਪଌ͢Δͳ ܭଌͤΑ

Slide 36

Slide 36 text

JSONͱMessagePack • memcachedͷόϦϡʔʹJSONΛೖΕͯGoଆͰparse͍͕ͯͨ͠ϓϩϑΝΠϦϯά ͔Βparseʹ͕͔͔͍࣌ؒͬͯΔ͜ͱ͕൑໌ • JSONͱಉ͡Α͏ʹѻ͍΍͘͢ߴ଎ʹparseͰ͖ΔMessagePackΛ࢖༻͢Δͱߴ଎ʹ ಈ࡞ͨ͠ • fluentdͷ಺෦Ͱ΋MessagePack͸࢖ΘΕ͍ͯΔ • Go͸JSONपΓͷػೳ͕ॆ࣮͍ͯ͠Δ͚ͩ஗͍ • ஗͔ͬͨΒϓϩϑΝΠϦϯάΛऔΓϘτϧωοΫΛݟ͚ͭͯରࡦΛߟ͑Δ΂͖ • Goʹͨ͠Βඞͣ଎͘ͳΔͱ͍͏͜ͱ͸ͳ͍ • ਪଌ͢Δͳ ܭଌͤΑ

Slide 37

Slide 37 text

σϓϩΠ • ࣾ಺σϓϩΠπʔϧpploy(OSS)Λ࢖͏ • pixivͷσϓϩΠΛࢧ͑Δpploy - pixiv engineering blog http://inside.pixiv.net/entry/ 2014/12/25/102410 • σϓϩΠαʔόʔ্ͰεΫϦϓτΛ࣮ߦग़དྷΔ • γΣϧεΫϦϓτͰ΋PHPͳͲͰ΋Α͍ʢࠓ͸શ෦γΣϧεΫϦϓτʣ • fluentd͸HUPγάφϧΛૹΔͱϦϩʔυͰ͖Δ • init.dεΫϦϓτΛࣗલͰ࡞੒ • Go͸ϥΠϒϥϦʹґଘ͠ͳ͍࣮ߦόΠφϦΛίϯύΠϧͰੜ੒ • σϓϩΠαʔόʔͰίϯύΠϧ֤ͯ͠αʔόʔ΁όΠφϦΛ഑෍

Slide 38

Slide 38 text

git clone go build rsync circusctl reload && fluentd reload deploy server application server

Slide 39

Slide 39 text

ϓϩηε؂ࢹ • ΞϓϦέʔγϣϯ͸Circus • memcached, fluentd͸monitΛར༻ • monit͸pidϑΝΠϧΛ࡞Δinit.dεΫϦϓτ͕͋ΔͳΒ؆୯ʹ ϓϩηε؂ࢹ͕Ͱ͖Δ • memcached͸init.dεΫϦϓτ͕طʹ͋ͬͨ • fluentd͸reload࣌ʹHUPγάφϧΛૹΔͨΊʹinit.dεΫϦ ϓτΛࣗ࡞͍ͯͨ͠

Slide 40

Slide 40 text

ࢮ׆؂ࢹ • ϐΫγϒ͸NagiosΛ࢖͍ͬͯΔͷͰNagiosͰ؂ࢹ • ΞϓϦέʔγϣϯ͸εςʔλείʔυ200൪Λฦ͚ͩ͢ͷϧʔςΟϯάΛ༻ҙͯ͠؂ࢹ • fluentd͸monitor_agentΛ࢖ͬͯ؂ࢹ • Nginx͸stub_statusΛ࢖ͬͯ؂ࢹ • Circus͸circusctl statusͷ݁Ռ͔Β؂ࢹ • memcached͸tcp͕ૄ௨͍ͯ͠Δ͔Ͳ͏͔Λ؂ࢹ • memcached͸ύονΛ౰ͯΔͱTCPιέοτͱUNIXυϝΠϯιέοτΛಉ࣌ʹ listenͰ͖Δ

Slide 41

Slide 41 text

ىͬͨ͜τϥϒϧɾ՝୊ͱ ղܾࡦ ʙຊ֨ӡ༻લฤʙ

Slide 42

Slide 42 text

഑৴தͷ޿ࠂσʔλ͕৽͍͠ ޿ࠂΛೖߘ్ͨ͠୺ʹফ͑ͨ

Slide 43

Slide 43 text

഑৴தͷ޿ࠂσʔλ͕৽͍͠ ޿ࠂΛೖߘ్ͨ͠୺ʹফ͑ͨ • telnet localhost 11211Ͱ11211ϙʔτͰىಈ͍ͯ͠Δmemcachedͱձ࿩Ͱ͖Δ • statsͰىಈதͷmemcachedͷঢ়ଶΛ֬ೝͰ͖Δ • evictions͕େྔൃੜ • ༰ྔෆ଍Ͱmemcached͕௥͍ग़ͨ͠ճ਺ • limit_maxbytes͕૝ఆΑΓ͔ͳΓখ͍͞ • ࠷େ༰ྔ͕খ͍͞ͷͰ௥͍ग़͞Ε͍ͯͨ • ઃఆ஋ͷ༩͑ํΛؒҧ͍͑ͯͨ • ઃఆΛมߋͨ͠Β൓ө͞Ε͍ͯΔ͔֬ೝ͢Δ͜ͱ w ΦϯϝϞϦܕͷϛυϧ΢ΣΞ͸ϝϞϦ࢖༻཰Λ؂ࢹ͢΂͖

Slide 44

Slide 44 text

NginxͰ഑৴͍ͯ͠Δ޿ࠂͷը ૾ΛϢʔβʔͷϒϥ΢β͕Ωϟο γϡͯ͘͠Εͳ͍

Slide 45

Slide 45 text

/(*/9 ը૾ $"$)& ը૾͍ͩ͘͞ʂ ը૾͋͛Δ͚Ͳ Ωϟογϡͯ͠Ͷ application ը૾͕ͳ͍ͷͰ ը૾͍ͩ͘͞ ը૾ૹΓ·͢ /(*/9 ը૾ $"$)& ͜ͷը૾ͷΩϟογϡΛ ࣋ͬͯΔ͚Ͳߋ৽͋Δʁ ߋ৽ͳ͍͔Β ͦͷ··࢖ͬͯʂ application Ұ౓ը૾ΛૹͬͨΒ ͠͹Β͘Ωϟογϡ͞ΕΔ ͷͰϦΫΤετ͞Εͳ͍ ճ໨ ճ໨ ͱͳΔ͸͕ͣ໰౴ແ༻Ͱ ը૾ΛૹΓ͚͍ͭͯͨʜ ࠷ॳͷճ͚ͩͰͦͷޙ͸ ը૾Ωϟογϡ͕ฦ͢ͷͰ ϦΫΤετ͞Εͳ͍

Slide 46

Slide 46 text

NginxͰ഑৴͍ͯ͠Δ޿ࠂͷը૾ΛϢʔβʔ ͷϒϥ΢β͕Ωϟογϡͯ͘͠Εͳ͍ • ϒϥ΢βʹΩϟογϡͯ͠ཉ͍͠ͳΒHTTPͷϨεϙϯεϔομʔʹLast-Modified/ Expires/Cache-ControlΛ෇͚Δ • ϒϥ΢β͸ಉ͡URL΁ͷϦΫΤετͷϔομʔʹIf-Modified-SinceΛ෇͚ͯϒϥ΢β ͕औಘͨ͠೔࣌Λ஌Βͤͯ͘ΕΔ • If-Modified-SinceΑΓޙʹߋ৽͞Ε͍ͯΕ͹৽͍͠σʔλΛɼߋ৽͕ͳ͚Ε͹εςʔ λείʔυ304(Not Modified)Λฦͯ͠ΩϟογϡΛͦͷ··࢖ͬͯ΋Β͏ • ࠓճͷ޿ࠂαʔόʔͰ͸ը૾͕มΘΕ͹URL͕มΘΔͨΊը૾σʔλʹߋ৽͕ೖΔ͜ ͱ͸ͳ͍ • ͦ΋ͦ΋ը૾͸NginxଆͰΩϟογϡ͞Εͯ͠·͏ͷͰΞϓϦέʔγϣϯͷϨεϙϯ ε಺༰͕มΘ͍ͬͯͯ΋Nginx͸ؾ෇͔ͳ͍

Slide 47

Slide 47 text

Nginx͕ϑΝΠϧͷߋ৽༗ແΛͲ͏൑அ͢Δͷ͔ • If-Modified-SinceΛݟͯ200͔304͔Λ൑அ͢ΔͷͰNginx͕ը૾σʔλͷλΠϜελϯϓΛ೺Ѳͯ͠ ͍ͳ͍ͱμϝͰ͸ʁ • Goͷαʔόʔ͕ฦ͢ͳΒλΠϜελϯϓͰ͸ͳ͘Last-ModifiedϔομʔͰ൑அ͍ͯ͠Δʁ • memcachedʹ޿ࠂσʔλ͕͍ͭೖߘ͞Εͨͷ͔ͷ৘ใΛೖΕͯͳ͔ͬͨͷͰ1970/1/2ʹ • ͋·Γྑ͘ͳ͍͕ը૾σʔλ͕มΘΕ͹URL͕มΘΔͷͰ࣮༻্໰୊͸ͳ͍ • ͜ͷͨΊʹmemcachedʹ֨ೲ͢ΔσʔλΛ૿΍͢ͷ͸खؒΛߟ͑Δͱׂʹ߹Θͳ͍ • epoch Time 0ͷ1970/1/1ͩͱόάͩͱࢥΘΕΔՄೳੑ͕͋ΔͷͰආ͚ͨ • NginxͷΩϟογϡ͕ݹ͍··ͰҰ෦ͷը૾ͰΩϟογϡ͞Εͣ • ΩϟογϡΛ࡟আͨ͠Βશը૾Ͱ૝ఆ௨Γͷಈ͖ʹ • যΒͣʹҰͭҰͭ֬ೝͯ͠ঢ়گΛ೺Ѳ͠ͳ͕Β࢓༷Λௐ΂Δ͜ͱ

Slide 48

Slide 48 text

GoͷΤϥʔϩάʹϢʔβʔͷ IPΞυϨεΛද͍ࣔͨ͠

Slide 49

Slide 49 text

GoͷΤϥʔϩάʹϢʔβʔͷ IPΞυϨεΛද͍ࣔͨ͠ • ߈ܸ͞Ε͍ͯΔՄೳੑ͕͋ΔͷͰΤϥʔΛى͍ͯ͜͠ΔϢʔβʔͷIPΞυϨεΛ஌Γ͍ͨ • ϑϩϯτ͕NginxͰproxyͯ͠Goଆʹ౉͢ • ϢʔβʔͷϦΫΤετ͕ͦͷ··౉ΔΘ͚Ͱ͸ͳ͍ • ૹ৴ݩIPΞυϨε͸ϢʔβʔͰ͸ͳ͘Nginx͕ಈ͍͍ͯΔαʔόʔ • proxy_set_headerͰϢʔβʔͷIPΞυϨεΛผͷϔομʔʹ෇͚Δ • X-Real-IP΍X-Forwarded-Forʹ෇͚Δ • GoଆͰϔομʔΛ͏·͘ಡΊͳ͍ • Goͷίʔυʹ໰୊͕͋Δͷ͔Nginxͷઃఆʹ໰୊͕͋Δͷ͔੾Γ෼͚͕Ͱ͖ͳ͍ • tcpͳΒtcpdumpΛ͢Ε͹ϦΫΤετͷύέοτ͕௚઀ݟ͑ΔͷͰ੾Γ෼͚͕Ͱ͖Δ͕NginxͱGoͷ௨ ৴ʹ࢖͍ͬͯΔUNIXυϝΠϯιέοτ͸؆୯ʹݟΕͳ͍

Slide 50

Slide 50 text

straceͰγεςϜίʔϧΛݟΔ • UNIXυϝΠϯιέοτͰ΍ΓऔΓ͢ΔͳΒγεςϜίʔϧͷwrite͸૸Δ • γεςϜίʔϧ͕૸ΔͳΒstraceΛ࢖͑͹ݟΕΔ • straceͰ΋ྲྀΕͳ͍… • ϢʔβʔͷϦΫΤετΛड͚͍ͯΔͷ͸GoroutineͰεϨουͰಈ͍͍ͯΔ • straceͷ-fΦϓγϣϯΛ࢖͏ͱεϨου΋τϨʔεͯ͘͠ΕΔ • -sΦϓγϣϯͰ௕͍ϦΫΤετͰ΋શ෦ݟΕΔΑ͏ʹͳΔ w ໰୊͕ىͬͨ͜Β·ͣݪҼΛ੾Γ෼͚Δ • nginx - UNIXυϝΠϯιέοτ௨৴ͷ಺༰Λݟ͍ͨ - Qiita http://qiita.com/catatsuy/items/ e514e8bd45270106b17e

Slide 51

Slide 51 text

͏Θͬ…ࢲͷϖʔδΩϟο γϡ૿͑͗͢…ʁ

Slide 52

Slide 52 text

͏Θͬ…ࢲͷϖʔδΩϟογϡ૿͑͗͢…ʁ • ࠓճͷ޿ࠂαʔόʔ͸େྔͷϩάΛग़ྗ͢Δ • ࢖༻͍ͯ͠ͳ͍ϩά΋ϖʔδΩϟογϡʹࡌ͍ͬͯΔͷͰ࢖༻͠ͳ͍ϩάϑΝ Πϧ͸cronͰఆظతʹϖʔδΩϟογϡ͔Β࡟আ͢Δඞཁ͋Γ • cpanϞδϡʔϧͷSys::PageCacheͰ࡟আͰ͖Δ • ͜ΕͰϖʔδΩϟογϡΛ཈͍͑ͯͨ͸͕ͣmuninͷάϥϑΛݟΔͱ͋Δ࣌ ͔Βಥવ૿͍͑ͯΔ • ϖʔδΩϟογϡ͕૿͑͗͢Δͱswapͯ҆͠ఆՔಇʹ໰୊͕ग़ΔՄೳੑ͕ߴ ͘ରԠ͕ඞཁ • ͲͷϩάϑΝΠϧ͕ϖʔδΩϟογϡΛ͍ᷰͬͯΔͷ͔෼͔Βͳ͍

Slide 53

Slide 53 text

No content

Slide 54

Slide 54 text

find / -type f -name "*" -size +1000k -mmin -60 2> /dev/null \ | xargs sudo pagecache-check.pl 2> /dev/null \ | perl -ne 'if ((m{(.*?)\s.*cached/total_pages=(.*)/.*}) && ($2 > 0)) { print $2, "\t", $1, "\n"; }' \ | sort -nr w 6/*9Β͘͠ίϚϯυΛ૊Έ߹ΘͤͯQFSMͰ੔ܗ͢Δ w ϩάϩʔςʔτͷࣦഊɾϩάΛ΄ͱΜͲग़ྗ͍ͯ͠ͳ͔ͬͨΞϓϦ έʔγϣϯ͕ಥવϩάΛ͍͢͝੎͍Ͱग़ྗ͢Δ͜ͱ͕ݪҼͩͬͨ w άϥϑͰҧ࿨ײΛײͨ͡ΒઈରʹԿ͔͋ΔͷͰೲಘͷ͍͘·Ͱௐ΂ Δ ϖʔδΩϟογϡΛᷰ͏ϩάΛݟ͚ͭΔ

Slide 55

Slide 55 text

ϩάղੳ༻ͷfluentd ͱͷ֨ಆ

Slide 56

Slide 56 text

ϩάղੳ༻ͷfluentdͱͷ֨ಆ • ࠓճ͸ΞϓϦέʔγϣϯʹ΋fluentdΛ࢖͍ͬͯΔ͕ϐΫγϒࣾ಺తʹ͸ϩάղੳ༻్ʹ࢖ΘΕΔ • ΞϓϦέʔγϣϯͷΤϥʔϩάΛૹΔ࢓૊Έ • Ϣʔβʔղੳ༻ʹΞΫηεϩάΛऩू͢Δ࢓૊Έ • ޿ࠂ഑৴αʔόʔʹҟৗ͕ͳ͍͔Nginxͷϩά͔Β؂ࢹ͍ͨ͠ • εςʔλείʔυ400൪୆͕ಥવ૿͑ͨͳͲ • ϨεϙϯελΠϜʹҟৗ͕ͳ͍͔؂ࢹ͍ͨ͠ • ͜͜਺೔Ͱҟৗʹ଎౓͕མ͍ͪͯΔͳͲ • ֤഑৴αʔόʔͷNginxͷϩάΛղੳͯ͠άϥϑԽ • άϥϑԽʹ͸σʔλΛPOST͚ͨͩ͠Ͱάϥϑʹͯ͘͠ΕΔGrowthForecastͰ

Slide 57

Slide 57 text

fluentdͰϩάΛղੳ͢Δ • in_tailϓϥάΠϯΛ࢖༻͢ΔͱϩάϑΝΠϧΛtailͰ͖Δ • ਖ਼نදݱͳͲͰϩάϑΝΠϧΛղੳͤͯ݁͞ՌΛGrowthForecastʹPOST • શϩάΛਖ਼نදݱͰղੳ͍ͯ͠ΔͷͰCPUύϫʔΛ࢖͏ • ޿ࠂ഑৴αʔόʔ͸ϢʔβʔͷϦΫΤετΛड͚ΔͨΊCPUύϫʔΛ࢖͍ͨ͘ͳ͍ • ϢʔβʔͷϦΫΤετΛड͚͍ͯͳ͍ผαʔόʔʹϩάΛૹͬͯͦ͜Ͱղੳ͍ͨ͠ • ͦͷࡍʹͲ͜ͷαʔόʔͷϩά͔͸෼͔ΔΑ͏ʹ͍ͨ͠ • ϗετ໊΋ؚΊͯૹͬͯ͏·͘ϩάͰղੳ͢Δඞཁ͕͋Δ • ଓ͖͸WebͰ • fluentdͰϗετ໊෇͖ͰϩάΛड͚औͬͯղੳͯ͠άϥϑʹ͍ͨ͠ - Qiita http://qiita.com/ catatsuy/items/6755a796423067a77acd

Slide 58

Slide 58 text

ىͬͨ͜τϥϒϧɾ՝୊ͱ ղܾࡦ ʙຊ֨ӡ༻ޙฤʙ

Slide 59

Slide 59 text

.Z42-ͷ༰ྔരൃ

Slide 60

Slide 60 text

.Z42-ͷ༰ྔരൃ w ഑৴αʔόʔ͕ॻ͖ࠐΉϨίʔυΛͦͷ··શ෦࢒͍ͯͨ͠Βσʔλྔ͕΋ͷ͍͢͝੎͍ Ͱ૿͑ͨ w ඞཁͳͷ͸όονॲཧͰੜ੒͞ΕΔϨϙʔτͷσʔλͳͷͰϨϙʔτ͕࡞੒͞Ε͍ͯΕ͹ ෆཁͷσʔλ w ύʔςΟγϣχϯάͰఆظతʹ࡟আ͍ͨ͠ w .Z42-ͷύʔςΟγϣχϯάͰ͸ϓϥΠϚϦʔΩʔʹύʔςΟγϣχϯά͍ͨ͠Χϥ Ϝؚ͕·Ε͍ͯΔඞཁ͕͋Δ w NJHSBUJPOͰ"-5&35"#-&ͯ͠"3Ͱ͸໌ࣔతʹQSJNBSZ@LFZΛJEʹ͢Δ w ύʔςΟγϣχϯάࣗମ͸ຖ೔࡞ͬͯ͸ফ͢Λ܁Γฦ͢ͷͰNJHSBUJPO͸࡞Βͣʹ୯७ͳ όονͰ࣮ߦ͢ΔΑ͏ʹ w "-5&35"#-&ͱ࠷ॳͷύʔςΟγϣχϯάΛ࡞Δ࡞ۀ͸͕͔͔࣌ؒΔͷͰࣄલʹ༰ྔΛ ༧ଌͯ͠ύʔςΟγϣχϯά͕ඞཁͳ΋ͷΛચ͍ग़͓ͯ͘͠

Slide 61

Slide 61 text

w ϨίʔυΛظؒͳͲͰ෼ׂ͢Δ͜ͱͰࢀর͠ͳ͚Ε͹ͳΒͳ͍ϨίʔυͷྔΛݮΒ͢ w શظؒΛݟΔඞཁ͕͋ΔΫΤϦͳΒΉ͠Ζ஗͘ͳΔ w ΦϓςΟϚΠβ͕ͲͷύʔςΟγϣϯΛݟΕ͹͍͍͔൑அ͢ΔͷͰͦͷ࣌఺ͰҰ෦ͷύʔςΟγϣ ϯͷΈͷࢀরʹͰ͖Ε͹ߴ଎ʹ w ಛఆͷύʔςΟγϣϯΛߴ଎ʹ࡟আͰ͖Δ w ΠϯσοΫε͕షͬͯ͋ͬͯ΋࡟আ͸௨ৗ஗͍͕ύʔςΟγϣϯͷ࡟আ͸Ұॠ w ΠϯσοΫεͷ౷ܭ৘ใ͕յΕͨΓɼϑϥάϝϯςʔγϣϯ͕ൃੜ͢Δ͜ͱ͸ͳ͍ Ϩίʔυ Ϩίʔυ Ϩίʔυ Ϩίʔυ ύʔςΟγϣχϯάղઆ

Slide 62

Slide 62 text

ϩά͕SSDͷ༰ྔΛṧഭ

Slide 63

Slide 63 text

ϩά͕44%ͷ༰ྔΛṧഭ w LTLMPHΛूܭͯ͠.Z42-ʹॻ͖ࠐΉεΫϦϓτ͕ు͘ϩάΛ೔ճMPHSPUBUF͢ΔΑ͏ʹ͍ͯͨ͠ w ഑৴ྔ͕૿͑ͯ೔ճͰ͸ڊେ͗ͨ͢ w σΟεΫ༰ྔ΋ṧഭ͍ͯͨ͠ w ࣌ؒຖʹMPHSPUBUF͢ΔΑ͏ʹ w MPHSPUBUFGϑΝΠϧ໊ͰMPHSPUBUFΛ࣮ߦͰ͖Δ w /HJOYͷϩάΛগ͠௕Ίʹ࢒͢Α͏ʹ w ೔Ͱ44%ͷ༰ྔΛṧഭˠҰେࣄʹͳΔͱ͜ΖΛةػҰ൅ͰରԠʜ w qVFOUEͰϩάΛૹ͍ͬͯΔͷͰૹΓઌʹอଘ͢ΔΑ͏ʹ w ޿ࠂαʔόʔ͸ΞϓϦέʔγϣϯͷಛੑ্େྔͷϩάΛు͘ͷͰMPHSPUBUFͷλΠϛϯά΍࢒͢ϩά ͷྔΛߟ͑ͳ͍ͱࢮ͸͍ۙ w ϩάΛ෠ΔͱҰॠͰࢮʹࢸΔͷͰϩάͷྔͱ44%ͷۭ͖༰ྔʹ஫ҙ͢Δ͜ͱ

Slide 64

Slide 64 text

Goͷϓϩηε͕ 1ίΞ͔͠࢖Θͳ͍

Slide 65

Slide 65 text

(Pͷϓϩηε͕ίΞ͔͠࢖Θͳ͍ w NVOJOͷάϥϑ͕಄ΛଧͬͨΑ͏ʹͳΔ w (0."9130$4Λม͑ͯ΋μϝ w ͣͬͱʹ͍ͯͨ͠ͷΛ΍ʹ͕ͨ͠େ͖ͳҧ͍͸ݟΒΕͣ w ࠓ͸શ୆ʹ͍ͯ͠Δ w ΞΫηε͕ҰఆྔΛ௒͑Δͱ/HJOYͷΞΫηεϩάΛૹΔqVFOUEͱϩάΛॻ͖ࠐΉDJSDVT ͕$16Λ͔ͳΓᷰ͏Α͏ʹͳΔͷͰ(Pͷϓϩηεʹ$16Λ࢖ΘͤΔඞཁ͸ݱঢ়ͳ͍ w QQSPGΛݟΕΔΑ͏ʹͯ֬͠ೝ w LTLMPHͷॻ͖ࠐΈ͕௚ྻʹ͔࣮͠ߦͰ͖ͳ͍͜ͱ͕ݪҼͱߟ͑ΒΕ͍ͯΔ w ݱঢ়େ͖ͳ໰୊͕ൃੜͯ͠ͳ͍ͷͰ༷ࢠݟঢ়ଶ w άϥϑͰҧ࿨ײΛײͨ͡ΒઈରʹԿ͔͋ΔͷͰೲಘͷ͍͘·Ͱௐ΂Δ

Slide 66

Slide 66 text

No content

Slide 67

Slide 67 text

αʔόʔҠߦʹ͍ͭͯ

Slide 68

Slide 68 text

αʔόʔҠߦͷཧ༝ͱखॱ w αʔόʔͷ෺ཧతͳ഑ஔͷؔ܎Ͱ؅ཧαʔόʔͱ഑৴αʔόʔͱόοναʔόʔΛҠߦ͢Δඞཁ͕ग़ͨ w ΦϯϓϨͳΒͰ͸ʁ w ͦ΋ͦ΋ҠߦͰ͖Δߏ੒ʹ͢Δͱ͜Ζ͔Β։࢝ w Ҡߦ͢ΔՄೳੑΛߟྀ͍ͯ͠ͳ͔ͬͨ w .Z42-αʔόʔʹԾ૝*1ΛৼΔʢ෺ཧ*1ܦ༝ͩͬͨʣ w NBTUFSTMBWFߏ੒ͷ୆ߏ੒ʹ w ؅ཧαʔόʔ"1ͷ"1*Λ%/4ܦ༝Ͱୟ͘Α͏ʹʢ෺ཧ*1Λࢦఆ͍ͯͨ͠ʣ w Ծ૝*1͸ಛఆͷ໾ׂͷͨΊʹ෇͚Δ*1ΞυϨε w ෺ཧ*1͸Ծ૝*1ͱͷൺֱͷͨΊͷศٓతͳݺͼํͰαʔόʔͷ৔ॴ΍ηοτΞοϓॱͳͲͰ෇ ͚ΒΕΔαʔόʔݻ༗ͷ*1 w ഑৴αʔόʔ͸άϩʔόϧ*1Λ࣋ͭͷͰάϩʔόϧ*1Λ৐ͬऔΔඞཁ͕͋Δ

Slide 69

Slide 69 text

.Z42-αʔόʔҠߦ

Slide 70

Slide 70 text

.Z42-ͷNBTUFSTMBWF w .Z42-ͷNBTUFSαʔόʔʹॻ͖ࠐΉͱ֤TMBWFͰಉ༷ͷߋ৽Λߦ͏ w ϨϓϦέʔγϣϯͱݺͿ w QJYJWͰ͸ߋ৽ͷΈΛNBTUFSͰߦ͍ࢀরΛTMBWFͰߦ͏͜ͱͰෛՙ෼ࢄΛ͍ͯ͠Δ w ࠓճ͸ෛՙ෼ࢄ͕໨తͰ͸ͳ͍ͷͱ3BJMTͰ͸೉͍͠ͷͰͲͪΒ΋NBTUFSʹ w NBTUFS͕ࢮΜͩ࣌͸TMBWFͷͲΕ͔ΛNBTUFSঢ֨͢Δ͜ͱͰμ΢ϯλΠϜΛ࠷খʹ͢Δ͜ ͱ͕ग़དྷΔ NBTUFS TMBWF ϨϓϦέʔγϣϯ ߋ৽

Slide 71

Slide 71 text

.Z42-αʔόʔҠߦ w .Z42-αʔόʔͷ෺ཧ*1Λશ഑৴αʔόʔʹઃఆ͍ͯͨ͠ w Ծ૝*1Λ෇༩ͯ͠શͯͷߋ৽ɾࢀরΛԾ૝*1ܦ༝Ͱߦ͏Α͏ʹ w .BTUFS4MBWFߏ੒ʹ w ݩʑ͸όοΫΞοϓ༻ͷTMBWF͔͍͠ͳ͔ͬͨ w Ҡߦޙ΋ݱࡏͰ͸୆ߏ੒Ͱ৑௕Խ w ޿ࠂαʔόʔͷߏ੒తʹ.Z42-͸Ұ࣌తʹఀࢭͯ͠΋޿ࠂ഑৴͸ࢭ·ΒͣϩάूܭͳͲ΋Ұ࣌తʹ ஗Ԇ͢Δ͚ͩ w NBTUFSαʔόʔΛ3&"%-0$, w τϥϯβΫγϣϯ͕ࣦഊͨ͠ΒϦτϥΠ͞ΕΔ w TMBWFαʔόʔΛNBTUFSʹঢ֨͢ΔͨΊԾ૝*1Λ৐ͬऔΔ w ഑ԼͷTMBWFͰDIBOHFNBTUFS΋࣮ࢪͯ͠NBTUFSঢ֨

Slide 72

Slide 72 text

഑৴αʔόʔҠߦͱࣄނ

Slide 73

Slide 73 text

"31ɾ."$ΞυϨεɾ*1 w ωοτϫʔΫͰ͸."$ΞυϨεͱ*1ΞυϨεͷͭͷΞυϨε͕͋Δ w ."$ΞυϨε͸/*$ʹম͖෇͍͍ͯΔ෺ཧతͳΞυϨε w *1ΞυϨε͸04ଆͰઃఆ͢Δ࿦ཧతͳΞυϨε w "31 "EESFTT3FTPMVUJPO1SPUPDPM ʹΑͬͯ*1ΞυϨεΛ."$ΞυϨεʹม׵Ͱ͖Δ w "313FRVFTUΛಉ͡ωοτϫʔΫ಺ͷશαʔόʔʹૹΔʢϒϩʔυΩϟετʣ w ʰ͜ͷ*1Λ͍࣋ͬͯΔਓ͸ͲΕͰ͔͢ʔʱͱ͍͏ײ͡ w ͦͷ*1Λ͍࣋ͬͯΔαʔόʔ͕"313FQMZΛͯͦ͠ΕҎ֎ͷαʔόʔ͸ഁغ w *1ΞυϨεΛม׵͢Δ౓ʹϒϩʔυΩϟετ͍ͯ͠ΔͱτϥϑΟοΫ͕͍͢͜͝ͱʹ w "31ςʔϒϧͱ͍͏."$㱻*1ม׵දΛΩϟογϡͰ͓࣋ͬͯ͘ w 8JOEPXT͸෼Ͱ$JTDPػث͸࣌ؒΩϟογϡ͢Δ w TFOE@BSQίϚϯυͰ্ॻ͖͕Մೳ

Slide 74

Slide 74 text

഑৴αʔόʔҠߦͰͷࣄނ چ ৽ " # *1ΞυϨε"Λ৐ͬऔΔલʹ FUDOFUXPSLJOUFSGBDFTͰ *1ΞυϨε#Λ෇͚ͯಈ࡞֬ೝ JQBEESBEEͱTFOE@BSQ Ͱ*1ΞυϨε"Λ৐ͬऔΓ چ ৽ # " 48 TFOE@BSQ ৽ # " º JQBEESEFMͰෆཁͳ#Λ མͱͨͭ͠΋Γ͕৐ͬऔͬͨ"΋ফ͑ͨ º ৽ " JQBEESBEEͰ"Λ ෇͚͕ͨ௨৴͕෮׆͠ͳ͍ ௨৴ෆՄ

Slide 75

Slide 75 text

഑৴αʔόʔͷࣄނղઆ w ςετ༻ͷ*1ΞυϨεΛ෇͚͔ͯΒຊ൪༻ͷ*1Λ෇͚ͨͨΊʹςετ༻͕QSJNBSZͰຊ൪༻ͷ*1͕ TFDPOEBSZʹͳͬͨ w /*$ͷQSJNBSZͷ*1Λফ͢ͱTFDPOEBSZ΋Ζͱ΋མͪΔ w ֘౰/*$ʹ෇͚ΒΕΔωοτϫʔΫ಺ͷ*1͕શͯམͪͨͷͰ֘౰ωοτϫʔΫͷϧʔςΟϯά͕ফࣦ w JQBEESBEEͯ͠෮چͰ͖ͳ͔ͬͨݪҼ w JQSPVUFBEEͯ͠෮چ w %/4ϥ΢ϯυϩϏϯͰϢʔβʔ͕഑৴αʔόʔΛબͿͨΊʹͦ͜·Ͱେ͖ͳඃ֐ʹ͸ͳΒͳ͔ͬͨΑ͏ w μ΢ϯλΠϜࣗମ͸෼΋ͳ͔ͬͨ͸ͣ w ςετ༻ͷ*1Λ෇͚ͯ໰୊͕ͳ͚Ε͹ɼςετ༻ͷ*1Λফͯ͠JQBEEͱJQSPVUFBEEΛͯ͠໨తͷ*1Λ෇ ͚Δͷ͕ྑͦ͞͏ w ͦͷޙ͜ͷํ๏Ͱ΍ͬͯ໰୊͸ग़ͳ͔ͬͨ w ࣄނ͕ىͬͨ͜ͱ͖͔ͦ֬͜ͳ஌͕ࣝੜ͖Δ

Slide 76

Slide 76 text

ࢀߟURL • ZendOpcacheͱAPCuͰ͸͡ΊΔϋΠύϑΥʔϚϯεPHP - pixiv engineering blog • http://inside.pixiv.net/entry/2014/02/27/002433 • [Fluentd Advent Calendar]޿ࠂ഑৴ʹFluentdΛ࢖͍ͬͯ·͢ͱ͍͏࿩ @katzchang.gist • https://gist.github.com/katzchang/7925728 • Go Ͱॻ͍ͨαʔόʔΛ؅ཧ͢Δʹ͸ circus ͕ศར - methaneͷϒϩά • http://methane.hatenablog.jp/entry/2013/11/11/Go_Ͱॻ͍ͨαʔόʔΛ؅ཧ͢Δʹ͸ _circus_͕ศར • Server::Starter͔ΒֶͿhot deployͷ࢓૊Έ - $shibayu36->blog; • http://shibayu36.hatenablog.com/entry/2012/05/07/201556 • Frequently Asked Questions — Circus 0.12.0 documentation • http://circus.readthedocs.org/en/latest/faq/

Slide 77

Slide 77 text

ࢀߟURL • pixivͷ։ൃɾσϓϩΠ؀ڥͷมભʢ2014೥य़൛ʣ - pixiv engineering blog • http://inside.pixiv.net/entry/2014/03/26/100539 • pixivͷσϓϩΠΛࢧ͑Δpploy - pixiv engineering blog • http://inside.pixiv.net/entry/2014/12/25/102410 • memcached͔ΒKyotoTycoon΁ • http://www.slideshare.net/cubicdaiya/memcached2kyototycoonkey • ׽(Φτί)ͷίϯϐϡʔλಓ: ύʔςΟγϣχϯάͷ࢖༻ྫ • http://nippondanji.blogspot.jp/2009/04/http-session.html • strace ίϚϯυͷ࢖͍ํΛ·ͱΊͯΈͨ - sonots:blog • http://blog.livedoor.jp/sonots/archives/18193659.html

Slide 78

Slide 78 text

ݸਓత͓͢͢Ίຊʢશһʣ • ମܥతʹֶͿ҆શͳ Web ΞϓϦέʔγϣϯͷ࡞Γํʢಙؙຊʣ • ಡ·ͣʹ Web ΞϓϦ։ൃෆՄೳ • Ϧʔμϒϧίʔυ • ಡΈ΍͍͢ίʔυͷॻ͖ํͳͲ • ϋΠύϑΥʔϚϯε Web αΠτ • ߴ଎ʹWebαΠτΛදࣔ͢Δํ๏͕جຊ͔Βॻ͍ͯ͋Δ • HTTP2ͷલͰ͸ແྗ͕ͩ·ͩ໾ʹཱͭ • SQLΞϯνύλʔϯ • SQLͰ΍ͬͯ͸͍͚ͳ͍΂͔Βͣू • Team Geek • ٕज़ॻͰ͸ͳ͍͕άϧʔϓ։ൃʹ͓͚Δ৺ߏ͑ͳͲ

Slide 79

Slide 79 text

ࠓճͷࢀߟจݙ ʢ͞Βʹ஌Γ͍ͨਓ޲͚ʣ • αʔό/ΠϯϑϥΛࢧ͑Δٕज़ • গ͠ݹ͍͕ࠓճͷ࿩ʹڵຯ͕͋Ε͹ • ͳΔ΄ͲUnixϓϩηε - RubyͰֶͿUnixͷجૅ • preforkͳͲϓϩηεʹ͍ͭͯ • Πϯϑϥ/ωοτϫʔΫΤϯδχΞͷͨΊͷωοτϫʔΫٕज़ˍઃܭೖ໳ • Πϯϑϥͷ࢓ࣄ಺༰͕஌Γ͍ͨਓʹ • ωοτϫʔΫपΓ΋ॻ͍ͯ͋Δ • ࣮ફDNS DNSSEC࣌୅ͷDNSͷઃఆͱӡ༻ • DNSʹ͍ͭͯ