Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ピクシブ広告サーバー開発・運用の軌跡 2015春インターン講義資料

ピクシブ広告サーバー開発・運用の軌跡 2015春インターン講義資料

2015春インターン講義資料

これの続編です

ピクシブ新広告サーバー構築物語 // Speaker Deck https://speakerdeck.com/catatsuy/pikusibuxin-guang-gao-sabagou-zhu-wu-yu

Kaneko Tatsuya

March 04, 2015
Tweet

More Decks by Kaneko Tatsuya

Other Decks in Technology

Transcript

  1. ࣗݾ঺հ • catatsuy ͱ͍͏ ID ͰΠϯλʔωοτ্Ͱ׆ಈ • ͔͍ͨͭͬͯݺ͹Ε͍ͯΔ • ౦ژ޻ۀେֶ޻ֶ෦৘ใ޻ֶՊଔۀ

    • 2013/9ʹେֶΛଔۀޙʹϐΫγϒೖࣾ • ΠϯϑϥͰमߦத • ޿ࠂαʔόʔͷΠϯϑϥ୲౰ʹ • ISUCON4४༏উ
  2. ࠓ೔࿩͢͜ͱ • ৽޿ࠂαʔόʔΛ࡞ͬͨཧ༝ • ϐΫγϒͷΠϯϑϥͷڌ఺ • ϐΫγϒ৽޿ࠂαʔόʔͷ։ൃͱឯ༨ۂં • ϐΫγϒ৽޿ࠂ഑৴αʔόʔΠϯϑϥશମ૾ •

    ϐΫγϒ৽޿ࠂαʔόʔσϓϩΠ • ϐΫγϒ৽޿ࠂαʔόʔ؂ࢹํ๏ • ຊ֨ӡ༻લʹىͬͨ͜໰୊ͱରԠ • ຊ֨ӡ༻ޙʹىͬͨ͜໰୊ͱରԠ
  3. ޿ࠂαʔόʔಛ௃ • ؅ཧαʔόʔͱ഑৴αʔόʔͷ 2 ͕ͭ͋Δ • ؅ཧαʔόʔ͸ϚʔένʔϜ͕޿ࠂΛೖߘ͢Δ • ഑৴αʔόʔ͸ೖߘ͞Εͨ޿ࠂΛ഑৴ͯ͠ΠϯϓϨογϣϯ਺ʢද ࣔ਺ʣͱΫϦοΫ਺Λܭଌ͢Δ

    • ഑৴αʔόʔ͸গͳ͍αʔόʔ୆਺Ͱpixivͱಉఔ౓ͷΞΫηεʹ ଱͑ͳ͍ͱ͍͚ͳ͍ • ॠ࣌ʹϨεϙϯεΛฦͤͳ͍ͱpixivͷϢʔβʔମݧͷ࣭͕௿Լ͢ Δ
  4. چ޿ࠂαʔόʔ • Debian6/PHP5.3 ͱࣾ಺Ͱ͸ϨΨγʔ؀ڥ • Debian7/PHP5.5 ͕ࣾ಺ඪ४؀ڥ • APC ͱ͍͏ڞ༗ϝϞϦͷػߏΛϑϧ׆༻ͯ͠ߴ଎ʹϨεϙϯεΛฦ͢

    • APC ͸ PHP5.5 Ͱഇࢭ͞Ε͍ͯͯ pixiv Ͱ͸୅ସͷ APCu Λ࢖༻ • ͔͠͠ APCu ͸όΪʔͳͷͰ pixiv Ͱ͸ݶఆతʹ࢖༻ • ݱ޿ࠂαʔόʔ͸ APC ͷػೳΛ͔ͳΓ࢖͍ͬͯΔͨΊҠߦෆՄೳ • ΠϯϓϨογϣϯ਺ͷߋ৽͸ 1 ͓͖࣌ؒͳͲ͔ͳΓׂΓ੾ͬͨઃܭͰߴ଎ͳϨεϙϯεΛ࣮ݱ • ΠϯϓϨογϣϯ਺͕ϦΞϧλΠϜʹ෼͔Βͳ͍ͱ໨ඪΠϯϓ਺ʹ౸ୡͤ͞Δͷ͕೉͍͠ • ࣗಈΠϯϓϨογϣϯ਺ௐઅػೳ΋ͳ͍ͷͰखಈରԠ • ػೳ֦ு΋΄΅ෆՄೳ
  5. ϐΫγϒͷαʔόʔڌ఺ ࣗࣾαʔόʔϧʔϜ ϕχϠ൘αʔόʔ ։ൃ ৽॓%$ QJYJW %#ɾը૾ɾ"1 നՏ%$ ը૾഑৴ ޿ࠂαʔόʔ

    w ্ͷڌ఺ʢެ։৘ใʣ w ͦΕͧΕઐ༻ઢͰܨ͕͍ͬͯΔ w ࠓճͷ޿ࠂαʔόʔ͸നՏʹ͋Δ
  6. ؅ཧαʔόʔ • ϚʔένʔϜ͕޿ࠂΛೖߘ͢Δͷͱ഑৴αʔόʔͷܭଌ݁ՌΛอଘͯ͠ݟΕΔΑ ͏ʹ͢Δ • ࣾ಺ͷਓ͔ؒ͠৮Βͳ͍ͷͰϦιʔε͸͋·Γׂ͚ͳ͍͕ɼۀ຿ޮ཰ʹؔΘΔͷ ͰϚʔένʔϜͷػೳཁ๬ʹ͸ਝ଎ʹରԠ͢Δඞཁ͕͋Δ • ؅ཧαʔόʔ͕޿ࠂαʔόʔͷ୯Ұো֐఺ʹͳΒͳ͍Α͏ʹ͢Δඞཁ͕͋Δ •

    ؅ཧαʔόʔ͕ࢮΜͰ΋޿ࠂͷ഑৴͸΍Γଓ͚ΔΑ͏ʹ • Ruby on RailsͰগͳ͍ϦιʔεͰAPIΛؚΊͯ࡞੒͢Δ͜ͱʹ • Rails͸ϑϧελοΫϑϨʔϜϫʔΫͰ࠷খݶͷ࣮૷Ͱ༷ʑͳػೳ͕࢖͑Δ • JSONܗࣜͷAPI΋Rubyͩͱ࡞Γ΍͍͢
  7. ؅ཧαʔόʔ • σʔλϕʔε͸MySQLΛ࢖༻ • pixiv͸MySQLͳͷͰେن໛MySQLӡ༻ͷϊ΢ϋ΢͕͋Δ • ޿ࠂσʔλ͸ফ͑Δͱ࠷ѱձ͕ࣾࢮ͵ͷͰ৴པੑͷߴ͍σʔλετΞΛ࢖͍͍ͨ • ࠓ·ͰMySQL͕ݪҼͰσʔλΛফࣦͨ͜͠ͱ͕ແ͍ͷͰ৴པੑ͸ߴ͍ •

    ഑৴͢Δ޿ࠂσʔλΛJSONͷAPIܦ༝Ͱ഑৴αʔόʔʹ • ؅ཧαʔόʔ͕Ұ࣌తʹࢮΜͰ΋഑৴αʔόʔʹӨڹ͕ग़ͳ͍Α͏ʹ • ഑৴αʔόʔ͕දࣔɾΫϦοΫ਺ͷूܭ݁ՌΛ؅ཧαʔόʔͷMySQLʹ௚઀ॻ͖ࠐΉ • MySQLʹ௚઀τϥϯβΫγϣϯΛ࢖ͬͯॻ͖ࠐΉ • ࣦഊͨ͠ΒϩʔϧόοΫͯ͠Ұఆ࣌ؒޙʹfluentd͕ϦτϥΠ
  8. ؅ཧαʔόʔ • Ruby on Rails ͸ࣾ಺Ͱ΋࠾༻ྫ͕ଟ͍ͷͰϊ΢ϋ΢͕͋Δ • BOOTH/pixivFACTORY/WorldCosplay/pixivίϛοΫetc • αʔόʔ͸

    Unicorn ͰσϓϩΠ͸ Capistrano • ࣾ಺Ͱ΋࠾༻࣮੷͕͋Δ • Capistrano ͸ Ruby ੡ͳͷͰ Ruby पΓͷػೳ͕ॆ࣮͍ͯ͠Δ • Unicorn ͸ Rack ΞϓϦέʔγϣϯ޲͚ͷ prefork ܕαʔόʔ • ΠϯϑϥΤϯδχΞͱͯ͠޻෉ͨ͠ͱ͜Ζ͸ಛʹͳ͍ • ࣾ಺͔Β͔͠ΞΫηε͕དྷͳ͍ͷͰ Rails ΞϓϦ͕ಈ͔ͤΕ͹े෼
  9. Rack/Capistrano/Unicorn • Rack • RubyͷͨΊͷαʔόʔͱWebΞϓϦέʔγϣϯؒͷ΍ΓऔΓΛ୲౰ • Rackʹଇͬͯ࡞ΒΕͨWebΞϓϦέʔγϣϯ͸Rack༻ͷαʔόʔͰಈ͔͢͜ͱ͕Մೳ • Rails/SinatraͳͲओཁͳRubyͷWebϑϨʔϜϫʔΫ͸ରԠ •

    Capistrano • σϓϩΠͳͲࣗಈԽ͍ͨ͠αʔόʔૢ࡞ΛࣗಈԽ͢Δπʔϧ • Ruby੡ͳͷͰRubyपΓͷػೳ͕ॆ࣮ • γΣϧεΫϦϓτͩͱԿ͔ΒԿ·Ͱࣗ෼Ͱॻ͔ͳ͍ͱ͍͚ͳ͍ͷͰָͰอकੑ΋ߴ͘ͳΔ • Unicorn • ਓؾͷߴ͍Rack༻αʔόʔ
  10. • ਌ϓϩηε͕ΞϓϦέʔγϣϯΛϩʔυͯ͠ιέοτϑΝΠϧΛ࡞੒͢Δʢˠ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࡞੒ ϑΝΠϧ σΟεΫϦϓλ
  11. ഑৴αʔόʔ • ࠷΋ٕज़త՝୊͕େ͖͍ • গͳ͍αʔόʔ୆਺Ͱ pixiv ͱ΄΅ಉ͡ΞΫηε਺Λ͞͹͘ඞཁ͕͋Δ্ʹߴ଎ʹ޿ࠂσʔ λΛฦ͢ඞཁ͕͋Δ • ܭଌϛε͸͋ͬͯ͸ͳΒͳ͍ͷͰ৴པੑͷߴ͍γεςϜͰ͋Δඞཁ͕͋Δ

    • མͪͨΒͦͷ෼ձࣾͷऩӹ͕མͪΔ্ʹ௕࣌ؒ෮ؼͰ͖ͳ͍ͳΒิరͷඞཁ͕ग़ͯେ੺ࣈ • ΠϯϑϥΤϯδχΞͱͯ͠։ൃʹ΋ؔΘΔ • ϐΫγϒͰ͸ΠϯϑϥͰ΋ඞཁʹԠͯ͡։ൃ͢Δ • Πϯϑϥ͔ͩΒίʔυ͸ॻ͔ͳ͍Έ͍ͨͳձࣾ΋͋ΔΒ͍͕͠ɼϐΫγϒͰ͸ͦ͏͍͏ ͜ͱ͸ͳ͍ • ಛʹύϑΥʔϚϯεपΓ΍ϛυϧ΢ΣΞͷબ୒ͳͲ͸Πϯϑϥ͕ਂؔ͘ΘΔඞཁ͕͋Δ
  12. %/4 UZQFUBJM ޿ࠂ഑৴αʔόʔ ؅ཧαʔόʔ .Z42- qVFOUE qVFOUE /(*/9 ը૾ $"$)&

    LTLMPH NFNDBDIFE ޿ࠂσʔλ "QQMJDBUJPO (PMBOH දࣔ਺ ΫϦοΫ਺ 6/*9υϝΠϯιέοτ $JSDVT ޿ࠂσʔλ ܭଌ݁Ռ ϥ΢ϯυϩϏϯ 6/*9υϝΠϯιέοτ ϑΝΠϧσΟεΫϦϓλ
  13. ഑৴αʔόʔઃܭ • ܰྔͳ KVS ʹ޿ࠂσʔλΛอଘ͓͍ͯͯ͠ϦΫΤετʹԠͯͦ͡ͷσʔλΛฦ͢ΞϓϦέʔ γϣϯ • ը૾σʔλ΋ಉ༷ʹ഑৴͢Δ͕Ωϟογϡ͓͖ͯ͠ը૾ੜ੒͕ෳ਺ճߦΘΕͳ͍Α͏ʹ͢Δ • ը૾σʔλࣗମͷදࣔ਺ΛܭଌΛ͢Δ͜ͱ͸ͳ͍

    • ը૾σʔλΛ౎౓ੜ੒ͨ͠Β͕͔͔࣌ؒΓ͗͢Δ • දࣔ΍ΫϦοΫ͕͞ΕΕ͹ϑΝΠϧʹॻ͖ࠐΉʢksk.logʣ • fluentd Ͱ ksk.log Λ؂ࢹͯ͠ܭଌ݁ՌΛ؅ཧαʔόʔͷ MySQL ʹॻ͖ࠐΉ • άϩʔόϧIPͰϢʔβʔͷϦΫΤετΛ௚઀ड͚Δ͜ͱͰߴ଎ʹϨεϙϯεฦ٫ • DNSϥ΢ϯυϩϏϯෳ਺ͷάϩʔόϧIP͕ొ࿥͞Ε͍ͯΔͷͰͲΕ͔Λબ୒
  14. %/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 
  15. fluentd • Ruby੡ͷϩάऩूιϑτ΢ΣΞ • DSLͰॲཧΛॻ͍͍ͯ͘ • ϩάϑΝΠϧΛଞͷαʔόʔʹू໿ͤ͞Δ • ϩάΛղੳͯ݁͠ՌΛͲ͔͜ʹ౤͛Δ •

    ϓϥάΠϯ͕ॆ࣮͍ͯͯ͠ઃఆΛॻ͚ͩ͘Ͱ༷ʑͳػೳ͕ར༻Մೳ • ࣦഊ࣌ʹϦτϥΠͨ͠Γɼॏෳͯ͠ૹΒͳ͍ػೳͳͲ͕͋Δ • pixivͰ͸ओʹΞΫηεϩάɾΤϥʔϩάऩूΛͯ͠Ϣʔβʔͷಈ޲֬ೝ΍ Τϥʔݕ஌ͳͲʹ࢖ΘΕΔ͜ͱ͕ଟ͍
  16. ωοτϫʔΫͷ৑௕Խ • άϩʔόϧIPͰ௨৴͢ΔͷͰԿ͔͕ނোͯ͠௨৴Ͱ͖ͳ͘ͳΔͱҰ੾Կ΋Ͱ͖ͳ ͘ͳΔ • έʔϒϧͷஅઢɾNICނোɾεΠονϙʔτނোɾεΠονނো • ͜͏͍ͬͨނো͸සൟʹى͜Δ • ނোͯ͠΋େৎ෉ͳΑ͏ʹ৑௕Խ͢Δඞཁ

    • ৑௕Խͱ͸Ұ෦ͷγεςϜো֐ʹඋ͑ͯ༧උ૷ஔͳͲΛ༻ҙ͓ͯ͘͜͠ͱ • ෳ਺ͷNICΛ༻ҙͯ͠ผͷεΠονʹ઀ଓ • ͦΕͧΕͷNICʹಉ͡IPΞυϨεΛ෇͚ͯยํ͕ނোͨ͠ΒࣗಈͰ੾ΓସΘΔ Α͏ͳ࢓૊Έʹ͍ͨ͠
  17. Bonding • LinuxΧʔωϧͷϞδϡʔϧͷ1ͭ • ෳ਺ͷNICΛ·ͱΊͯ1ͭͷ࿦ཧNICͱͯ͠ѻ͑ΔΑ͏ʹͳΔ • ϐΫγϒͰ͸جຊతʹނো͢Δ·Ͱ1ͭΊͷ෺ཧNICͷΈΛ࢖ͬͯނো࣌ʹ੾Γସ͑Δ active-backupΛ࢖༻ • ͜Ε͕Ұ൪ѻ͍΍͍͢Β͍͠

    • ݱࡏMII(Media Independent Interface)؂ࢹΛ࢖ͬͯ෺ཧNICͷLink Downͯ͠ͳ͍͔؂ࢹ • ௿ίετʹ؂ࢹՄೳ • Link Downͯ͠ͳ͍ͷʹ௨৴Ͱ͖ͳ͍ঢ়گͰରԠ͕Ͱ͖ͳ͍ • ARP؂ࢹΛ͢Ε͹௨৴Ͱ͖ͳ͍ঢ়گͰ΋೺ѲͰ͖Δ͕ߴίετ
  18. ഑৴αʔόʔϓϩτλΠϓ • ϓϩτλΠϓ͸RubyͷϑϨʔϜϫʔΫPadrino੡ͰσʔλετΞͱͯ͠GroongaΛ࢖༻ • Groonga͸શจݕࡧΤϯδϯͱͯ͠։ൃ͞Ε͓ͯΓܰྔͳKVSͱͯ͠࢖͏ʹ͸޲͔ͳ͍ • ଎౓ɾ҆ఆੑɾ৴པੑతʹࠓճͷ഑৴αʔόʔʹ͸޲͔ͳ͍ͱ൑அ • ܰྔͳKVSͱͯ͠memcachedΛఏҊ •

    ొ࿥͞Ε͍ͯΔ޿ࠂσʔλ͸๲େ͕࣮ͩࡍʹͦͷ࣌഑৴͠ͳ͚Ε͹޿ࠂσʔλ͸গ ͳ͍ • ݩσʔλ͸؅ཧαʔόʔ͕શ͍ͯ࣋ͬͯΔͷͰ഑৴αʔόʔ্ʹӬଓσʔλΛ࣋ͭ ඞཁ͸ͳ͍ • େن໛ͳ Web ΞϓϦέʔγϣϯͰ΋࠾༻ྫ͕ଟ͘ɼ଎౓ɾ҆ఆੑɾ৴པੑͲΕ΋ ߴ͍
  19. Padrino • Sinatraϕʔεͷ Web ΞϓϦέʔγϣϯϑϨʔϜϫʔΫ • Sinatra͸ඇৗʹγϯϓϧͳRackϕʔεͷWebΞϓϦέʔγϣϯϑϨʔϜϫʔΫ • جຊతʹDSLͰϧʔςΟϯάͷΈΛߦ͏ •

    ੔ͬͨSinatraͱ͍͏ײ͡ • Sinatraͷ஌ࣝ͸΄΅ͦͷ··׆͔ͤΔ • RailsΑΓ΋ػೳ͸গͳ͍͕΄ͱΜͲͷ৔߹ࠔΒͳ͍ͱࢥ͏ • ࠓճ͸αʔόʔʹUnicornΛ࢖༻ • RailsΞϓϦͰࣾ಺Ͱ΋ಋೖ࣮੷͕͋Δ • ؅ཧαʔόʔͰ΋࢖͍ͬͯΔ
  20. memcached • KVSͱͯ͠ͱͯ΋ஶ໊Ͱ࠾༻ྫ΋ଟ͍ • Key-Value Store • memcached͸Ωʔ΋όϦϡʔ΋จࣈྻͷΈ • Facebook/GoogleͳͲ౤ೖ࣮੷͸਺஌Εͣ

    • ϝϞϦΩϟογϡͳͷͰӬଓσʔλ͸อଘͰ͖ͳ͍ • ऴྃͨ͠Βσʔλ͸ফ͑ͯ͠·͏ • อଘͰ͖Δ༰ྔ͸ϝϞϦΩϟογϡͳͷͰগͳ͍ • ઃఆʹΑΔ͕౥ࡌϝϞϦҎ্͸อଘͰ͖ͳ͍ • ߴ଎͔ͭ҆ఆ͍ͯ͠ΔͷͰΩϟογϡͱͯ͠Α͘ར༻͞ΕΔ
  21. RubyʹΑΔ഑৴αʔόʔ • Padrino੡ͰKVSͱͯ͠memcachedΛ࢖༻ͯ͠ݕূ • ϓϩϑΝΠϦϯάΛऔΓͳ͕ΒϘτϧωοΫΛͳ͍ͯ͘͘͠ • ϓϩϑΝΠϦϯάʹϑϨʔϜϫʔΫ૚͔͠ग़ͯ͜ͳ͘ͳ͖ͬͯͨͷͰ Padrino ґଘΛ֎ͯ͠ Sinatra

    Ξ ϓϦʹ • ab(Apache Bench)/Apache JMeterΛ࢖ͬͯੑೳΛνΣοΫ • ͦΕͰ΋໨ඪͷੑೳ͕ग़ͤͣɼUnicornҎ֎ͷαʔόʔͰݕূ • Unicorn͕΋ͬͱ΋ੑೳ͕ߴ͍ͱ͍͏݁Ռʹ • JRubyͰಈ͘Α͏ʹϦϥΠτͯ͠JRuby༻ͷଞͷαʔόʔ΋ݕূ • ݁ہUnicornΛ௒͑ΔੑೳΛग़ͤͣRubyʹΑΔ࣮૷Λஅ೦ • ࠓճͷ޿ࠂ഑৴αʔόʔͰͷ࿩ͰҰൠతʹUnicorn͕଎͍ͱ͍͏Θ͚Ͱ͸ͳ͍
  22. GolangͰϦϥΠτ • ύϑΥʔϚϯεΛٻΊͯGoݴޠͰͷϦϥΠτ • Goݴޠ͸Google͕࡞ͬͨ৽͍͠ϓϩάϥϛϯάݴޠ • LLΑΓ΋Cݴޠʹ͍ۙ • ίϯύΠϧܕ •

    GoroutinesΛ࢖͏ͱ؆୯ʹϚϧνεϨουʹ • GoroutinesΛ࢖ͬͯϚϧνεϨουͳαʔόʔΛ࣮૷ • ୯७ʹϦϥΠτ͚ͩͰ଎͘ͳΔΘ͚Ͱ͸ͳ͔ͬͨ • memcachedΛ࢖͏఺ͳͲجຊతͳ෦෼͸શͯ౿ऻ • αʔόʔͱͯ͠ͷ౤ೖ͸౰࣌ࣾ಺ॳ
  23. ௒ࢲత PHP vs Ruby vs Go • PHP ͸ Apache

    ্Ͱಈ͘ศརςϯϓϨʔτΤϯδϯΛॻ͘ײ͡ • ศརؔ਺͸ php.net Ͱݕࡧ͢Ε͹ḿΔ • Ruby ͸ϑϨʔϜϫʔΫΛ௨ͯ͡ Rack ΞϓϦέʔγϣϯΛॻ͘ײ͡ • ϑϨʔϜϫʔΫͷίʔυΛಡΉ͜ͱ͕ଟ͍ • ίʔυΛॻ͘ͱ͖͸ Rack ΑΓԼͷ͜ͱΛҙࣝ͢Δ͜ͱ͸͋·Γͳ͍ • Go ͸ import ‘net’ ͱ͔͢Δͱ਺ߦͰαʔόʔΛىಈͰ͖ΔͷͰޙ͸Α͠ͳʹͰ͖Δ • godoc ͕෼͔Γ΍͍͢ͷͰͦΕΛಡΉ • جຊతʹඞཁͳॲཧΛશ෦ࣗ෼Ͱॻ͘ඞཁ͕͋Δ
  24. NginxͱGoΛܨ͙ • ϢʔβʔͷϦΫΤετΛ௚઀ Go ͕ड͚ΔͷͰ͸ͳ͘ Nginx Ͱड͚͍ͨ • ϢʔβʔͷϦΫΤετΛόοϑΝϦϯάͯ͘͠ΕΔͷͰίωΫγϣϯͷอ࣋ͳͲ໘౗ͳ͜ ͱΛߟ͑Δඞཁ͕ͳ͘ͳΔ

    • GoͰ͸௿஗ԆͰϨεϙϯεΛฦ͢͜ͱ͚ͩΛߟ͑Ε͹Α͍ • ΞΫηεϩάͳͲ͕؆୯ʹ࢒ͤΔ • ΞΫηε੍ޚͳͲ؆୯ • ΩϟογϡͷػߏͳͲ͕؆୯ʹ࢖͑Δ • ࣾ಺ʹϊ΢ϋ΢͕ଟ͋͘Δ • ޿ࠂ͸খ͍͞ύέοτΛ΍ΓͱΓ͢ΔͷͰtcpͩͱΦʔόʔϔου͕େ͖͍ • UNIX domain socketܦ༝Ͱܨ͙ඞཁ͕͋Δ
  25. UNIX domain socket • ϓϩηεؒ௨৴ • ಉҰϚγϯ্ͳΒ਌ࢠؔ܎ͳͲ͕ແͯ͘΋௨৴͕Ͱ͖Δ • tcpͳͲΑΓ΋҆ఆɾߴ଎ʹಈ͘ •

    memcachedͱͷ௨৴ʹ΋࢖༻͢Δͱߴ଎͔ͭ҆ఆతʹಈ࡞ͤ͞Δ͜ͱ͕Ͱ͖Δ • ΋ͪΖΜ࢖༻͍ͯ͠Δ • ϐΫγϒࣾ಺Ͱ͸গͳ͍ϦιʔεͰେྔͷΞΫηεΛߴ଎ʹ͞͹ͨ͘ΊʹࢸΔͱ ͜ΖͰ࠾༻͞Ε͍ͯΔ • Go ͷ৔߹ net.Listen("unix", path) ͷΑ͏ʹ͢Ε͹Α͍
  26. hot deploy • DNSϥ΢ϯυϩϏϯͷͨΊִ཭͕ࠔ೉ • ޿ࠂαʔόʔ͸AWSͰ͸ͳ͍ͷͰELB͸࢖͑ͳ͍ • pixivपลαʔϏε͸ίετ໘͔ΒAWSΛ࢖Θͳ͍ • ௒େྔֆഅɾpixivࣣ༦୹࡭ࡇͳͲظؒݶఆͷ΋ͷʹ͸AWS͸࢖ΘΕ͍ͯ

    Δ • ݱࡏͷ޿ࠂۀքͰ͸AWSΛ࢖͏ͷ͕ଟ͍ͷͰELBΛ࢖ͬͯhot deployΛ ࣮ݱ͍ͯ͠Δձ͕ࣾଟ͍ • ޿ࠂαʔόʔͳͷͰσϓϩΠ࣌ʹμ΢ϯλΠϜ͕ൃੜͯ͠͸͍͚ͳ͍
  27. Circus w .P[JMMB͕࡞ͬͨ1ZUIPO੡ͷϓϩηε؅ཧπʔϧ w $JSDVTࣗମ͕ιέοτϑΝΠϧΛ࣋ͬͯɼΞϓϦέʔγϣϯ͸ϑΝΠϧσΟεΫϦϓ λΛ-JTUFOͤͯ͞ىಈ͢Δ w σϓϩΠ࣌ʹ৽͍͠ϓϩηε͕ىಈ͔ͯ͠Βݹ͍ϓϩηεΛLJMM͢Δ w μ΢ϯλΠϜͳ͠ͰΞϓϦέʔγϣϯΛೖΕସ͑Δ͜ͱ͕Ͱ͖Δ

    w ઃఆϑΝΠϧΛॻ͘ͱ͍͍ײ͡ʹىಈͯ͘͠ΕΔ w FYBNQMF͕๛෋ͳͷͰׂͱॻ͚Δ w (PଆͰ͸ϩά͸ඪ४ग़ྗͱඪ४Τϥʔग़ྗʹॻ͚ͩ͘Ͱ$JSDVT͕ϩάϑΝΠϧԽͱϩ άϩʔςʔτΛશͯ୲͏ w (Pଆͷ։ൃίετΛԼ͛Δ w DJSDVTDUMͱ͍͏ίϚϯυπʔϧܦ༝Ͱૢ࡞͢Δ
  28. Circus΁ϓϧϦΫ • Circus͸GitHubͰ։ൃ͞Ε͍ͯΔ • Debianͷinit.dεΫϦϓτ͸CircusࣗମͷϩάΛग़ྗ͠ͳ͔ͬͨ • ग़ྗͰ͖ΔΑ͏ʹมߋͯ͠ϓϧϦΫ΋ͯ͠ΈΔ • merge͞Εͨ •

    ϐΫγϒͰ͸ࣾ಺Ͱ࢖༻͍ͯ͠ΔΦʔϓϯιʔεϓϩμΫτʹύονΛૹΔͷ͸ਪ ঑͞Ε͍ͯΔ • ༗໊ͳϓϩμΫτͰ΋ࡉ͔͍෦෼͸ద౰ͳ͜ͱ͕ଟ͍ • Mozillaͷϓϩηε؅ཧπʔϧcircusʹϓϧϦΫͨ͠࿩ - catatsuyͱ͸ http:// catatsuy.hateblo.jp/entry/2014/08/18/215602
  29. socket TPDLFU࡞੒ ϑΝΠϧ σΟεΫϦϓλ socket ϑΝΠϧ σΟεΫϦϓλ ϓϩηε؂ࢹ DJSDVT͸ϓϩηε؂ࢹ͚ͩ ͰϦΫΤετ͸ײ஌͠ͳ͍

    BQQ͸ϑΝΠϧσΟεΫϦϓλΛ -JTUFO͢ΔαʔόʔͰ͋Δඞཁ͕͋Δ αʔόʔىಈ࣌ αʔόʔىಈޙ circus app circus app GPSLFYFD
  30. circus socket ϑΝΠϧ σΟεΫϦϓλ app_old GPSLFYFD app_new ϓϩηε؂ࢹ αʔόʔϦϩʔυ αʔόʔϦϩʔυ

    BQQ@OFX͕ىಈ͢Δ·Ͱ଴ͭ BQQ@OFX͕ىಈͨ͠Β BQQ@PMEΛLJMM͢Δ circus socket ϑΝΠϧ σΟεΫϦϓλ app_old app_new ϓϩηε؂ࢹ LJMM
  31. ΩϟογϡԽ • ΞΫηεͷ౓ʹmemcachedʹΞΫηεΛͨ͠Β஗্͍ʹ CPU ࢖༻཰΋্͕ͬͯ͠·ͬͨ • memcachedͷऔಘ݁ՌΛΞϓϦέʔγϣϯଆͰ30ඵؒΩϟογϡ͢Δ͜ͱʹ • ௕͗͢Δͱ޿ࠂσʔλͷ൓ө͕஗ΕΔ •

    ΩϟογϡԽ͸ۜͷ஄ؙͰ͸ͳ͍ • ifจ͸δϟϯϓ໋ྩͳͷͰҋӢʹ࢖͏ͱ஗͘ͳΔ • ܭࢉ݁ՌͷΩϟογϡͳͲ΋෼ذ༧ଌ͕౰ͨΓʹ͍͘ܗͩͬͨΓ͢Δͱ౎౓ܭࢉͤͨ͞ํ ͕଎͍ࣄ͕ଟ͍ • ΞϓϦέʔγϣϯͷෳࡶ౓Λ্͛Δ • ΩϟογϡԽ͸ଌఆͯ͠ޮՌ͕͋Δ෺Ҏ֎͸࢖༻͠ͳ͍ • ਪଌ͢Δͳ ܭଌͤΑ
  32. JSONͱMessagePack • memcachedͷόϦϡʔʹJSONΛೖΕͯGoଆͰparse͍͕ͯͨ͠ϓϩϑΝΠϦϯά ͔Βparseʹ͕͔͔͍࣌ؒͬͯΔ͜ͱ͕൑໌ • JSONͱಉ͡Α͏ʹѻ͍΍͘͢ߴ଎ʹparseͰ͖ΔMessagePackΛ࢖༻͢Δͱߴ଎ʹ ಈ࡞ͨ͠ • fluentdͷ಺෦Ͱ΋MessagePack͸࢖ΘΕ͍ͯΔ •

    Go͸JSONपΓͷػೳ͕ॆ࣮͍ͯ͠Δ͚ͩ஗͍ • ஗͔ͬͨΒϓϩϑΝΠϦϯάΛऔΓϘτϧωοΫΛݟ͚ͭͯରࡦΛߟ͑Δ΂͖ • Goʹͨ͠Βඞͣ଎͘ͳΔͱ͍͏͜ͱ͸ͳ͍ • ਪଌ͢Δͳ ܭଌͤΑ
  33. σϓϩΠ • ࣾ಺σϓϩΠπʔϧpploy(OSS)Λ࢖͏ • pixivͷσϓϩΠΛࢧ͑Δpploy - pixiv engineering blog http://inside.pixiv.net/entry/

    2014/12/25/102410 • σϓϩΠαʔόʔ্ͰεΫϦϓτΛ࣮ߦग़དྷΔ • γΣϧεΫϦϓτͰ΋PHPͳͲͰ΋Α͍ʢࠓ͸શ෦γΣϧεΫϦϓτʣ • fluentd͸HUPγάφϧΛૹΔͱϦϩʔυͰ͖Δ • init.dεΫϦϓτΛࣗલͰ࡞੒ • Go͸ϥΠϒϥϦʹґଘ͠ͳ͍࣮ߦόΠφϦΛίϯύΠϧͰੜ੒ • σϓϩΠαʔόʔͰίϯύΠϧ֤ͯ͠αʔόʔ΁όΠφϦΛ഑෍
  34. ϓϩηε؂ࢹ • ΞϓϦέʔγϣϯ͸Circus • memcached, fluentd͸monitΛར༻ • monit͸pidϑΝΠϧΛ࡞Δinit.dεΫϦϓτ͕͋ΔͳΒ؆୯ʹ ϓϩηε؂ࢹ͕Ͱ͖Δ •

    memcached͸init.dεΫϦϓτ͕طʹ͋ͬͨ • fluentd͸reload࣌ʹHUPγάφϧΛૹΔͨΊʹinit.dεΫϦ ϓτΛࣗ࡞͍ͯͨ͠
  35. ࢮ׆؂ࢹ • ϐΫγϒ͸NagiosΛ࢖͍ͬͯΔͷͰNagiosͰ؂ࢹ • ΞϓϦέʔγϣϯ͸εςʔλείʔυ200൪Λฦ͚ͩ͢ͷϧʔςΟϯάΛ༻ҙͯ͠؂ࢹ • fluentd͸monitor_agentΛ࢖ͬͯ؂ࢹ • Nginx͸stub_statusΛ࢖ͬͯ؂ࢹ •

    Circus͸circusctl statusͷ݁Ռ͔Β؂ࢹ • memcached͸tcp͕ૄ௨͍ͯ͠Δ͔Ͳ͏͔Λ؂ࢹ • memcached͸ύονΛ౰ͯΔͱTCPιέοτͱUNIXυϝΠϯιέοτΛಉ࣌ʹ listenͰ͖Δ
  36. ഑৴தͷ޿ࠂσʔλ͕৽͍͠ ޿ࠂΛೖߘ్ͨ͠୺ʹফ͑ͨ • telnet localhost 11211Ͱ11211ϙʔτͰىಈ͍ͯ͠Δmemcachedͱձ࿩Ͱ͖Δ • statsͰىಈதͷmemcachedͷঢ়ଶΛ֬ೝͰ͖Δ • evictions͕େྔൃੜ

    • ༰ྔෆ଍Ͱmemcached͕௥͍ग़ͨ͠ճ਺ • limit_maxbytes͕૝ఆΑΓ͔ͳΓখ͍͞ • ࠷େ༰ྔ͕খ͍͞ͷͰ௥͍ग़͞Ε͍ͯͨ • ઃఆ஋ͷ༩͑ํΛؒҧ͍͑ͯͨ • ઃఆΛมߋͨ͠Β൓ө͞Ε͍ͯΔ͔֬ೝ͢Δ͜ͱ w ΦϯϝϞϦܕͷϛυϧ΢ΣΞ͸ϝϞϦ࢖༻཰Λ؂ࢹ͢΂͖
  37. /(*/9 ը૾ $"$)& ը૾͍ͩ͘͞ʂ ը૾͋͛Δ͚Ͳ Ωϟογϡͯ͠Ͷ application ը૾͕ͳ͍ͷͰ ը૾͍ͩ͘͞ ը૾ૹΓ·͢

    /(*/9 ը૾ $"$)& ͜ͷը૾ͷΩϟογϡΛ ࣋ͬͯΔ͚Ͳߋ৽͋Δʁ ߋ৽ͳ͍͔Β ͦͷ··࢖ͬͯʂ application Ұ౓ը૾ΛૹͬͨΒ ͠͹Β͘Ωϟογϡ͞ΕΔ ͷͰϦΫΤετ͞Εͳ͍ ճ໨ ճ໨ ͱͳΔ͸͕ͣ໰౴ແ༻Ͱ ը૾ΛૹΓ͚͍ͭͯͨʜ ࠷ॳͷճ͚ͩͰͦͷޙ͸ ը૾Ωϟογϡ͕ฦ͢ͷͰ ϦΫΤετ͞Εͳ͍
  38. NginxͰ഑৴͍ͯ͠Δ޿ࠂͷը૾ΛϢʔβʔ ͷϒϥ΢β͕Ωϟογϡͯ͘͠Εͳ͍ • ϒϥ΢βʹΩϟογϡͯ͠ཉ͍͠ͳΒHTTPͷϨεϙϯεϔομʔʹLast-Modified/ Expires/Cache-ControlΛ෇͚Δ • ϒϥ΢β͸ಉ͡URL΁ͷϦΫΤετͷϔομʔʹIf-Modified-SinceΛ෇͚ͯϒϥ΢β ͕औಘͨ͠೔࣌Λ஌Βͤͯ͘ΕΔ • If-Modified-SinceΑΓޙʹߋ৽͞Ε͍ͯΕ͹৽͍͠σʔλΛɼߋ৽͕ͳ͚Ε͹εςʔ

    λείʔυ304(Not Modified)Λฦͯ͠ΩϟογϡΛͦͷ··࢖ͬͯ΋Β͏ • ࠓճͷ޿ࠂαʔόʔͰ͸ը૾͕มΘΕ͹URL͕มΘΔͨΊը૾σʔλʹߋ৽͕ೖΔ͜ ͱ͸ͳ͍ • ͦ΋ͦ΋ը૾͸NginxଆͰΩϟογϡ͞Εͯ͠·͏ͷͰΞϓϦέʔγϣϯͷϨεϙϯ ε಺༰͕มΘ͍ͬͯͯ΋Nginx͸ؾ෇͔ͳ͍
  39. Nginx͕ϑΝΠϧͷߋ৽༗ແΛͲ͏൑அ͢Δͷ͔ • If-Modified-SinceΛݟͯ200͔304͔Λ൑அ͢ΔͷͰNginx͕ը૾σʔλͷλΠϜελϯϓΛ೺Ѳͯ͠ ͍ͳ͍ͱμϝͰ͸ʁ • Goͷαʔόʔ͕ฦ͢ͳΒλΠϜελϯϓͰ͸ͳ͘Last-ModifiedϔομʔͰ൑அ͍ͯ͠Δʁ • memcachedʹ޿ࠂσʔλ͕͍ͭೖߘ͞Εͨͷ͔ͷ৘ใΛೖΕͯͳ͔ͬͨͷͰ1970/1/2ʹ • ͋·Γྑ͘ͳ͍͕ը૾σʔλ͕มΘΕ͹URL͕มΘΔͷͰ࣮༻্໰୊͸ͳ͍

    • ͜ͷͨΊʹmemcachedʹ֨ೲ͢ΔσʔλΛ૿΍͢ͷ͸खؒΛߟ͑Δͱׂʹ߹Θͳ͍ • epoch Time 0ͷ1970/1/1ͩͱόάͩͱࢥΘΕΔՄೳੑ͕͋ΔͷͰආ͚ͨ • NginxͷΩϟογϡ͕ݹ͍··ͰҰ෦ͷը૾ͰΩϟογϡ͞Εͣ • ΩϟογϡΛ࡟আͨ͠Βશը૾Ͱ૝ఆ௨Γͷಈ͖ʹ • যΒͣʹҰͭҰͭ֬ೝͯ͠ঢ়گΛ೺Ѳ͠ͳ͕Β࢓༷Λௐ΂Δ͜ͱ
  40. 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υϝΠϯιέοτ͸؆୯ʹݟΕͳ͍
  41. straceͰγεςϜίʔϧΛݟΔ • UNIXυϝΠϯιέοτͰ΍ΓऔΓ͢ΔͳΒγεςϜίʔϧͷwrite͸૸Δ • γεςϜίʔϧ͕૸ΔͳΒstraceΛ࢖͑͹ݟΕΔ • straceͰ΋ྲྀΕͳ͍… • ϢʔβʔͷϦΫΤετΛड͚͍ͯΔͷ͸GoroutineͰεϨουͰಈ͍͍ͯΔ •

    straceͷ-fΦϓγϣϯΛ࢖͏ͱεϨου΋τϨʔεͯ͘͠ΕΔ • -sΦϓγϣϯͰ௕͍ϦΫΤετͰ΋શ෦ݟΕΔΑ͏ʹͳΔ w ໰୊͕ىͬͨ͜Β·ͣݪҼΛ੾Γ෼͚Δ • nginx - UNIXυϝΠϯιέοτ௨৴ͷ಺༰Λݟ͍ͨ - Qiita http://qiita.com/catatsuy/items/ e514e8bd45270106b17e
  42. 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 άϥϑͰҧ࿨ײΛײͨ͡ΒઈରʹԿ͔͋ΔͷͰೲಘͷ͍͘·Ͱௐ΂ Δ ϖʔδΩϟογϡΛᷰ͏ϩάΛݟ͚ͭΔ
  43. ϩάղੳ༻ͷfluentdͱͷ֨ಆ • ࠓճ͸ΞϓϦέʔγϣϯʹ΋fluentdΛ࢖͍ͬͯΔ͕ϐΫγϒࣾ಺తʹ͸ϩάղੳ༻్ʹ࢖ΘΕΔ • ΞϓϦέʔγϣϯͷΤϥʔϩάΛૹΔ࢓૊Έ • Ϣʔβʔղੳ༻ʹΞΫηεϩάΛऩू͢Δ࢓૊Έ • ޿ࠂ഑৴αʔόʔʹҟৗ͕ͳ͍͔Nginxͷϩά͔Β؂ࢹ͍ͨ͠ •

    εςʔλείʔυ400൪୆͕ಥવ૿͑ͨͳͲ • ϨεϙϯελΠϜʹҟৗ͕ͳ͍͔؂ࢹ͍ͨ͠ • ͜͜਺೔Ͱҟৗʹ଎౓͕མ͍ͪͯΔͳͲ • ֤഑৴αʔόʔͷNginxͷϩάΛղੳͯ͠άϥϑԽ • άϥϑԽʹ͸σʔλΛPOST͚ͨͩ͠Ͱάϥϑʹͯ͘͠ΕΔGrowthForecastͰ
  44. fluentdͰϩάΛղੳ͢Δ • in_tailϓϥάΠϯΛ࢖༻͢ΔͱϩάϑΝΠϧΛtailͰ͖Δ • ਖ਼نදݱͳͲͰϩάϑΝΠϧΛղੳͤͯ݁͞ՌΛGrowthForecastʹPOST • શϩάΛਖ਼نදݱͰղੳ͍ͯ͠ΔͷͰCPUύϫʔΛ࢖͏ • ޿ࠂ഑৴αʔόʔ͸ϢʔβʔͷϦΫΤετΛड͚ΔͨΊCPUύϫʔΛ࢖͍ͨ͘ͳ͍ •

    ϢʔβʔͷϦΫΤετΛड͚͍ͯͳ͍ผαʔόʔʹϩάΛૹͬͯͦ͜Ͱղੳ͍ͨ͠ • ͦͷࡍʹͲ͜ͷαʔόʔͷϩά͔͸෼͔ΔΑ͏ʹ͍ͨ͠ • ϗετ໊΋ؚΊͯૹͬͯ͏·͘ϩάͰղੳ͢Δඞཁ͕͋Δ • ଓ͖͸WebͰ • fluentdͰϗετ໊෇͖ͰϩάΛड͚औͬͯղੳͯ͠άϥϑʹ͍ͨ͠ - Qiita http://qiita.com/ catatsuy/items/6755a796423067a77acd
  45. .Z42-ͷ༰ྔരൃ w ഑৴αʔόʔ͕ॻ͖ࠐΉϨίʔυΛͦͷ··શ෦࢒͍ͯͨ͠Βσʔλྔ͕΋ͷ͍͢͝੎͍ Ͱ૿͑ͨ w ඞཁͳͷ͸όονॲཧͰੜ੒͞ΕΔϨϙʔτͷσʔλͳͷͰϨϙʔτ͕࡞੒͞Ε͍ͯΕ͹ ෆཁͷσʔλ w ύʔςΟγϣχϯάͰఆظతʹ࡟আ͍ͨ͠ w

    .Z42-ͷύʔςΟγϣχϯάͰ͸ϓϥΠϚϦʔΩʔʹύʔςΟγϣχϯά͍ͨ͠Χϥ Ϝؚ͕·Ε͍ͯΔඞཁ͕͋Δ w NJHSBUJPOͰ"-5&35"#-&ͯ͠"3Ͱ͸໌ࣔతʹQSJNBSZ@LFZΛJEʹ͢Δ w ύʔςΟγϣχϯάࣗମ͸ຖ೔࡞ͬͯ͸ফ͢Λ܁Γฦ͢ͷͰNJHSBUJPO͸࡞Βͣʹ୯७ͳ όονͰ࣮ߦ͢ΔΑ͏ʹ w "-5&35"#-&ͱ࠷ॳͷύʔςΟγϣχϯάΛ࡞Δ࡞ۀ͸͕͔͔࣌ؒΔͷͰࣄલʹ༰ྔΛ ༧ଌͯ͠ύʔςΟγϣχϯά͕ඞཁͳ΋ͷΛચ͍ग़͓ͯ͘͠
  46. w ϨίʔυΛظؒͳͲͰ෼ׂ͢Δ͜ͱͰࢀর͠ͳ͚Ε͹ͳΒͳ͍ϨίʔυͷྔΛݮΒ͢ w શظؒΛݟΔඞཁ͕͋ΔΫΤϦͳΒΉ͠Ζ஗͘ͳΔ w ΦϓςΟϚΠβ͕ͲͷύʔςΟγϣϯΛݟΕ͹͍͍͔൑அ͢ΔͷͰͦͷ࣌఺ͰҰ෦ͷύʔςΟγϣ ϯͷΈͷࢀরʹͰ͖Ε͹ߴ଎ʹ w ಛఆͷύʔςΟγϣϯΛߴ଎ʹ࡟আͰ͖Δ w

    ΠϯσοΫε͕షͬͯ͋ͬͯ΋࡟আ͸௨ৗ஗͍͕ύʔςΟγϣϯͷ࡟আ͸Ұॠ w ΠϯσοΫεͷ౷ܭ৘ใ͕յΕͨΓɼϑϥάϝϯςʔγϣϯ͕ൃੜ͢Δ͜ͱ͸ͳ͍ Ϩίʔυ Ϩίʔυ Ϩίʔυ Ϩίʔυ ύʔςΟγϣχϯάղઆ
  47. ϩά͕44%ͷ༰ྔΛṧഭ w LTLMPHΛूܭͯ͠.Z42-ʹॻ͖ࠐΉεΫϦϓτ͕ు͘ϩάΛ೔ճMPHSPUBUF͢ΔΑ͏ʹ͍ͯͨ͠ w ഑৴ྔ͕૿͑ͯ೔ճͰ͸ڊେ͗ͨ͢ w σΟεΫ༰ྔ΋ṧഭ͍ͯͨ͠ w ࣌ؒຖʹMPHSPUBUF͢ΔΑ͏ʹ w

    MPHSPUBUFGϑΝΠϧ໊ͰMPHSPUBUFΛ࣮ߦͰ͖Δ w /HJOYͷϩάΛগ͠௕Ίʹ࢒͢Α͏ʹ w ೔Ͱ44%ͷ༰ྔΛṧഭˠҰେࣄʹͳΔͱ͜ΖΛةػҰ൅ͰରԠʜ w qVFOUEͰϩάΛૹ͍ͬͯΔͷͰૹΓઌʹอଘ͢ΔΑ͏ʹ w ޿ࠂαʔόʔ͸ΞϓϦέʔγϣϯͷಛੑ্େྔͷϩάΛు͘ͷͰMPHSPUBUFͷλΠϛϯά΍࢒͢ϩά ͷྔΛߟ͑ͳ͍ͱࢮ͸͍ۙ w ϩάΛ෠ΔͱҰॠͰࢮʹࢸΔͷͰϩάͷྔͱ44%ͷۭ͖༰ྔʹ஫ҙ͢Δ͜ͱ
  48. (Pͷϓϩηε͕ίΞ͔͠࢖Θͳ͍ w NVOJOͷάϥϑ͕಄ΛଧͬͨΑ͏ʹͳΔ w (0."9130$4Λม͑ͯ΋μϝ w ͣͬͱʹ͍ͯͨ͠ͷΛ΍ʹ͕ͨ͠େ͖ͳҧ͍͸ݟΒΕͣ w ࠓ͸શ୆ʹ͍ͯ͠Δ w

    ΞΫηε͕ҰఆྔΛ௒͑Δͱ/HJOYͷΞΫηεϩάΛૹΔqVFOUEͱϩάΛॻ͖ࠐΉDJSDVT ͕$16Λ͔ͳΓᷰ͏Α͏ʹͳΔͷͰ(Pͷϓϩηεʹ$16Λ࢖ΘͤΔඞཁ͸ݱঢ়ͳ͍ w QQSPGΛݟΕΔΑ͏ʹͯ֬͠ೝ w LTLMPHͷॻ͖ࠐΈ͕௚ྻʹ͔࣮͠ߦͰ͖ͳ͍͜ͱ͕ݪҼͱߟ͑ΒΕ͍ͯΔ w ݱঢ়େ͖ͳ໰୊͕ൃੜͯ͠ͳ͍ͷͰ༷ࢠݟঢ়ଶ w άϥϑͰҧ࿨ײΛײͨ͡ΒઈରʹԿ͔͋ΔͷͰೲಘͷ͍͘·Ͱௐ΂Δ
  49. αʔόʔҠߦͷཧ༝ͱखॱ 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Λ৐ͬऔΔඞཁ͕͋Δ
  50. .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ঢ֨
  51. "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ίϚϯυͰ্ॻ͖͕Մೳ
  52. ഑৴αʔόʔҠߦͰͷࣄނ چ ৽ " # *1ΞυϨε"Λ৐ͬऔΔલʹ FUDOFUXPSLJOUFSGBDFTͰ *1ΞυϨε#Λ෇͚ͯಈ࡞֬ೝ  JQBEESBEEͱTFOE@BSQ

    Ͱ*1ΞυϨε"Λ৐ͬऔΓ چ ৽ # " 48 TFOE@BSQ  ৽ # " º JQBEESEFMͰෆཁͳ#Λ མͱͨͭ͠΋Γ͕৐ͬऔͬͨ"΋ফ͑ͨ º ৽ " JQBEESBEEͰ"Λ ෇͚͕ͨ௨৴͕෮׆͠ͳ͍ ௨৴ෆՄ  
  53. ഑৴αʔόʔͷࣄނղઆ 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 ࣄނ͕ىͬͨ͜ͱ͖͔ͦ֬͜ͳ஌͕ࣝੜ͖Δ
  54. ࢀߟ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/
  55. ࢀߟ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
  56. ݸਓత͓͢͢Ίຊʢશһʣ • ମܥతʹֶͿ҆શͳ Web ΞϓϦέʔγϣϯͷ࡞Γํʢಙؙຊʣ • ಡ·ͣʹ Web ΞϓϦ։ൃෆՄೳ •

    Ϧʔμϒϧίʔυ • ಡΈ΍͍͢ίʔυͷॻ͖ํͳͲ • ϋΠύϑΥʔϚϯε Web αΠτ • ߴ଎ʹWebαΠτΛදࣔ͢Δํ๏͕جຊ͔Βॻ͍ͯ͋Δ • HTTP2ͷલͰ͸ແྗ͕ͩ·ͩ໾ʹཱͭ • SQLΞϯνύλʔϯ • SQLͰ΍ͬͯ͸͍͚ͳ͍΂͔Βͣू • Team Geek • ٕज़ॻͰ͸ͳ͍͕άϧʔϓ։ൃʹ͓͚Δ৺ߏ͑ͳͲ
  57. ࠓճͷࢀߟจݙ ʢ͞Βʹ஌Γ͍ͨਓ޲͚ʣ • αʔό/ΠϯϑϥΛࢧ͑Δٕज़ • গ͠ݹ͍͕ࠓճͷ࿩ʹڵຯ͕͋Ε͹ • ͳΔ΄ͲUnixϓϩηε - RubyͰֶͿUnixͷجૅ

    • preforkͳͲϓϩηεʹ͍ͭͯ • Πϯϑϥ/ωοτϫʔΫΤϯδχΞͷͨΊͷωοτϫʔΫٕज़ˍઃܭೖ໳ • Πϯϑϥͷ࢓ࣄ಺༰͕஌Γ͍ͨਓʹ • ωοτϫʔΫपΓ΋ॻ͍ͯ͋Δ • ࣮ફDNS DNSSEC࣌୅ͷDNSͷઃఆͱӡ༻ • DNSʹ͍ͭͯ