Share
Embed
ピクシブ広告サーバー開発・運用の軌跡 2015春インターン講義資料
2015春インターン講義資料
これの続編です
ピクシブ新広告サーバー構築物語 // Speaker Deck https://speakerdeck.com/catatsuy/pikusibuxin-guang-gao-sabagou-zhu-wu-yu
Kaneko Tatsuya
March 04, 2015
Transcript
79 slides
-
ॾҙ • ՆΠϯλʔϯͷߨٛͱ༰͕ॏෳʢಛʹલʣ͍ͯ͠·͢ • ՆΠϯλʔϯͷࢿྉΛݟͨਓͲΜͲΜ࣭͍ͯͩ͘͠͞ʂ • εϥΠυͷຕ͕ଟ͍ͷͰ͕Μ͍͖͍ͬͯͯͯͩ͘͞ • ࣭ܴʂ •
Ή͠Ζ࣭͕དྷΔ͜ͱલఏͷࢿྉͰ͢ • جຊతͳ͜ͱͰฉ͚Δػձগͳ͍ͱࢥ͏ͷͰԕྀͤͣ -
ࣗݾհ • catatsuy ͱ͍͏ ID ͰΠϯλʔωοτ্Ͱ׆ಈ • ͔͍ͨͭͬͯݺΕ͍ͯΔ • ౦ژۀେֶֶ෦ใֶՊଔۀ
• 2013/9ʹେֶΛଔۀޙʹϐΫγϒೖࣾ • ΠϯϑϥͰमߦத • ࠂαʔόʔͷΠϯϑϥ୲ʹ • ISUCON4४༏উ -
ࠓ͢͜ͱ • ৽ࠂαʔόʔΛ࡞ͬͨཧ༝ • ϐΫγϒͷΠϯϑϥͷڌ • ϐΫγϒ৽ࠂαʔόʔͷ։ൃͱឯ༨ۂં • ϐΫγϒ৽ࠂ৴αʔόʔΠϯϑϥશମ૾ •
ϐΫγϒ৽ࠂαʔόʔσϓϩΠ • ϐΫγϒ৽ࠂαʔόʔࢹํ๏ • ຊ֨ӡ༻લʹىͬͨ͜ͱରԠ • ຊ֨ӡ༻ޙʹىͬͨ͜ͱରԠ -
ࠂαʔόʔಛ • ཧαʔόʔͱ৴αʔόʔͷ 2 ͕ͭ͋Δ • ཧαʔόʔϚʔένʔϜ͕ࠂΛೖߘ͢Δ • ৴αʔόʔೖߘ͞ΕͨࠂΛ৴ͯ͠ΠϯϓϨογϣϯʢද ࣔʣͱΫϦοΫΛܭଌ͢Δ
• ৴αʔόʔগͳ͍αʔόʔͰpixivͱಉఔͷΞΫηεʹ ͑ͳ͍ͱ͍͚ͳ͍ • ॠ࣌ʹϨεϙϯεΛฦͤͳ͍ͱpixivͷϢʔβʔମݧͷ࣭͕Լ͢ Δ -
چࠂαʔόʔ • Debian6/PHP5.3 ͱࣾͰϨΨγʔڥ • Debian7/PHP5.5 ͕ࣾඪ४ڥ • APC ͱ͍͏ڞ༗ϝϞϦͷػߏΛϑϧ׆༻ͯ͠ߴʹϨεϙϯεΛฦ͢
• APC PHP5.5 Ͱഇࢭ͞Ε͍ͯͯ pixiv Ͱସͷ APCu Λ༻ • ͔͠͠ APCu όΪʔͳͷͰ pixiv Ͱݶఆతʹ༻ • ݱࠂαʔόʔ APC ͷػೳΛ͔ͳΓ͍ͬͯΔͨΊҠߦෆՄೳ • ΠϯϓϨογϣϯͷߋ৽ 1 ͓͖࣌ؒͳͲ͔ͳΓׂΓͬͨઃܭͰߴͳϨεϙϯεΛ࣮ݱ • ΠϯϓϨογϣϯ͕ϦΞϧλΠϜʹ͔Βͳ͍ͱඪΠϯϓʹ౸ୡͤ͞Δͷ͕͍͠ • ࣗಈΠϯϓϨογϣϯௐઅػೳͳ͍ͷͰखಈରԠ • ػೳ֦ு΄΅ෆՄೳ -
ϐΫγϒͷαʔόʔڌ ࣗࣾαʔόʔϧʔϜ ϕχϠ൘αʔόʔ ։ൃ ৽॓%$ QJYJW %#ɾը૾ɾ"1 നՏ%$ ը૾৴ ࠂαʔόʔ
w ্ͷڌʢެ։ใʣ w ͦΕͧΕઐ༻ઢͰܨ͕͍ͬͯΔ w ࠓճͷࠂαʔόʔനՏʹ͋Δ -
ཧαʔόʔ • ϚʔένʔϜ͕ࠂΛೖߘ͢Δͷͱ৴αʔόʔͷܭଌ݁ՌΛอଘͯ͠ݟΕΔΑ ͏ʹ͢Δ • ࣾͷਓ͔ؒ͠৮Βͳ͍ͷͰϦιʔε͋·Γׂ͚ͳ͍͕ɼۀޮʹؔΘΔͷ ͰϚʔένʔϜͷػೳཁʹਝʹରԠ͢Δඞཁ͕͋Δ • ཧαʔόʔ͕ࠂαʔόʔͷ୯ҰোʹͳΒͳ͍Α͏ʹ͢Δඞཁ͕͋Δ •
ཧαʔόʔ͕ࢮΜͰࠂͷ৴Γଓ͚ΔΑ͏ʹ • Ruby on RailsͰগͳ͍ϦιʔεͰAPIΛؚΊͯ࡞͢Δ͜ͱʹ • RailsϑϧελοΫϑϨʔϜϫʔΫͰ࠷খݶͷ࣮Ͱ༷ʑͳػೳ͕͑Δ • JSONܗࣜͷAPIRubyͩͱ࡞Γ͍͢ -
ཧαʔόʔ • σʔλϕʔεMySQLΛ༻ • pixivMySQLͳͷͰେنMySQLӡ༻ͷϊϋ͕͋Δ • ࠂσʔλফ͑Δͱ࠷ѱձ͕ࣾࢮ͵ͷͰ৴པੑͷߴ͍σʔλετΞΛ͍͍ͨ • ࠓ·ͰMySQL͕ݪҼͰσʔλΛফࣦͨ͜͠ͱ͕ແ͍ͷͰ৴པੑߴ͍ •
৴͢ΔࠂσʔλΛJSONͷAPIܦ༝Ͱ৴αʔόʔʹ • ཧαʔόʔ͕Ұ࣌తʹࢮΜͰ৴αʔόʔʹӨڹ͕ग़ͳ͍Α͏ʹ • ৴αʔόʔ͕දࣔɾΫϦοΫͷूܭ݁ՌΛཧαʔόʔͷMySQLʹॻ͖ࠐΉ • MySQLʹτϥϯβΫγϣϯΛͬͯॻ͖ࠐΉ • ࣦഊͨ͠ΒϩʔϧόοΫͯ͠Ұఆ࣌ؒޙʹfluentd͕ϦτϥΠ -
ཧαʔόʔ • Ruby on Rails ࣾͰ࠾༻ྫ͕ଟ͍ͷͰϊϋ͕͋Δ • BOOTH/pixivFACTORY/WorldCosplay/pixivίϛοΫetc • αʔόʔ
Unicorn ͰσϓϩΠ Capistrano • ࣾͰ࠾༻࣮͕͋Δ • Capistrano Ruby ͳͷͰ Ruby पΓͷػೳ͕ॆ࣮͍ͯ͠Δ • Unicorn Rack ΞϓϦέʔγϣϯ͚ͷ prefork ܕαʔόʔ • ΠϯϑϥΤϯδχΞͱͯͨ͠͠ͱ͜Ζಛʹͳ͍ • ͔ࣾΒ͔͠ΞΫηε͕དྷͳ͍ͷͰ Rails ΞϓϦ͕ಈ͔ͤΕे -
Rack/Capistrano/Unicorn • Rack • RubyͷͨΊͷαʔόʔͱWebΞϓϦέʔγϣϯؒͷΓऔΓΛ୲ • Rackʹଇͬͯ࡞ΒΕͨWebΞϓϦέʔγϣϯRack༻ͷαʔόʔͰಈ͔͢͜ͱ͕Մೳ • Rails/SinatraͳͲओཁͳRubyͷWebϑϨʔϜϫʔΫରԠ •
Capistrano • σϓϩΠͳͲࣗಈԽ͍ͨ͠αʔόʔૢ࡞ΛࣗಈԽ͢Δπʔϧ • RubyͳͷͰRubyपΓͷػೳ͕ॆ࣮ • γΣϧεΫϦϓτͩͱԿ͔ΒԿ·ͰࣗͰॻ͔ͳ͍ͱ͍͚ͳ͍ͷͰָͰอकੑߴ͘ͳΔ • Unicorn • ਓؾͷߴ͍Rack༻αʔόʔ -
• ϓϩηε͕ΞϓϦέʔγϣϯΛϩʔυͯ͠ιέοτϑΝΠϧΛ࡞͢Δʢˠ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࡞ ϑΝΠϧ σΟεΫϦϓλ -
৴αʔόʔ • ࠷ٕज़త՝͕େ͖͍ • গͳ͍αʔόʔͰ pixiv ͱ΄΅ಉ͡ΞΫηεΛ͘͞ඞཁ͕͋Δ্ʹߴʹࠂσʔ λΛฦ͢ඞཁ͕͋Δ • ܭଌϛε͋ͬͯͳΒͳ͍ͷͰ৴པੑͷߴ͍γεςϜͰ͋Δඞཁ͕͋Δ
• མͪͨΒͦͷձࣾͷऩӹ͕མͪΔ্ʹ࣌ؒ෮ؼͰ͖ͳ͍ͳΒิరͷඞཁ͕ग़ͯେࣈ • ΠϯϑϥΤϯδχΞͱͯ͠։ൃʹؔΘΔ • ϐΫγϒͰΠϯϑϥͰඞཁʹԠͯ͡։ൃ͢Δ • Πϯϑϥ͔ͩΒίʔυॻ͔ͳ͍Έ͍ͨͳձࣾ͋ΔΒ͍͕͠ɼϐΫγϒͰͦ͏͍͏ ͜ͱͳ͍ • ಛʹύϑΥʔϚϯεपΓϛυϧΣΞͷબͳͲΠϯϑϥ͕ਂؔ͘ΘΔඞཁ͕͋Δ -
%/4 UZQFUBJM ࠂ৴αʔόʔ ཧαʔόʔ .Z42- qVFOUE qVFOUE /(*/9 ը૾ $"$)&
LTLMPH NFNDBDIFE ࠂσʔλ "QQMJDBUJPO (PMBOH දࣔ ΫϦοΫ 6/*9υϝΠϯιέοτ $JSDVT ࠂσʔλ ܭଌ݁Ռ ϥϯυϩϏϯ 6/*9υϝΠϯιέοτ ϑΝΠϧσΟεΫϦϓλ -
৴αʔόʔઃܭ • ܰྔͳ KVS ʹࠂσʔλΛอଘ͓͍ͯͯ͠ϦΫΤετʹԠͯͦ͡ͷσʔλΛฦ͢ΞϓϦέʔ γϣϯ • ը૾σʔλಉ༷ʹ৴͢Δ͕Ωϟογϡ͓͖ͯ͠ը૾ੜ͕ෳճߦΘΕͳ͍Α͏ʹ͢Δ • ը૾σʔλࣗମͷදࣔΛܭଌΛ͢Δ͜ͱͳ͍
• ը૾σʔλΛੜͨ͠Β͕͔͔࣌ؒΓ͗͢Δ • දࣔΫϦοΫ͕͞ΕΕϑΝΠϧʹॻ͖ࠐΉʢksk.logʣ • fluentd Ͱ ksk.log Λࢹͯ͠ܭଌ݁ՌΛཧαʔόʔͷ MySQL ʹॻ͖ࠐΉ • άϩʔόϧIPͰϢʔβʔͷϦΫΤετΛड͚Δ͜ͱͰߴʹϨεϙϯεฦ٫ • DNSϥϯυϩϏϯෳͷάϩʔόϧIP͕ొ͞Ε͍ͯΔͷͰͲΕ͔Λબ -
%/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 -
fluentd • RubyͷϩάऩूιϑτΣΞ • DSLͰॲཧΛॻ͍͍ͯ͘ • ϩάϑΝΠϧΛଞͷαʔόʔʹूͤ͞Δ • ϩάΛղੳͯ݁͠ՌΛͲ͔͜ʹ͛Δ •
ϓϥάΠϯ͕ॆ࣮͍ͯͯ͠ઃఆΛॻ͚ͩ͘Ͱ༷ʑͳػೳ͕ར༻Մೳ • ࣦഊ࣌ʹϦτϥΠͨ͠Γɼॏෳͯ͠ૹΒͳ͍ػೳͳͲ͕͋Δ • pixivͰओʹΞΫηεϩάɾΤϥʔϩάऩूΛͯ͠Ϣʔβʔͷಈ֬ೝ ΤϥʔݕͳͲʹΘΕΔ͜ͱ͕ଟ͍ -
ωοτϫʔΫͷԽ • άϩʔόϧIPͰ௨৴͢ΔͷͰԿ͔͕ނোͯ͠௨৴Ͱ͖ͳ͘ͳΔͱҰԿͰ͖ͳ ͘ͳΔ • έʔϒϧͷஅઢɾNICނোɾεΠονϙʔτނোɾεΠονނো • ͜͏͍ͬͨނোසൟʹى͜Δ • ނোͯ͠େৎͳΑ͏ʹԽ͢Δඞཁ
• ԽͱҰ෦ͷγεςϜোʹඋ͑ͯ༧උஔͳͲΛ༻ҙ͓ͯ͘͜͠ͱ • ෳͷNICΛ༻ҙͯ͠ผͷεΠονʹଓ • ͦΕͧΕͷNICʹಉ͡IPΞυϨεΛ͚ͯยํ͕ނোͨ͠ΒࣗಈͰΓସΘΔ Α͏ͳΈʹ͍ͨ͠ -
Bonding • LinuxΧʔωϧͷϞδϡʔϧͷ1ͭ • ෳͷNICΛ·ͱΊͯ1ͭͷཧNICͱͯ͠ѻ͑ΔΑ͏ʹͳΔ • ϐΫγϒͰجຊతʹނো͢Δ·Ͱ1ͭΊͷཧNICͷΈΛͬͯނো࣌ʹΓସ͑Δ active-backupΛ༻ • ͜Ε͕Ұ൪ѻ͍͍͢Β͍͠
• ݱࡏMII(Media Independent Interface)ࢹΛͬͯཧNICͷLink Downͯ͠ͳ͍͔ࢹ • ίετʹࢹՄೳ • Link Downͯ͠ͳ͍ͷʹ௨৴Ͱ͖ͳ͍ঢ়گͰରԠ͕Ͱ͖ͳ͍ • ARPࢹΛ͢Ε௨৴Ͱ͖ͳ͍ঢ়گͰѲͰ͖Δ͕ߴίετ -
৴αʔόʔϓϩτλΠϓ • ϓϩτλΠϓRubyͷϑϨʔϜϫʔΫPadrinoͰσʔλετΞͱͯ͠GroongaΛ༻ • GroongaશจݕࡧΤϯδϯͱͯ͠։ൃ͞Ε͓ͯΓܰྔͳKVSͱͯ͠͏ʹ͔ͳ͍ • ɾ҆ఆੑɾ৴པੑతʹࠓճͷ৴αʔόʔʹ͔ͳ͍ͱஅ • ܰྔͳKVSͱͯ͠memcachedΛఏҊ •
ొ͞Ε͍ͯΔࠂσʔλେ͕࣮ͩࡍʹͦͷ࣌৴͠ͳ͚Εࠂσʔλগ ͳ͍ • ݩσʔλཧαʔόʔ͕શ͍ͯ࣋ͬͯΔͷͰ৴αʔόʔ্ʹӬଓσʔλΛ࣋ͭ ඞཁͳ͍ • େنͳ Web ΞϓϦέʔγϣϯͰ࠾༻ྫ͕ଟ͘ɼɾ҆ఆੑɾ৴པੑͲΕ ߴ͍ -
Padrino • Sinatraϕʔεͷ Web ΞϓϦέʔγϣϯϑϨʔϜϫʔΫ • SinatraඇৗʹγϯϓϧͳRackϕʔεͷWebΞϓϦέʔγϣϯϑϨʔϜϫʔΫ • جຊతʹDSLͰϧʔςΟϯάͷΈΛߦ͏ •
ͬͨSinatraͱ͍͏ײ͡ • Sinatraͷࣝ΄΅ͦͷ··׆͔ͤΔ • RailsΑΓػೳগͳ͍͕΄ͱΜͲͷ߹ࠔΒͳ͍ͱࢥ͏ • ࠓճαʔόʔʹUnicornΛ༻ • RailsΞϓϦͰࣾͰಋೖ࣮͕͋Δ • ཧαʔόʔͰ͍ͬͯΔ -
memcached • KVSͱͯ͠ͱͯஶ໊Ͱ࠾༻ྫଟ͍ • Key-Value Store • memcachedΩʔόϦϡʔจࣈྻͷΈ • Facebook/GoogleͳͲೖ࣮Εͣ
• ϝϞϦΩϟογϡͳͷͰӬଓσʔλอଘͰ͖ͳ͍ • ऴྃͨ͠Βσʔλফ͑ͯ͠·͏ • อଘͰ͖Δ༰ྔϝϞϦΩϟογϡͳͷͰগͳ͍ • ઃఆʹΑΔ͕ࡌϝϞϦҎ্อଘͰ͖ͳ͍ • ߴ͔ͭ҆ఆ͍ͯ͠ΔͷͰΩϟογϡͱͯ͠Α͘ར༻͞ΕΔ -
RubyʹΑΔ৴αʔόʔ • PadrinoͰKVSͱͯ͠memcachedΛ༻ͯ͠ݕূ • ϓϩϑΝΠϦϯάΛऔΓͳ͕ΒϘτϧωοΫΛͳ͍ͯ͘͘͠ • ϓϩϑΝΠϦϯάʹϑϨʔϜϫʔΫ͔͠ग़ͯ͜ͳ͘ͳ͖ͬͯͨͷͰ Padrino ґଘΛ֎ͯ͠ Sinatra
Ξ ϓϦʹ • ab(Apache Bench)/Apache JMeterΛͬͯੑೳΛνΣοΫ • ͦΕͰඪͷੑೳ͕ग़ͤͣɼUnicornҎ֎ͷαʔόʔͰݕূ • Unicorn͕ͬͱੑೳ͕ߴ͍ͱ͍͏݁Ռʹ • JRubyͰಈ͘Α͏ʹϦϥΠτͯ͠JRuby༻ͷଞͷαʔόʔݕূ • ݁ہUnicornΛ͑ΔੑೳΛग़ͤͣRubyʹΑΔ࣮Λஅ೦ • ࠓճͷࠂ৴αʔόʔͰͷͰҰൠతʹUnicorn͕͍ͱ͍͏Θ͚Ͱͳ͍ -
GolangͰϦϥΠτ • ύϑΥʔϚϯεΛٻΊͯGoݴޠͰͷϦϥΠτ • GoݴޠGoogle͕࡞ͬͨ৽͍͠ϓϩάϥϛϯάݴޠ • LLΑΓCݴޠʹ͍ۙ • ίϯύΠϧܕ •
GoroutinesΛ͏ͱ؆୯ʹϚϧνεϨουʹ • GoroutinesΛͬͯϚϧνεϨουͳαʔόʔΛ࣮ • ୯७ʹϦϥΠτ͚ͩͰ͘ͳΔΘ͚Ͱͳ͔ͬͨ • memcachedΛ͏ͳͲجຊతͳ෦શͯ౿ऻ • αʔόʔͱͯ͠ͷೖ࣌ࣾॳ -
ࢲత PHP vs Ruby vs Go • PHP Apache
্Ͱಈ͘ศརςϯϓϨʔτΤϯδϯΛॻ͘ײ͡ • ศརؔ php.net Ͱݕࡧ͢ΕḿΔ • Ruby ϑϨʔϜϫʔΫΛ௨ͯ͡ Rack ΞϓϦέʔγϣϯΛॻ͘ײ͡ • ϑϨʔϜϫʔΫͷίʔυΛಡΉ͜ͱ͕ଟ͍ • ίʔυΛॻ͘ͱ͖ Rack ΑΓԼͷ͜ͱΛҙࣝ͢Δ͜ͱ͋·Γͳ͍ • Go import ‘net’ ͱ͔͢ΔͱߦͰαʔόʔΛىಈͰ͖ΔͷͰޙΑ͠ͳʹͰ͖Δ • godoc ͕͔Γ͍͢ͷͰͦΕΛಡΉ • جຊతʹඞཁͳॲཧΛશ෦ࣗͰॻ͘ඞཁ͕͋Δ -
NginxͱGoΛܨ͙ • ϢʔβʔͷϦΫΤετΛ Go ͕ड͚ΔͷͰͳ͘ Nginx Ͱड͚͍ͨ • ϢʔβʔͷϦΫΤετΛόοϑΝϦϯάͯ͘͠ΕΔͷͰίωΫγϣϯͷอ࣋ͳͲ໘ͳ͜ ͱΛߟ͑Δඞཁ͕ͳ͘ͳΔ
• GoͰԆͰϨεϙϯεΛฦ͢͜ͱ͚ͩΛߟ͑ΕΑ͍ • ΞΫηεϩάͳͲ͕؆୯ʹͤΔ • ΞΫηε੍ޚͳͲ؆୯ • ΩϟογϡͷػߏͳͲ͕؆୯ʹ͑Δ • ࣾʹϊϋ͕ଟ͋͘Δ • ࠂখ͍͞ύέοτΛΓͱΓ͢ΔͷͰtcpͩͱΦʔόʔϔου͕େ͖͍ • UNIX domain socketܦ༝Ͱܨ͙ඞཁ͕͋Δ -
UNIX domain socket • ϓϩηεؒ௨৴ • ಉҰϚγϯ্ͳΒࢠؔͳͲ͕ແͯ͘௨৴͕Ͱ͖Δ • tcpͳͲΑΓ҆ఆɾߴʹಈ͘ •
memcachedͱͷ௨৴ʹ༻͢Δͱߴ͔ͭ҆ఆతʹಈ࡞ͤ͞Δ͜ͱ͕Ͱ͖Δ • ͪΖΜ༻͍ͯ͠Δ • ϐΫγϒࣾͰগͳ͍ϦιʔεͰେྔͷΞΫηεΛߴʹͨ͘͞ΊʹࢸΔͱ ͜ΖͰ࠾༻͞Ε͍ͯΔ • Go ͷ߹ net.Listen("unix", path) ͷΑ͏ʹ͢ΕΑ͍ -
hot deploy • DNSϥϯυϩϏϯͷͨΊִ͕ࠔ • ࠂαʔόʔAWSͰͳ͍ͷͰELB͑ͳ͍ • pixivपลαʔϏείετ໘͔ΒAWSΛΘͳ͍ • େྔֆഅɾpixivࣣ༦ࡇͳͲظؒݶఆͷͷʹAWSΘΕ͍ͯ
Δ • ݱࡏͷࠂۀքͰAWSΛ͏ͷ͕ଟ͍ͷͰELBΛͬͯhot deployΛ ࣮ݱ͍ͯ͠Δձ͕ࣾଟ͍ • ࠂαʔόʔͳͷͰσϓϩΠ࣌ʹμϯλΠϜ͕ൃੜ͍͚ͯ͠ͳ͍ -
Circus w .P[JMMB͕࡞ͬͨ1ZUIPOͷϓϩηεཧπʔϧ w $JSDVTࣗମ͕ιέοτϑΝΠϧΛ࣋ͬͯɼΞϓϦέʔγϣϯϑΝΠϧσΟεΫϦϓ λΛ-JTUFOͤͯ͞ىಈ͢Δ w σϓϩΠ࣌ʹ৽͍͠ϓϩηε͕ىಈ͔ͯ͠Βݹ͍ϓϩηεΛLJMM͢Δ w μϯλΠϜͳ͠ͰΞϓϦέʔγϣϯΛೖΕସ͑Δ͜ͱ͕Ͱ͖Δ
w ઃఆϑΝΠϧΛॻ͘ͱ͍͍ײ͡ʹىಈͯ͘͠ΕΔ w FYBNQMF͕๛ͳͷͰׂͱॻ͚Δ w (PଆͰϩάඪ४ग़ྗͱඪ४Τϥʔग़ྗʹॻ͚ͩ͘Ͱ$JSDVT͕ϩάϑΝΠϧԽͱϩ άϩʔςʔτΛશͯ୲͏ w (Pଆͷ։ൃίετΛԼ͛Δ w DJSDVTDUMͱ͍͏ίϚϯυπʔϧܦ༝Ͱૢ࡞͢Δ -
CircusϓϧϦΫ • CircusGitHubͰ։ൃ͞Ε͍ͯΔ • Debianͷinit.dεΫϦϓτCircusࣗମͷϩάΛग़ྗ͠ͳ͔ͬͨ • ग़ྗͰ͖ΔΑ͏ʹมߋͯ͠ϓϧϦΫͯ͠ΈΔ • merge͞Εͨ •
ϐΫγϒͰࣾͰ༻͍ͯ͠ΔΦʔϓϯιʔεϓϩμΫτʹύονΛૹΔͷਪ ͞Ε͍ͯΔ • ༗໊ͳϓϩμΫτͰࡉ͔͍෦దͳ͜ͱ͕ଟ͍ • MozillaͷϓϩηεཧπʔϧcircusʹϓϧϦΫͨ͠ - catatsuyͱ http:// catatsuy.hateblo.jp/entry/2014/08/18/215602 -
socket TPDLFU࡞ ϑΝΠϧ σΟεΫϦϓλ socket ϑΝΠϧ σΟεΫϦϓλ ϓϩηεࢹ DJSDVTϓϩηεࢹ͚ͩ ͰϦΫΤετײ͠ͳ͍
BQQϑΝΠϧσΟεΫϦϓλΛ -JTUFO͢ΔαʔόʔͰ͋Δඞཁ͕͋Δ αʔόʔىಈ࣌ αʔόʔىಈޙ circus app circus app GPSLFYFD -
circus socket ϑΝΠϧ σΟεΫϦϓλ app_old GPSLFYFD app_new ϓϩηεࢹ αʔόʔϦϩʔυ αʔόʔϦϩʔυ
BQQ@OFX͕ىಈ͢Δ·Ͱͭ BQQ@OFX͕ىಈͨ͠Β BQQ@PMEΛLJMM͢Δ circus socket ϑΝΠϧ σΟεΫϦϓλ app_old app_new ϓϩηεࢹ LJMM -
w qBHͰίϚϯυϥΠϯΦϓ γϣϯΛͤΔΑ͏ʹ w TZTDBMM(PͰϑϦʔζ͞ ΕΔͷͰ(PҎ߱Θͳ ͍ํ͕ྑͦ͞͏ w OFU-JTUFOFSΛ༻ҙ͢Δͱ ذ͕ͭͰࡁΉ
w खݩͰͷ։ൃΛ͠ʹ͘͘͠ͳ ͍Α͏ʹUDQͰͷαʔόʔىಈ αϙʔτͰ͖Δ -
ΩϟογϡԽ • ΞΫηεͷʹmemcachedʹΞΫηεΛͨ͠Β্͍ʹ CPU ༻্͕ͬͯ͠·ͬͨ • memcachedͷऔಘ݁ՌΛΞϓϦέʔγϣϯଆͰ30ඵؒΩϟογϡ͢Δ͜ͱʹ • ͗͢Δͱࠂσʔλͷө͕ΕΔ •
ΩϟογϡԽۜͷؙͰͳ͍ • ifจδϟϯϓ໋ྩͳͷͰҋӢʹ͏ͱ͘ͳΔ • ܭࢉ݁ՌͷΩϟογϡͳͲذ༧ଌ͕ͨΓʹ͍͘ܗͩͬͨΓ͢Δͱܭࢉͤͨ͞ํ ͕͍ࣄ͕ଟ͍ • ΞϓϦέʔγϣϯͷෳࡶΛ্͛Δ • ΩϟογϡԽଌఆͯ͠ޮՌ͕͋ΔҎ֎༻͠ͳ͍ • ਪଌ͢Δͳ ܭଌͤΑ -
JSONͱMessagePack • memcachedͷόϦϡʔʹJSONΛೖΕͯGoଆͰparse͍͕ͯͨ͠ϓϩϑΝΠϦϯά ͔Βparseʹ͕͔͔͍࣌ؒͬͯΔ͜ͱ͕໌ • JSONͱಉ͡Α͏ʹѻ͍͘͢ߴʹparseͰ͖ΔMessagePackΛ༻͢Δͱߴʹ ಈ࡞ͨ͠ • fluentdͷ෦ͰMessagePackΘΕ͍ͯΔ •
GoJSONपΓͷػೳ͕ॆ࣮͍ͯ͠Δ͚͍ͩ • ͔ͬͨΒϓϩϑΝΠϦϯάΛऔΓϘτϧωοΫΛݟ͚ͭͯରࡦΛߟ͑Δ͖ • Goʹͨ͠Βඞͣ͘ͳΔͱ͍͏͜ͱͳ͍ • ਪଌ͢Δͳ ܭଌͤΑ -
σϓϩΠ • ࣾσϓϩΠπʔϧpploy(OSS)Λ͏ • pixivͷσϓϩΠΛࢧ͑Δpploy - pixiv engineering blog http://inside.pixiv.net/entry/
2014/12/25/102410 • σϓϩΠαʔόʔ্ͰεΫϦϓτΛ࣮ߦग़དྷΔ • γΣϧεΫϦϓτͰPHPͳͲͰΑ͍ʢࠓશ෦γΣϧεΫϦϓτʣ • fluentdHUPγάφϧΛૹΔͱϦϩʔυͰ͖Δ • init.dεΫϦϓτΛࣗલͰ࡞ • GoϥΠϒϥϦʹґଘ͠ͳ͍࣮ߦόΠφϦΛίϯύΠϧͰੜ • σϓϩΠαʔόʔͰίϯύΠϧ֤ͯ͠αʔόʔόΠφϦΛ -
git clone go build rsync circusctl reload && fluentd reload
deploy server application server -
ϓϩηεࢹ • ΞϓϦέʔγϣϯCircus • memcached, fluentdmonitΛར༻ • monitpidϑΝΠϧΛ࡞Δinit.dεΫϦϓτ͕͋ΔͳΒ؆୯ʹ ϓϩηεࢹ͕Ͱ͖Δ •
memcachedinit.dεΫϦϓτ͕طʹ͋ͬͨ • fluentdreload࣌ʹHUPγάφϧΛૹΔͨΊʹinit.dεΫϦ ϓτΛࣗ࡞͍ͯͨ͠ -
ࢮ׆ࢹ • ϐΫγϒNagiosΛ͍ͬͯΔͷͰNagiosͰࢹ • ΞϓϦέʔγϣϯεςʔλείʔυ200൪Λฦ͚ͩ͢ͷϧʔςΟϯάΛ༻ҙͯ͠ࢹ • fluentdmonitor_agentΛͬͯࢹ • Nginxstub_statusΛͬͯࢹ •
Circuscircusctl statusͷ݁Ռ͔Βࢹ • memcachedtcp͕ૄ௨͍ͯ͠Δ͔Ͳ͏͔Λࢹ • memcachedύονΛͯΔͱTCPιέοτͱUNIXυϝΠϯιέοτΛಉ࣌ʹ listenͰ͖Δ -
৴தͷࠂσʔλ͕৽͍͠ ࠂΛೖߘ్ͨ͠ʹফ͑ͨ • telnet localhost 11211Ͱ11211ϙʔτͰىಈ͍ͯ͠ΔmemcachedͱձͰ͖Δ • statsͰىಈதͷmemcachedͷঢ়ଶΛ֬ೝͰ͖Δ • evictions͕େྔൃੜ
• ༰ྔෆͰmemcached͕͍ग़ͨ͠ճ • limit_maxbytes͕ఆΑΓ͔ͳΓখ͍͞ • ࠷େ༰ྔ͕খ͍͞ͷͰ͍ग़͞Ε͍ͯͨ • ઃఆͷ༩͑ํΛؒҧ͍͑ͯͨ • ઃఆΛมߋͨ͠Βө͞Ε͍ͯΔ͔֬ೝ͢Δ͜ͱ w ΦϯϝϞϦܕͷϛυϧΣΞϝϞϦ༻Λࢹ͖͢ -
/(*/9 ը૾ $"$)& ը૾͍ͩ͘͞ʂ ը૾͋͛Δ͚Ͳ Ωϟογϡͯ͠Ͷ application ը૾͕ͳ͍ͷͰ ը૾͍ͩ͘͞ ը૾ૹΓ·͢
/(*/9 ը૾ $"$)& ͜ͷը૾ͷΩϟογϡΛ ࣋ͬͯΔ͚Ͳߋ৽͋Δʁ ߋ৽ͳ͍͔Β ͦͷ··ͬͯʂ application Ұը૾ΛૹͬͨΒ ͠Β͘Ωϟογϡ͞ΕΔ ͷͰϦΫΤετ͞Εͳ͍ ճ ճ ͱͳΔ͕ͣແ༻Ͱ ը૾ΛૹΓ͚͍ͭͯͨʜ ࠷ॳͷճ͚ͩͰͦͷޙ ը૾Ωϟογϡ͕ฦ͢ͷͰ ϦΫΤετ͞Εͳ͍ -
NginxͰ৴͍ͯ͠Δࠂͷը૾ΛϢʔβʔ ͷϒϥβ͕Ωϟογϡͯ͘͠Εͳ͍ • ϒϥβʹΩϟογϡͯ͠ཉ͍͠ͳΒHTTPͷϨεϙϯεϔομʔʹLast-Modified/ Expires/Cache-ControlΛ͚Δ • ϒϥβಉ͡URLͷϦΫΤετͷϔομʔʹIf-Modified-SinceΛ͚ͯϒϥβ ͕औಘͨ࣌͠ΛΒͤͯ͘ΕΔ • If-Modified-SinceΑΓޙʹߋ৽͞Ε͍ͯΕ৽͍͠σʔλΛɼߋ৽͕ͳ͚Εεςʔ
λείʔυ304(Not Modified)Λฦͯ͠ΩϟογϡΛͦͷ··ͬͯΒ͏ • ࠓճͷࠂαʔόʔͰը૾͕มΘΕURL͕มΘΔͨΊը૾σʔλʹߋ৽͕ೖΔ͜ ͱͳ͍ • ͦͦը૾NginxଆͰΩϟογϡ͞Εͯ͠·͏ͷͰΞϓϦέʔγϣϯͷϨεϙϯ ε༰͕มΘ͍ͬͯͯNginxؾ͔ͳ͍ -
Nginx͕ϑΝΠϧͷߋ৽༗ແΛͲ͏அ͢Δͷ͔ • If-Modified-SinceΛݟͯ200͔304͔Λஅ͢ΔͷͰNginx͕ը૾σʔλͷλΠϜελϯϓΛѲͯ͠ ͍ͳ͍ͱμϝͰʁ • Goͷαʔόʔ͕ฦ͢ͳΒλΠϜελϯϓͰͳ͘Last-ModifiedϔομʔͰஅ͍ͯ͠Δʁ • memcachedʹࠂσʔλ͕͍ͭೖߘ͞Εͨͷ͔ͷใΛೖΕͯͳ͔ͬͨͷͰ1970/1/2ʹ • ͋·Γྑ͘ͳ͍͕ը૾σʔλ͕มΘΕURL͕มΘΔͷͰ࣮༻্ͳ͍
• ͜ͷͨΊʹmemcachedʹ֨ೲ͢ΔσʔλΛ૿͢ͷखؒΛߟ͑Δͱׂʹ߹Θͳ͍ • epoch Time 0ͷ1970/1/1ͩͱόάͩͱࢥΘΕΔՄೳੑ͕͋ΔͷͰආ͚ͨ • NginxͷΩϟογϡ͕ݹ͍··ͰҰ෦ͷը૾ͰΩϟογϡ͞Εͣ • ΩϟογϡΛআͨ͠Βશը૾Ͱఆ௨Γͷಈ͖ʹ • যΒͣʹҰͭҰͭ֬ೝͯ͠ঢ়گΛѲ͠ͳ͕Β༷ΛௐΔ͜ͱ -
GoͷΤϥʔϩάʹϢʔβʔͷ IPΞυϨεΛද͍ࣔͨ͠ • ߈ܸ͞Ε͍ͯΔՄೳੑ͕͋ΔͷͰΤϥʔΛى͍ͯ͜͠ΔϢʔβʔͷIPΞυϨεΛΓ͍ͨ • ϑϩϯτ͕NginxͰproxyͯ͠Goଆʹ͢ • ϢʔβʔͷϦΫΤετ͕ͦͷ··ΔΘ͚Ͱͳ͍ • ૹ৴ݩIPΞυϨεϢʔβʔͰͳ͘Nginx͕ಈ͍͍ͯΔαʔόʔ
• proxy_set_headerͰϢʔβʔͷIPΞυϨεΛผͷϔομʔʹ͚Δ • X-Real-IPX-Forwarded-Forʹ͚Δ • GoଆͰϔομʔΛ͏·͘ಡΊͳ͍ • Goͷίʔυʹ͕͋Δͷ͔Nginxͷઃఆʹ͕͋Δͷ͔Γ͚͕Ͱ͖ͳ͍ • tcpͳΒtcpdumpΛ͢ΕϦΫΤετͷύέοτ͕ݟ͑ΔͷͰΓ͚͕Ͱ͖Δ͕NginxͱGoͷ௨ ৴ʹ͍ͬͯΔUNIXυϝΠϯιέοτ؆୯ʹݟΕͳ͍ -
straceͰγεςϜίʔϧΛݟΔ • UNIXυϝΠϯιέοτͰΓऔΓ͢ΔͳΒγεςϜίʔϧͷwriteΔ • γεςϜίʔϧ͕ΔͳΒstraceΛ͑ݟΕΔ • straceͰྲྀΕͳ͍… • ϢʔβʔͷϦΫΤετΛड͚͍ͯΔͷGoroutineͰεϨουͰಈ͍͍ͯΔ •
straceͷ-fΦϓγϣϯΛ͏ͱεϨουτϨʔεͯ͘͠ΕΔ • -sΦϓγϣϯͰ͍ϦΫΤετͰશ෦ݟΕΔΑ͏ʹͳΔ w ͕ىͬͨ͜Β·ͣݪҼΛΓ͚Δ • nginx - UNIXυϝΠϯιέοτ௨৴ͷ༰Λݟ͍ͨ - Qiita http://qiita.com/catatsuy/items/ e514e8bd45270106b17e -
͏Θͬ…ࢲͷϖʔδΩϟογϡ૿͑͗͢…ʁ • ࠓճͷࠂαʔόʔେྔͷϩάΛग़ྗ͢Δ • ༻͍ͯ͠ͳ͍ϩάϖʔδΩϟογϡʹࡌ͍ͬͯΔͷͰ༻͠ͳ͍ϩάϑΝ ΠϧcronͰఆظతʹϖʔδΩϟογϡ͔Βআ͢Δඞཁ͋Γ • cpanϞδϡʔϧͷSys::PageCacheͰআͰ͖Δ • ͜ΕͰϖʔδΩϟογϡΛ͍͕͑ͯͨͣmuninͷάϥϑΛݟΔͱ͋Δ࣌
͔Βಥવ૿͍͑ͯΔ • ϖʔδΩϟογϡ͕૿͑͗͢Δͱswapͯ҆͠ఆՔಇʹ͕ग़ΔՄೳੑ͕ߴ ͘ରԠ͕ඞཁ • ͲͷϩάϑΝΠϧ͕ϖʔδΩϟογϡΛ͍ᷰͬͯΔͷ͔͔Βͳ͍ -
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 άϥϑͰҧײΛײͨ͡ΒઈରʹԿ͔͋ΔͷͰೲಘͷ͍͘·Ͱௐ Δ ϖʔδΩϟογϡΛᷰ͏ϩάΛݟ͚ͭΔ -
ϩάղੳ༻ͷfluentdͱͷ֨ಆ • ࠓճΞϓϦέʔγϣϯʹfluentdΛ͍ͬͯΔ͕ϐΫγϒࣾతʹϩάղੳ༻్ʹΘΕΔ • ΞϓϦέʔγϣϯͷΤϥʔϩάΛૹΔΈ • Ϣʔβʔղੳ༻ʹΞΫηεϩάΛऩू͢ΔΈ • ࠂ৴αʔόʔʹҟৗ͕ͳ͍͔Nginxͷϩά͔Βࢹ͍ͨ͠ •
εςʔλείʔυ400൪͕ಥવ૿͑ͨͳͲ • ϨεϙϯελΠϜʹҟৗ͕ͳ͍͔ࢹ͍ͨ͠ • ͜͜Ͱҟৗʹ͕མ͍ͪͯΔͳͲ • ֤৴αʔόʔͷNginxͷϩάΛղੳͯ͠άϥϑԽ • άϥϑԽʹσʔλΛPOST͚ͨͩ͠Ͱάϥϑʹͯ͘͠ΕΔGrowthForecastͰ -
fluentdͰϩάΛղੳ͢Δ • in_tailϓϥάΠϯΛ༻͢ΔͱϩάϑΝΠϧΛtailͰ͖Δ • ਖ਼نදݱͳͲͰϩάϑΝΠϧΛղੳͤͯ݁͞ՌΛGrowthForecastʹPOST • શϩάΛਖ਼نදݱͰղੳ͍ͯ͠ΔͷͰCPUύϫʔΛ͏ • ࠂ৴αʔόʔϢʔβʔͷϦΫΤετΛड͚ΔͨΊCPUύϫʔΛ͍ͨ͘ͳ͍ •
ϢʔβʔͷϦΫΤετΛड͚͍ͯͳ͍ผαʔόʔʹϩάΛૹͬͯͦ͜Ͱղੳ͍ͨ͠ • ͦͷࡍʹͲ͜ͷαʔόʔͷϩά͔͔ΔΑ͏ʹ͍ͨ͠ • ϗετؚ໊Ίͯૹͬͯ͏·͘ϩάͰղੳ͢Δඞཁ͕͋Δ • ଓ͖WebͰ • fluentdͰϗετ໊͖ͰϩάΛड͚औͬͯղੳͯ͠άϥϑʹ͍ͨ͠ - Qiita http://qiita.com/ catatsuy/items/6755a796423067a77acd -
.Z42-ͷ༰ྔരൃ w ৴αʔόʔ͕ॻ͖ࠐΉϨίʔυΛͦͷ··શ෦͍ͯͨ͠Βσʔλྔ͕ͷ͍͍͢͝ Ͱ૿͑ͨ w ඞཁͳͷόονॲཧͰੜ͞ΕΔϨϙʔτͷσʔλͳͷͰϨϙʔτ͕࡞͞Ε͍ͯΕ ෆཁͷσʔλ w ύʔςΟγϣχϯάͰఆظతʹআ͍ͨ͠ w
.Z42-ͷύʔςΟγϣχϯάͰϓϥΠϚϦʔΩʔʹύʔςΟγϣχϯά͍ͨ͠Χϥ Ϝؚ͕·Ε͍ͯΔඞཁ͕͋Δ w NJHSBUJPOͰ"-5&35"#-&ͯ͠"3Ͱ໌ࣔతʹQSJNBSZ@LFZΛJEʹ͢Δ w ύʔςΟγϣχϯάࣗମຖ࡞ͬͯফ͢Λ܁Γฦ͢ͷͰNJHSBUJPO࡞Βͣʹ୯७ͳ όονͰ࣮ߦ͢ΔΑ͏ʹ w "-5&35"#-&ͱ࠷ॳͷύʔςΟγϣχϯάΛ࡞Δ࡞ۀ͕͔͔࣌ؒΔͷͰࣄલʹ༰ྔΛ ༧ଌͯ͠ύʔςΟγϣχϯά͕ඞཁͳͷΛચ͍ग़͓ͯ͘͠ -
w ϨίʔυΛظؒͳͲͰׂ͢Δ͜ͱͰࢀর͠ͳ͚ΕͳΒͳ͍ϨίʔυͷྔΛݮΒ͢ w શظؒΛݟΔඞཁ͕͋ΔΫΤϦͳΒΉ͠Ζ͘ͳΔ w ΦϓςΟϚΠβ͕ͲͷύʔςΟγϣϯΛݟΕ͍͍͔அ͢ΔͷͰͦͷ࣌ͰҰ෦ͷύʔςΟγϣ ϯͷΈͷࢀরʹͰ͖Εߴʹ w ಛఆͷύʔςΟγϣϯΛߴʹআͰ͖Δ w
ΠϯσοΫε͕షͬͯ͋ͬͯআ௨ৗ͍͕ύʔςΟγϣϯͷআҰॠ w ΠϯσοΫεͷ౷ܭใ͕յΕͨΓɼϑϥάϝϯςʔγϣϯ͕ൃੜ͢Δ͜ͱͳ͍ Ϩίʔυ Ϩίʔυ Ϩίʔυ Ϩίʔυ ύʔςΟγϣχϯάղઆ -
ϩά͕44%ͷ༰ྔΛṧഭ w LTLMPHΛूܭͯ͠.Z42-ʹॻ͖ࠐΉεΫϦϓτ͕ు͘ϩάΛճMPHSPUBUF͢ΔΑ͏ʹ͍ͯͨ͠ w ৴ྔ͕૿͑ͯճͰڊେ͗ͨ͢ w σΟεΫ༰ྔṧഭ͍ͯͨ͠ w ࣌ؒຖʹMPHSPUBUF͢ΔΑ͏ʹ w
MPHSPUBUFGϑΝΠϧ໊ͰMPHSPUBUFΛ࣮ߦͰ͖Δ w /HJOYͷϩάΛগ͠Ίʹ͢Α͏ʹ w Ͱ44%ͷ༰ྔΛṧഭˠҰେࣄʹͳΔͱ͜ΖΛةػҰͰରԠʜ w qVFOUEͰϩάΛૹ͍ͬͯΔͷͰૹΓઌʹอଘ͢ΔΑ͏ʹ w ࠂαʔόʔΞϓϦέʔγϣϯͷಛੑ্େྔͷϩάΛు͘ͷͰMPHSPUBUFͷλΠϛϯά͢ϩά ͷྔΛߟ͑ͳ͍ͱࢮ͍ۙ w ϩάΛΔͱҰॠͰࢮʹࢸΔͷͰϩάͷྔͱ44%ͷۭ͖༰ྔʹҙ͢Δ͜ͱ -
(Pͷϓϩηε͕ίΞ͔͠Θͳ͍ w NVOJOͷάϥϑ͕಄ΛଧͬͨΑ͏ʹͳΔ w (0."9130$4Λม͑ͯμϝ w ͣͬͱʹ͍ͯͨ͠ͷΛʹ͕ͨ͠େ͖ͳҧ͍ݟΒΕͣ w ࠓશʹ͍ͯ͠Δ w
ΞΫηε͕ҰఆྔΛ͑Δͱ/HJOYͷΞΫηεϩάΛૹΔqVFOUEͱϩάΛॻ͖ࠐΉDJSDVT ͕$16Λ͔ͳΓᷰ͏Α͏ʹͳΔͷͰ(Pͷϓϩηεʹ$16ΛΘͤΔඞཁݱঢ়ͳ͍ w QQSPGΛݟΕΔΑ͏ʹͯ֬͠ೝ w LTLMPHͷॻ͖ࠐΈ͕ྻʹ͔࣮͠ߦͰ͖ͳ͍͜ͱ͕ݪҼͱߟ͑ΒΕ͍ͯΔ w ݱঢ়େ͖ͳ͕ൃੜͯ͠ͳ͍ͷͰ༷ࢠݟঢ়ଶ w άϥϑͰҧײΛײͨ͡ΒઈରʹԿ͔͋ΔͷͰೲಘͷ͍͘·ͰௐΔ -
αʔόʔҠߦͷཧ༝ͱखॱ 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ΛͬऔΔඞཁ͕͋Δ -
.Z42-ͷNBTUFSTMBWF w .Z42-ͷNBTUFSαʔόʔʹॻ͖ࠐΉͱ֤TMBWFͰಉ༷ͷߋ৽Λߦ͏ w ϨϓϦέʔγϣϯͱݺͿ w QJYJWͰߋ৽ͷΈΛNBTUFSͰߦ͍ࢀরΛTMBWFͰߦ͏͜ͱͰෛՙࢄΛ͍ͯ͠Δ w ࠓճෛՙࢄ͕తͰͳ͍ͷͱ3BJMTͰ͍͠ͷͰͲͪΒNBTUFSʹ w
NBTUFS͕ࢮΜͩ࣌TMBWFͷͲΕ͔ΛNBTUFSঢ֨͢Δ͜ͱͰμϯλΠϜΛ࠷খʹ͢Δ͜ ͱ͕ग़དྷΔ NBTUFS TMBWF ϨϓϦέʔγϣϯ ߋ৽ -
.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ঢ֨ -
"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ίϚϯυͰ্ॻ͖͕Մೳ -
৴αʔόʔҠߦͰͷࣄނ چ ৽ " # *1ΞυϨε"ΛͬऔΔલʹ FUDOFUXPSLJOUFSGBDFTͰ *1ΞυϨε#Λ͚ͯಈ࡞֬ೝ JQBEESBEEͱTFOE@BSQ
Ͱ*1ΞυϨε"ΛͬऔΓ چ ৽ # " 48 TFOE@BSQ ৽ # " º JQBEESEFMͰෆཁͳ#Λ མͱͨͭ͠Γ͕ͬऔͬͨ"ফ͑ͨ º ৽ " JQBEESBEEͰ"Λ ͚͕ͨ௨৴͕෮׆͠ͳ͍ ௨৴ෆՄ -
৴αʔόʔͷࣄނղઆ 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 ࣄނ͕ىͬͨ͜ͱ͖͔ͦ֬͜ͳ͕ࣝੜ͖Δ -
ࢀߟ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/ -
ࢀߟ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 -
ݸਓత͓͢͢Ίຊʢશһʣ • ମܥతʹֶͿ҆શͳ Web ΞϓϦέʔγϣϯͷ࡞Γํʢಙؙຊʣ • ಡ·ͣʹ Web ΞϓϦ։ൃෆՄೳ •
Ϧʔμϒϧίʔυ • ಡΈ͍͢ίʔυͷॻ͖ํͳͲ • ϋΠύϑΥʔϚϯε Web αΠτ • ߴʹWebαΠτΛදࣔ͢Δํ๏͕جຊ͔Βॻ͍ͯ͋Δ • HTTP2ͷલͰແྗ͕ͩ·ͩʹཱͭ • SQLΞϯνύλʔϯ • SQLͰ͍͚ͬͯͳ͍͔Βͣू • Team Geek • ٕज़ॻͰͳ͍͕άϧʔϓ։ൃʹ͓͚Δ৺ߏ͑ͳͲ -
ࠓճͷࢀߟจݙ ʢ͞ΒʹΓ͍ͨਓ͚ʣ • αʔό/ΠϯϑϥΛࢧ͑Δٕज़ • গ͠ݹ͍͕ࠓճͷʹڵຯ͕͋Ε • ͳΔ΄ͲUnixϓϩηε - RubyͰֶͿUnixͷجૅ
• preforkͳͲϓϩηεʹ͍ͭͯ • Πϯϑϥ/ωοτϫʔΫΤϯδχΞͷͨΊͷωοτϫʔΫٕज़ˍઃܭೖ • Πϯϑϥͷࣄ༰͕Γ͍ͨਓʹ • ωοτϫʔΫपΓॻ͍ͯ͋Δ • ࣮ફDNS DNSSEC࣌ͷDNSͷઃఆͱӡ༻ • DNSʹ͍ͭͯ