サーバプロセスのChekpoint/Restoreによるコンテナ起動処理の高速化
松本亮介,中田 裕貴,栗林 健太郎 / Pepabo R&D Institute, GMO Pepabo, Inc. 2018.06.28 第42回 インターネットと運用技術研究会
予稿: http://id.nii.ac.jp/1001/00190206/
αʔόϓϩηεͷChekpoint/RestoreʹΑΔίϯςφىಈॲཧͷߴԽদຊ྄հɼதా ༟وɼ܀ྛ ݈ଠ / Pepabo R&D Institute, GMO Pepabo, Inc.2018.06.28 ୈ42ճ Πϯλʔωοτͱӡ༻ٕज़ݚڀձHTTPϦΫΤετ୯ҐͰΠϯελϯεͷ࠶ஔ͕ՄೳͳίετͰߴͳεέδϡʔϦϯάख๏
View Slide
1. എܠͱత2. ؔ࿈ݚڀͷ՝3. ఏҊख๏4. ࣮ݧͱߟ5. ·ͱΊ2࣍
1.എܠͱత
• ݸਓ͕ͨΓલʹଟछଟ༷ͳWebαΠτΛ࣋ͭ࣌• ΫϥυɾVPSͷΑ͏ͳࣗ༝ͱִڥʢΠϯελϯεʣʹର͢Δཁٻ• SNSΛհͯ͠ݸਓͷίϯςϯπΛ֦ࢄ͍࣌͢͠• ݸਓͷWebαΠτͷΞΫηεूத͢Δػձͷ૿େ• ݸਓαΠτͰΞΫηεूதোͱ͍ͬͨมԽʹڧ͍ج൫͕ඞཁ4ݸਓͷWebαΠτͷΞΫηεूத৴པੑ
1. ΠϯελϯεՃॲཧ͕Ͱ͋Δ͜ͱΛղܾ• Πϯελϯε(ίϯςφ)ͷঢ়ଶͷఀࢭɾىಈɾεέʔϦϯάΛߴʹ॥• ϦΫΤετ୯ҐͰঢ়ଶΛܾఆ → มԽʹڧ͍ج൫2. ϋʔυΣΞϦιʔεͷར༻ޮͷ͞Λղܾ• ϦΫΤετ͕ແ͍ΠϯελϯεҰఆظؒىಈޙʹఀࢭ• CPU48ίΞ256GBϝϞϦఔͷαʔόʹສ͔ΒेສϗετΛఆΠϯελϯεΛߴूੵʹऩ༰ՄೳͰมԽʹڧ͍ԾԽج൫FastContainer5Πϯελϯε͕॥͢ΔมԽʹڧ͍ج൫ͷఏҊ※1˞দຊ྄հ ۙ౻Ӊஐ࿕ ࡾ༔հ ྗ݈࣍ ܀ྛ݈ଠ 'BTU$POUBJOFS࣮ߦڥͷมԽʹૉૣ͘దԠͰ͖Δ߃ৗੑΛ࣋ͭγεςϜΞʔΩςΫνϟ Πϯλʔωοτͱӡ༻ٕज़γϯϙδϜจूɼɼʢʣ /PW
• Մ༻ੑ୲อͷͨΊʹෳΠϯελϯεՔಇͤ͞Δ͜ͱʹΑΔίετͷ૿େ• ෳͷऩ༰αʔόʹΠϯελϯεΛͦΕͧΕՔಇͤ͞Δ͜ͱͰՄ༻ੑΛ୲อ• ߴूੵʹΠϯελϯεऩ༰͢Δ؍͔ΒͰ͖Δ͚ͩϦιʔεΛઅ͍ͨ͠• ར༻ऀઢͰՄ༻ੑΛ୲อͭͭ͠අ༻Λݮ͍ͨ͠• ґવͱͯ͠ɺHTTPͷϨεϙϯελΠϜͷ؍͔ΒɺFastContainerͷHTTPϦΫΤετܖػͰঢ়ଶΛมߋ͢Δ࣌ؒͷॖ՝6FastContainer͓Αͼؔ࿈ݚڀͷՄ༻ੑͷ՝
1. Πϯελϯε্ͰWordPressͷΑ͏ͳҰൠతͳWebΞϓϦ͕ಈ࡞Մೳ2. ୯ҰΠϯελϯεͰऩ༰αʔόো࣌ʹผαʔόࣗಈతʹ࠶ஔՄೳ3. Πϯελϯεͷ࠶ஔͷ࣮ߦ࣌Ͱ͋ͬͯඵͷԆͰHTTPλΠϜΞτ͢Δ͜ͱͳ͘ΦϯϥΠϯͰϨεϙϯεΛૹ৴ՄೳΠϯελϯεΛߴʹ࠶ஔՄೳʹ͢Δ͜ͱͰूੵΛ্ͤ͞ίετͳج൫Λ࣮ݱ͢ΔεέδϡʔϦϯάख๏ͷఏҊ7ݚڀͷత: ϦΫΤετ୯Ґ ͰͷΠϯελϯε࠶ஔ
2.ؔ࿈ݚڀͷ՝
• FastContainer ※1HTTPϦΫΤετʹԠͯ͡Ԡత͔ͭߴʹΠϯελϯεͷঢ়ଶʢىಈɺఀࢭɺҠಈɺෳɺϦιʔε૿ݮʣΛܾఆ• ΞΫηεʹԠͨ͡ϦΞΫςΟϒͳεέʔϦϯάॲཧ͕Մೳ• ΫϥυαʔϏεج൫༧ΊΠϯελϯεΛىಈͤͯ͞ϦΫΤετΛॲཧ• ΞΫηεूத࣌༧ଌత͔ͭϓϩΞΫςΟϒͳεέʔϦϯάॲཧ͕ඞཁ9FastContainerͱΫϥυαʔϏεج൫ͷಛ˞দຊ྄հ ۙ౻Ӊஐ࿕ ࡾ༔հ ྗ݈࣍ ܀ྛ݈ଠ 'BTU$POUBJOFS࣮ߦڥͷมԽʹૉૣ͘దԠͰ͖Δ߃ৗੑΛ࣋ͭγεςϜΞʔΩςΫνϟ Πϯλʔωοτͱӡ༻ٕज़γϯϙδϜจूɼɼʢʣ ݄
1. WordPressͷΑ͏ͳҰൠతͳWebΞϓϦέʔγϣϯΛར༻Մೳ2. Πϯελϯεͷऩ༰αʔόͷো࣌ʹHTTPλΠϜΞτ͕ੜ͡ͳ͍ϨϕϧͰαʔϏεΛܧଓͰ͖ΔఔͷՄ༻ੑΛఆՁ֨WebϗεςΟϯάج൫ɺΫϥυج൫ɺFastContainerج൫Ͱཧ10ຊݚڀʹ͓͚ΔԾԽج൫ͱՄ༻ੑͷલఏ
• ҰൠతͳWebΞϓϦέʔγϣϯ͕ར༻Մೳ• Ձ֨Λ࣮ݱ͢ΔͨΊߴूੵʹϗετΛऩ༰ՄೳͳԾϗετํ͕ࣜҰൠత• ྫɿ୯ҰͷApacheͰສυϝΠϯͷԾϗετΛॲཧ• ສυϝΠϯΛॲཧ͢ΔApacheΛෳαʔόʹෳஔͯ͠Մ༻ੑΛ୲อ※1• ෳWebαʔόϓϩηεͷىಈ͕લఏͱͳΓϦιʔε༗ͷίετ͕૿େ11Ձ֨WebϗεςΟϯάج൫ͷՄ༻ੑ˞দຊ྄հ ݪক࢘ দԬً େنڞ༗ܕ8FCόʔνϟϧϗεςΟϯάج൫ͷηΩϡϦςΟͱӡ༻ٕज़ͷվળ ใॲཧֶձจࢽ 7PM /P QQ .BS
• ༷ʑͳWebΞϓϦέʔγϣϯʢϗεςΟϯάΑΓࣗ༝͕ߴ͍ʣ͕ར༻Մೳ• IaaSPaaSΛར༻ͨ͠Πϯελϯε୯ҐͰͷߏங͓ΑͼՄ༻ੑ୲อ͕Ұൠత• ຊݚڀͷՄ༻ੑ͕લఏͷ߹ɺෳऩ༰αʔόʹͦΕͧΕΠϯελϯεΛϗοτελϯόΠํࣜʢىಈࡁΈͷػΠϯελϯεʣͰػ͢Δ͜ͱͰ࣮ݱ• ऩ༰αʔόఀࢭ࣌ʹଈ࣌αʔϏεΛܧଓ͢ΔͨΊ• ෳΠϯελϯεͷىಈ͕લఏͱͳΓϦιʔε༗ͷίετ͕૿େ12FastContainerΫϥυج൫ͷՄ༻ੑ
13$MJFOU4FSWFS"QBDIFʢWIPTU܈ʣ4UPSBHF$MJFOU4FSWFSJOTUBODF"JOTUBODF#JOTUBODF$4FSWFSJOTUBODF"4UPSBHF4FSWFS"QBDIFʢWIPTU܈ʣՁ֨8FCϗεςΟϯάج൫ͷՄ༻ੑ 'BTU$POUBJOFSΫϥυج൫ͷՄ༻ੑ)551ϦΫΤετ )551ϦΫΤετ
14$MJFOU4FSWFS"QBDIFʢWIPTU܈ʣ4UPSBHF$MJFOU4FSWFSJOTUBODF"JOTUBODF#JOTUBODF$4FSWFSJOTUBODF"4UPSBHF4FSWFS"QBDIFʢWIPTU܈ʣՁ֨8FCϗεςΟϯάج൫ͷՄ༻ੑ 'BTU$POUBJOFSΫϥυج൫ͷՄ༻ੑ)551ϦΫΤετ)551ϦΫΤετ✗✗
3.ఏҊख๏
1. Πϯελϯε্ͰWordPressͷΑ͏ͳҰൠతͳWebΞϓϦ͕ಈ࡞Մೳ2. ୯ҰΠϯελϯεͰऩ༰αʔόো࣌ʹผαʔόࣗಈతʹ࠶ஔՄೳ3. Πϯελϯεͷ࠶ஔͷ࣮ߦ࣌Ͱ͋ͬͯඵͷԆͰHTTPλΠϜΞτ͢Δ͜ͱͳ͘ΦϯϥΠϯͰϨεϙϯεΛૹ৴Մೳ16ఏҊख๏: ϦΫΤετ୯Ґ ͰͷΠϯελϯε࠶ஔ
174UPSBHF$MJFOU4FSWFSJOTUBODF"JOTUBODF#JOTUBODF$4FSWFSJOTUBODF"'BTU$POUBJOFSΫϥυج൫ͷՄ༻ੑ4UPSBHF$MJFOU4FSWFSJOTUBODF"JOTUBODF#JOTUBODF$4FSWFSఏҊख๏ʴ'BTU$POUBJOFSͷՄ༻ੑఏҊख๏)551ϦΫΤετ )551ϦΫΤετ
184UPSBHF$MJFOU4FSWFSJOTUBODF"JOTUBODF#JOTUBODF$4FSWFSJOTUBODF"'BTU$POUBJOFSΫϥυج൫ͷՄ༻ੑ4UPSBHF$MJFOU4FSWFSJOTUBODF"JOTUBODF#JOTUBODF$4FSWFSఏҊख๏ʴ'BTU$POUBJOFSͷՄ༻ੑఏҊख๏)551ϦΫΤετ )551ϦΫΤετJOTUBODF"✗Ԡతʹ࠶ஔ✗
HTTP FastContainerͷجຊϑϩʔ198FC1SPYZʢOHY@NSVCZ$.%#ʴ"1*8FC%JTQBUDIFSOHY@NSVCZ$MJFOU ίϯςφίϯςφίϯςφw )551ϦΫΤετͷ)PTUOBNFΛΩʔʹɺ$.%# ߏཧ%#͔ΒίϯςφͷใΛऔಘ)551 4ϦΫΤετw ίϯςφͷ*1ͱϙʔτʹج͍ͯίϯςφʹϓϩΩγw ίϯςφ͕-JTUFO͍ͯ͠ͳ͍߹$.%#͔ΒίϯςφใΛಘͯىಈ$POUBJOFS&OHJOFIBDPOJXBऩ༰ϗετ"
1. Web Proxy͔Βऩ༰αʔόʹICMPͰ1ύέοτͷԠΛଌఆ2. Ԡ͕ᮢΛ͍͑ͯͨΒผͷऩ༰αʔό࠶ஔ3. ίϯςφىಈ࣌ɺىಈྃલͷঢ়ଶͷϓϩηεΠϝʔδ͔Β෮ݩ→ ඇৗʹγϯϓϧͳํࣜͰߴͳ࠶ஔΛ࣮ݱՄೳ→ ୯ҰͷίϯςφͰ࣮༻తͳՄ༻ੑΛ୲อՄೳʢϦιʔείετͷݮʣ20ߴͳऩ༰ϗετͷࢮ׆ࢹͱ࠶ஔ
)PTU048FC1SPYZ$.%#"1*$POUBJOFS%JTQBUDIFS$POUBJOFS)PTU04$POUBJOFS%JTQBUDIFS$POUBJOFS$MJFOU)551 *$.1*$.1)551)551)551
)PTU048FC1SPYZ$.%#"1*$POUBJOFS%JTQBUDIFS$POUBJOFS)PTU04$POUBJOFS%JTQBUDIFS$POUBJOFS$MJFOU)551 *$.1*$.1)551)551)551✗࠷ॳͷ࠶ஔ࣌ίϯςφͷىಈ͕ඞཁͰ͋Δ͕ɺىಈޙҰఆظؒىಈ͠ଓ͚Δɻ
• ICMPͰᮢνΣοΫ͕Ұ࣌తʹޡݕͯ͠Өڹ͕গͳ͍• FastContainerͳͷͰޡݕͷ࠶ஔ͕ੜͯ͡αʔϏε͕ܧଓ͞ΕΔ• ޡݕͰଞαʔόʹىಈͯ͠͠·ͬͯҰఆ࣌ؒىಈͨ͠Βఀࢭ͢Δ• ݩαʔόʹ࠶ஔ͞ΕͯCMDB্ݩαʔόͷΈʹϦΫΤετ͕ྲྀΕΔ• Ԡ࣌ؒͷᮢλΠϜΞτΛΪϦΪϦ·ͰνϡʔχϯάՄೳ23ఏҊख๏ͷϙΠϯτʢICMPࢹͱFastContainerʣ
• ίϯςφͷWebαʔόϓϩηεΛىಈྃલͰΠϝʔδԽ(Checkpoint)• ఆظతʹඇಉظͰϓϩηεͷىಈྃલΠϝʔδΛ࡞͓ͯ͘͠• ϦΫΤετड৴࣌ʹΠϝʔδΛϓϩηεʹ෮ݩ(Restore)• αʔόϓϩηεͷॳظԽॲཧΛεΩοϓ24ఏҊख๏ͷϙΠϯτʢCheckpoint/Restoreʣ
• αʔόϓϩηεىಈྃલʹಉ༷ͷγεςϜίʔϧΛ࣮ߦ͢Δ͜ͱʹண• Webαʔόͷ߹ɺbind()ɺlisten()ɺsocket()ɺsetsockopt()ͳͲ• αʔόϓϩηεͷىಈྃલͷγεςϜίʔϧΛࢹͯ͠Checkpoint• seccompͰγεςϜίʔϧΛࢹ͠ptraceͰҰ࣌ఀࢭ͔ͯ͠ΒCRIUͰCheckpointʹΑΔΠϝʔδԽ• ϦΫΤετΛड͚ͯίϯςφΛىಈ͢Δ࣌Πϝʔδ͔ΒRestoreͯ͠ىಈ25Checkpoint/RestoreʹΑΔFastContainerͷىಈ
αʔόϓϩηεͷCheckpoint/Restoreͷ࣮26SFGl04ϨΠϠͰ8FCαʔό͕ىಈ࣌ʹ࣮ߦ͢ΔγεςϜίʔϧΛࢹ͠ىಈྃલͷϓϩηεΛΠϝʔδԽ͢ΔlIUUQICNBUTVNPUPSKQFOUSZ
4.࣮ݧͱߟ
FastContainerͷγεςϜߏ28
29
• ༧උ࣮ݧ1ɿICMPͷԠ࣌ؒ• ༧උ࣮ݧ2ɿίϯςφͷىಈ࣌ؒ• ༧උ࣮ݧ3ɿϓϩηεͷΠϝʔδԽ(Checkpoint/Restore)ͷ࣮ݧ• ຊ࣮ݧɿWordPressΛஔͨ͠Webαʔόίϯςφ(Checkpoint/Restoreແ͠)30࣮ݧ
• Web Proxyͱίϯςφऩ༰ϗετؒͷICMPԠ࣌ؒ• 1ύέοτ1500byteͷԠΛ1000ճଌఆ31༧උ࣮ݧ1ɿICMPͷԠ࣌ؒ
• 40byteͷHTMLΛฦ͢Apache+mod_phpͷίϯςφ• ϦΫΤετΛૹ৴ޙɺԠతʹىಈͯ͠ϨεϙϯεΛฦ͢·Ͱͷ࣌ؒΛ500ճଌఆ32༧උ࣮ݧ̎ɿίϯςφͷىಈ࣌ؒ
• ComputeͰWebαʔόͷCheckpoint/RestoreͷΛܭଌ• mruby-simplehttpserverͰWebαʔόΛىಈͤ͞setsockopt()Λࢹ• setsockopt()࣮ߦલʹCheckpoint• setsockopt()࣮ߦલʹϝϞϦΛ֬อͯ͠ɺϝϞϦαΠζʹԠͯ͡Checkpoint/RestoreͷͷมԽΛܭଌ33༧උ࣮ݧ3ɿϓϩηεͷΠϝʔδԽͷ࣮ݧ
αʔόϓϩηεͷΠϝʔδԽ(Checkpoint/Restore)34$IFDLQPJOU3FTUPSF1SPDFTTJOH5JNFEVFUP.FNPSZ6TBHF1SPDFTTJOHUJNF.FNPSZVTBHFQFSQSPDFTT<.#> $IFDLQPJOU 3FTUPSF
• WordPressͷτοϓϖʔδΛฦ͢ίϯςφʢCPUίΞ4ɺϝϞϦ512MBʣ• ಉ࣌ଓ10૯ଓ5ઍͷϕϯνϚʔΫɺICMPͷᮢ100msec• Checkpoint/Restoreͷಋೖ͕ؒʹ߹͓ͬͯΒͣΠϝʔδԽΛߦΘͣʹ࣮ࢪ• ϕϯνϚʔΫͷͷ͕࣌ؒܦաͨ͠ஈ֊Ͱऩ༰αʔόΛiptableͰૄ௨அ35ຊ࣮ݧ
WordPressͷτοϓϖʔδΛฦ͢ίϯςφ36
• ίϯςφͷىಈ͕࣌ؒࢧత• ίϯςφͷىಈ࣌ؒΛඦɾेmsecҎԼʹͰ͖ΕWordPressʹ͓͍ͯΦʔόʔϔου͕WebΞϓϦέʔγϣϯଆ• ϓϩηεͷCheckpoint/RestoreͰରԠՄೳ͔ → γεςϜʹӶҙ࣮த• ݱ࣌Ͱ2ඵҎͱҰ࣌తͳԆ(ϒϥβͰλΠϜΞτ͠ͳ͍ఔ)Ͱ͋ΔͨΊSLA࣍ୈͰ࣮༻ԽՄೳ37ߟ
5.·ͱΊ
• ୯ҰΠϯελϯεͰՄ༻ੑΛ୲อ͢ΔߴͳεέδϡʔϦϯάख๏ΛఏҊ• ෳΠϯελϯεΛඞཁͱ͠ͳ͍ͨΊϦιʔείετ͕͍• ࣮ݧ͔Βݱ࣌Ͱ࣮༻ՄೳͳϨϕϧͷ࠶ஔͷੑೳ͕ಘΒΕͨ• Checkpoint/RestoreͷΈࠐΈʹΑͬͯ͞ΒͳΔ࠶ஔͷߴԽ39·ͱΊ