CRIUを利用したHTTPリクエスト単位でコンテナを再配置できる低コストで高速なスケジューリング手法
第4回Web System Architecture研究会@京都
2019/04/13 さくらインターネット株式会社 さくらインターネット研究所
上級研究員 松本亮介 / まつもとりー / @matsumotory
͘͞ΒΠϯλʔωοτגࣜձࣾ(C) Copyright 1996-2019 SAKURA Internet Inc͘͞ΒΠϯλʔωοτݚڀॴCRIUΛར༻ͨ͠HTTPϦΫΤετ୯ҐͰίϯςφΛ࠶ஔͰ͖ΔίετͰߴͳεέδϡʔϦϯάख๏2019/04/13 ্ڃݚڀһ দຊ ྄հୈ4ճWeb System Architectureݚڀձˏژ
View Slide
1. എܠͱత2. ؔ࿈ݚڀͷ՝3. ఏҊख๏4. ࣮ݧͱߟ5. ·ͱΊ2࣍
1.എܠͱత
• ݸਓ͕ͨΓલʹଟछଟ༷ͳWebαΠτΛ࣋ͭ࣌• ΫϥυɾVPSͷΑ͏ͳࣗ༝ͱִڥʢΠϯελϯεʣʹର͢Δཁٻ• SNSΛհͯ͠ݸਓͷίϯςϯπΛ֦ࢄ͍࣌͢͠• ݸਓͷWebαΠτͷΞΫηεूத͢Δػձͷ૿େ• ݸਓαΠτͰΞΫηεूதোͱ͍ͬͨมԽʹڧ͍ج൫͕ඞཁ• ༧ଌͰ͖ͳ͍ΞΫηεͱϦιʔεׂΛϦΞΫςΟϒʹߦ͍͍ͨ4ݸਓͷWebαΠτͷΞΫηεूத৴པੑ
1. ΠϯελϯεՃॲཧ͕Ͱ͋Δ͜ͱΛղܾ• Πϯελϯε(ίϯςφ)ͷঢ়ଶͷఀࢭɾىಈɾεέʔϦϯάΛߴʹ॥• ϦΫΤετ୯ҐͰϦΞΫςΟϒʹঢ়ଶΛܾఆ → มԽʹڧ͍ج൫2. ϋʔυΣΞϦιʔεͷར༻ޮͷ͞Λղܾ• ϦΫΤετ͕ແ͍ΠϯελϯεҰఆظؒىಈޙʹఀࢭ• CPU48ίΞ256GBϝϞϦఔͷαʔόʹສ͔ΒेສϗετΛఆΠϯελϯεΛߴूੵʹऩ༰ՄೳͰมԽʹڧ͍ԾԽج൫FastContainer5߃ৗੑͷ͋ΔมԽʹڧ͍ج൫ͷఏҊ※1˞3ZPTVLF.BUTVNPUP 6DIJP,POEPBOE,FOUBSP,VSJCBZBTIJ 'BTU$POUBJOFS")PNFPTUBUJD4ZTUFN"SDIJUFDUVSF)JHITQFFE"EBQUJOH&YFDVUJPO&OWJSPONFOU$IBOHFT 5IFSE"OOVBM*&&&*OUFSOBUJPOBM$PNQVUFST 4PGUXBSF BOE"QQMJDBUJPOT$POGFSFODF$0.14"$ +VMZ UPBQQFBS
• Մ༻ੑ୲อͷͨΊʹෳΠϯελϯεՔಇͤ͞Δ͜ͱʹΑΔίετͷ૿େ• ෳͷऩ༰αʔόʹΠϯελϯεΛͦΕͧΕՔಇͤ͞Δ͜ͱͰՄ༻ੑΛ୲อ• ߴूੵʹΠϯελϯεऩ༰͢Δ؍͔ΒͰ͖Δ͚ͩϦιʔεΛઅ͍ͨ͠• ར༻ऀઢͰՄ༻ੑΛ୲อͭͭ͠අ༻Λݮ͍ͨ͠• ґવͱͯ͠ɺHTTPͷϨεϙϯελΠϜͷ؍͔ΒɺFastContainerͷHTTPϦΫΤετܖػͰঢ়ଶΛมߋ͢Δ࣌ؒͷॖ՝• ίϯςφࣗମ͘ىಈͯ͠தͰಈ͘αʔόϓϩηεͷىಈ͕͍6FastContainer͓Αͼؔ࿈ݚڀͷՄ༻ੑͷ՝
1. Πϯελϯε্ͰWordPressͷΑ͏ͳҰൠతͳWebΞϓϦ͕ಈ࡞Մೳ2. ୯ҰΠϯελϯεͰऩ༰αʔόো࣌ʹผαʔόࣗಈతʹ࠶ஔՄೳ3. Πϯελϯεͷ࠶ஔͷ࣮ߦ࣌Ͱ͋ͬͯඵͷԆͰHTTPλΠϜΞτ͢Δ͜ͱͳ͘ΦϯϥΠϯͰϨεϙϯεΛૹ৴ՄೳΠϯελϯεΛߴʹ࠶ஔՄೳʹ͢Δ͜ͱͰूੵΛ্ͤ͞ίετͳج൫Λ࣮ݱ͢ΔεέδϡʔϦϯάख๏ͷఏҊ7ݚڀͷత: ϦΫΤετ୯Ґ ͰͷΠϯελϯε࠶ஔ
2.ؔ࿈ݚڀͷ՝
• FastContainer ※1HTTPϦΫΤετʹԠͯ͡Ԡత͔ͭߴʹΠϯελϯεͷঢ়ଶʢىಈɺఀࢭɺҠಈɺෳɺϦιʔε૿ݮʣΛܾఆ• ΞΫηεʹԠͨ͡ϦΞΫςΟϒͳεέʔϦϯάॲཧ͕Մೳ• ΫϥυαʔϏεج൫༧ΊΠϯελϯεΛىಈͤͯ͞ϦΫΤετΛॲཧ• ΞΫηεूத࣌༧ଌత͔ͭϓϩΞΫςΟϒͳεέʔϦϯάॲཧ͕ඞཁ9FastContainerͱΫϥυαʔϏεج൫ͷಛ˞3ZPTVLF.BUTVNPUP 6DIJP,POEPBOE,FOUBSP,VSJCBZBTIJ 'BTU$POUBJOFS")PNFPTUBUJD4ZTUFN"SDIJUFDUVSF)JHITQFFE"EBQUJOH&YFDVUJPO&OWJSPONFOU$IBOHFT 5IFSE"OOVBM*&&&*OUFSOBUJPOBM$PNQVUFST 4PGUXBSF BOE"QQMJDBUJPOT$POGFSFODF$0.14"$ +VMZ UPBQQFBS
1. WordPressͷΑ͏ͳҰൠతͳWebΞϓϦέʔγϣϯΛར༻Մೳ2. Πϯελϯεͷऩ༰αʔόͷো࣌ʹHTTPλΠϜΞτ͕ੜ͡ͳ͍ϨϕϧͰαʔϏεΛܧଓͰ͖ΔఔͷՄ༻ੑΛఆ10ຊݚڀʹ͓͚ΔԾԽج൫ͱՄ༻ੑͷલఏ
• ༷ʑͳWebΞϓϦέʔγϣϯ͕ར༻Մೳ• IaaSPaaSΛར༻ͨ͠Πϯελϯε୯ҐͰͷߏங͓ΑͼՄ༻ੑ୲อ͕Ұൠత• ຊݚڀͷՄ༻ੑ͕લఏͷ߹ɺෳऩ༰αʔόʹͦΕͧΕΠϯελϯεΛϗοτελϯόΠํࣜʢىಈࡁΈͷػΠϯελϯεʣͰػ͢Δ͜ͱͰ࣮ݱ• ऩ༰αʔόఀࢭ࣌ʹଈ࣌αʔϏεΛܧଓ͢ΔͨΊ• ෳΠϯελϯεͷىಈ͕લఏͱͳΓϦιʔε༗ͷίετ͕૿େ• ϦΞΫςΟϒʹՄ༻ੑΛ୲อ͢ΔʹϨεϙϯελΠϜͷӨڹ͕େ͖͍11FastContainerΫϥυج൫ͷՄ༻ੑ
4UPSBHF$MJFOU4FSWFSJOTUBODF"JOTUBODF#JOTUBODF$4FSWFSJOTUBODF"'BTU$POUBJOFSΫϥυج൫ͷՄ༻ੑ)551ϦΫΤετ4UPSBHF$MJFOU4FSWFSJOTUBODF"JOTUBODF#JOTUBODF$4FSWFSJOTUBODF")551ϦΫΤετ✗12αʔόো
3.ఏҊख๏
1. Πϯελϯε্ͰWordPressͷΑ͏ͳҰൠతͳWebΞϓϦ͕ಈ࡞Մೳ2. ୯ҰΠϯελϯεͰऩ༰αʔόো࣌ʹผαʔόࣗಈతʹ࠶ஔՄೳ3. Πϯελϯεͷ࠶ஔͷ࣮ߦ࣌Ͱ͋ͬͯඵͷԆͰHTTPλΠϜΞτ͢Δ͜ͱͳ͘ΦϯϥΠϯͰϨεϙϯεΛૹ৴Մೳ14ఏҊख๏: ϦΫΤετ୯Ґ ͰͷΠϯελϯε࠶ஔ
154UPSBHF$MJFOU4FSWFSJOTUBODF"JOTUBODF#JOTUBODF$4FSWFSఏҊख๏ʴ'BTU$POUBJOFSͷՄ༻ੑ)551ϦΫΤετ4UPSBHF$MJFOU4FSWFSJOTUBODF"JOTUBODF#JOTUBODF$4FSWFS)551ϦΫΤετJOTUBODF"✗Ԡతʹ࠶ஔαʔόো
HTTP FastContainerͷجຊϑϩʔ168FC1SPYZʢOHY@NSVCZ$.%#ʴ"1*8FC%JTQBUDIFSOHY@NSVCZ$MJFOU ίϯςφίϯςφίϯςφw )551ϦΫΤετͷ)PTUOBNFΛΩʔʹɺ$.%# ߏཧ%#͔ΒίϯςφͷใΛऔಘ)551 4ϦΫΤετw ίϯςφͷ*1ͱϙʔτʹج͍ͯίϯςφʹϓϩΩγw ίϯςφ͕-JTUFO͍ͯ͠ͳ͍߹$.%#͔ΒίϯςφใΛಘͯىಈ$POUBJOFS&OHJOFIBDPOJXBऩ༰ϗετ"
1. Proxy͔Βऩ༰αʔόʹICMP/TCPͰ࠷ݶͷύέοτͰԠΛଌఆ2. Ԡ͕ᮢΛ͍͑ͯͨΒผͷऩ༰αʔό࠶ஔ3. ίϯςφىಈ࣌ɺىಈྃલͷঢ়ଶͷϓϩηεΠϝʔδ͔Β෮ݩ→ ඇৗʹγϯϓϧͳํࣜͰߴͳ࠶ஔΛ࣮ݱՄೳ→ ୯ҰͷίϯςφͰ࣮༻తͳՄ༻ੑΛ୲อՄೳʢϦιʔείετͷݮʣ17ߴͳऩ༰ϗετͷࢮ׆ࢹͱ࠶ஔ
)PTU048FC1SPYZ$.%#"1*$POUBJOFS%JTQBUDIFS$POUBJOFS)PTU04$POUBJOFS%JTQBUDIFS$POUBJOFS$MJFOU)551*$.1)551)551)551*$.1PS5$1
)PTU048FC1SPYZ$.%#"1*$POUBJOFS%JTQBUDIFS$POUBJOFS)PTU04$POUBJOFS%JTQBUDIFS$POUBJOFS$MJFOU)551 *$.1PS5$1*$.1PS5$1)551)551)551✗࠷ॳͷ࠶ஔ࣌ίϯςφͷىಈ͕ඞཁͰ͋Δ͕ɺىಈޙҰఆظؒىಈ͠ଓ͚Δɻ
• ICMP/TCPͰᮢνΣοΫ͕Ұ࣌తʹޡݕͯ͠Өڹ͕গͳ͍• TCPͷ߹ࣗ࡞TCPελοΫͰԟ෮3ύέοτͰνΣοΫ[3][4]• FastContainerͳͷͰޡݕͷ࠶ஔ͕ੜͯ͡αʔϏε͕ܧଓ͞ΕΔ• ޡݕͰଞαʔόʹىಈͯ͠͠·ͬͯҰఆ࣌ؒىಈͨ͠Βఀࢭ͢Δ• ݩαʔόʹ࠶ஔ͞ΕͯCMDB্ݩαʔόͷΈʹϦΫΤετ͕ྲྀΕΔ• Ԡ࣌ؒͷᮢλΠϜΞτΛΪϦΪϦ·ͰνϡʔχϯάՄೳ20ఏҊख๏ͷϙΠϯτʢICMP/TCPࢹʣ<>NBUTVNPUPSZ NSVCZGBTUSFNPUFDIFDL IUUQTHJUIVCDPNNBUTVNPUPSZNSVCZGBTUSFNPUFDIFDL<>-JOVYΧʔωϧͷ5$1ελοΫͱγεςϜίʔϧͷΈ߹ΘͤʹΑΔख๏ΑΓߴʹϙʔτͷ-JTUFOνΣοΫΛߦ͏ IUUQTICNBUTVNPUPSKQFOUSZ
• ίϯςφͷWebαʔόϓϩηεΛىಈྃલͰΠϝʔδԽ(Checkpoint)• ఆظతʹඇಉظͰϓϩηεͷىಈྃલΠϝʔδΛ࡞͓ͯ͘͠• ϦΫΤετड৴࣌ʹΠϝʔδΛϓϩηεʹ෮ݩ(Restore)• αʔόϓϩηεͷॳظԽॲཧΛεΩοϓ• ىಈʹ࣌ؒͷ͔͔ΔΞϓϦέʔγϣϯαʔόʹ༗ར• Ruby on RailsɼDjangoͳͲ21ఏҊख๏ͷϙΠϯτʢCheckpoint/Restoreʣ
• αʔόϓϩηεͷىಈޙΛίϯςφϥϯλΠϜͰϑοΫͯ͠Checkpoint• ࢀߟ: seccompͰγεςϜίʔϧΛࢹ͠ptraceͰҰ࣌ఀࢭ͔ͯ͠ΒCRIUͰCheckpointʹΑΔΠϝʔδԽͱ͍͏ํ๏͋Δ• CRIUͷதͰseccompΛ͓ͬͯΓύον͕ඞཁͰ൚༻ੑʹ͔͚Δ• ϦΫΤετΛड͚ͯίϯςφΛىಈ͢Δ࣌Πϝʔδ͔ΒRestoreͯ͠ىಈ22Checkpoint/RestoreʹΑΔFastContainerͷىಈ
αʔόϓϩηεͷCheckpoint/Restoreͷ࣮23SFGl04ϨΠϠͰ8FCαʔό͕ىಈ࣌ʹ࣮ߦ͢ΔγεςϜίʔϧΛࢹ͠ىಈྃલͷϓϩηεΛΠϝʔδԽ͢ΔlIUUQICNBUTVNPUPSKQFOUSZ
4.࣮ݧͱߟ
FastContainerͷγεςϜߏ25
26
• ༧උ࣮ݧ: CRIUͱCheckpoint/Restore͢ΔϓϩηεͷϝϞϦαΠζͱͷؔ• දతͳΞϓϦέʔγϣϯΛͬͨίϯςφ࠶ஔ࣌ͷϨεϙϯελΠϜ• Apache 2.4.18ɼPHP 7.3.0ɼWordpress 5.0.3ʢσϑΥϧτϖʔδʣ• Python 3.7.1ɼDjango 2.1.4ɼgunicorn 19.9.0※1• Ruby 2.5.1ɼRails 5.2.1ɼPuma 3.12.0※227࣮ݧ༰˞IUUQTNDMPMJQPQ[FOEFTLDPNIDKBBSUJDMFT˞IUUQTHJUIVCDPNFWFSZMFBGFMUSBJOJOݱ࣮తͳنʢݸਓάϧʔϓͰͷར༻ͷΞϓϦέʔγϣϯఔʣͰ%#Λར༻ͨ͠ͷΛ࠾
• ComputeͰWebαʔόͷCheckpoint/RestoreͷΛܭଌ• mruby-simplehttpserver※1ͰWebαʔόΛىಈͤ͞setsockopt()Λࢹ• setsockopt()࣮ߦલʹCheckpoint• setsockopt()࣮ߦલʹϝϞϦΛ֬อͯ͠ɺϝϞϦαΠζʹԠͯ͡Checkpoint/RestoreͷͷมԽΛܭଌ28༧උ࣮ݧɿϓϩηεͷΠϝʔδԽͷ࣮ݧ˞NBUTVNPUPSZNSVCZTJNQMFIUUQTFSWFS IUUQTHJUIVCDPNNBUTVNPUPSZNSVCZTJNQMFIUUQTFSWFS
αʔόϓϩηεͷΠϝʔδԽ(Checkpoint/Restore)29$IFDLQPJOU3FTUPSF1SPDFTTJOH5JNFEVFUP.FNPSZ6TBHF1SPDFTTJOHUJNF.FNPSZVTBHFQFSQSPDFTT<.#> $IFDLQPJOU 3FTUPSF୯ҰͷαʔόϓϩηεͷϝϞϦ༻ྔʹԠͨ͡$IFDLQPJOU3FTUPSFʹඞཁ
• Apache 2.4.18ɼPHP 7.3.0ɼWordpress 5.0.3• ϓϩηε3ɼ୯ҰͷϓϩηεͷϝϞϦαΠζ(RSS)35MBytes• Python 3.7.1ɼDjango 2.1.4ɼgunicorn 19.9.0 ※1• ϓϩηε2ɼεϨου2ɼ୯ҰͷϓϩηεͷRSS33MBytes• Ruby 2.5.1ɼRails 5.2.1ɼPuma 3.12.0 ※2• ϓϩηε2ɼεϨου14ɼ୯ҰͷϓϩηεͷRSS89MBytes• gemΛࣄલίϯύΠϧ͓ͯ͘͠bootsnapͱൺֱ30ίϯςφ࠶ஔ࣌ͷϨεϙϯελΠϜ
WordPress on Apache httpd31BCίϚϯυͰಉ࣌ଓͷϕϯνϚʔΫΛ͔͚ͳ͕Βऩ༰ϗετΛJQBUBCMFTͰԾతʹμϯͤͯ͞ɼผͷऩ༰αʔόʹ࠶ஔΛڧ੍తʹൃੜͤͨ͞
Django32IUUQTNDMPMJQPQ[FOEFTLDPNIDKBBSUJDMFTݱ࣮తͳنʢݸਓάϧʔϓͰͷར༻ͷΞϓϦέʔγϣϯఔʣͰ%#Λར༻ͨ͠ͷΛ࠾༻
Ruby on Rails33IUUQTHJUIVCDPNFWFSZMFBGFMUSBJOJOݱ࣮తͳنʢݸਓάϧʔϓͰͷར༻ͷΞϓϦέʔγϣϯఔʣͰ%#Λར༻ͨ͠ͷΛ࠾༻
5.·ͱΊ
• ୯ҰΠϯελϯεͰՄ༻ੑΛ୲อ͢ΔߴͳεέδϡʔϦϯάख๏ΛఏҊ• ෳΠϯελϯεΛඞཁͱ͠ͳ͍ͨΊϦιʔείετ͕͍• ࣮ݧ͔Βݱ࣌Ͱ࣮༻ՄೳͳϨϕϧͷ࠶ஔͷੑೳ͕ಘΒΕͨ• ϓϩμΫγϣϯڥͰԠ༻• ϗετো࣌Ͱ͋ͬͯϢʔβ͕ؾ͔ͮͳ͍ϨϕϧͰͷՄ༻ੑ• ΦʔτεέʔϦϯά࣌ʹγʔϜϨεʹίϯςφΛ૿ͯ͠ෛՙରࡦՄೳʹ• ΞΫηεͱϦιʔεׂΓ͕ͯਖ਼֬ʹਵՄೳʹ• εέʔϦϯάϋʔυΣΞϓʔϧͷϦιʔεׂΓͯ࠷దԽ35·ͱΊ