https://aws.amazon.com/jp/events/devday/japan/
ISUCONӡӦΛࢧ͑ΔAmazon ECSͱAurora Serverless v2໘ന๏ਓΧϠοΫ ౻ݪढ़Ұ (@fujiwara)AWS Dev Day 2022 Japan2022.11.10
View Slide
@fujiwara SREνʔϜISUCON 1,2,5,11!༏উ4ճISUCON 3,8,12 ӡӦ(ग़)3ճgithub.com/kayac/ecspressoAmazon ECS σϓϩΠπʔϧgithub.com/fujiwara/lambrollAWS Lambda σϓϩΠπʔϧ
ISUCONͱLINEגࣜձࣾओ࠵ʮͳΜͰ͋ΓʯͷWebαʔϏεύϑΥʔϚϯενϡʔχϯάίϯςετ2011։࢝ʙ2022Ͱ12ճ
ISUCONͱWebΞϓϦέʔγϣϯ͕ಈ࡞͍ͯ͠ΔαʔόʔΠϯελϯε͕༻ҙ͞ΕΔ(1ʙ࠷େ5)Πϯελϯε֎෦͔ΒϕϯνϚʔΫ(HTTPϦΫΤετ)࣮ߦॲཧͰ͖ͨϦΫΤετͳͲ͔ΒείΞΛࢉग़ڝٕ࣌ؒ8࣌ؒϕϯνϚʔΫείΞ͕Ұ൪ߴ͍νʔϜ͕༏উʂ
ISUCONʮͳΜͰ͋ΓʯʮͳΜͰʯʹʮ༩͑ΒΕͨڝٕ༻Πϯελϯεͷ্Ͱಈ͘ͷͳΜͰ1มߋͯ͠Α͍ʯ• WebΞϓϦέʔγϣϯͷ࣮(ݴޠؚΊͯ)• ϛυϧΣΞOSͷઃఆ• ҙͷιϑτΣΞϛυϧΣΞͷಋೖ֎ܗతͳڍಈΛҡ͍࣋ͯ͠ΕɺߴԽ͢Δख๏ʹ੍ݶͳ͍1 Ұ෦ϨΪϡϨʔγϣϯʹ໌ه͞Εͨࣄ߲Λআ͘
ISUCON12֓ཁΦϯϥΠϯ༧બ2022-07-23() 10:00-18:00ࢀՃνʔϜ 698ʢֶੜ 98ʣࢀՃऀ߹ܭ 1657໊ʢֶੜ 246໊ʣΦϯϥΠϯຊબ2022-08-27() 10:00-18:00ࢀՃνʔϜ 30ʢֶੜ 8ʣࢀՃऀ߹ܭ 84໊ʢֶੜ 22໊ʣ
ISUCONϙʔλϧαΠτ
ISUCONϙʔλϧͷࣄਃ͠ࠐΈ͔Β༧બ·ͰνʔϜɾϝϯόʔࢀՃड͚͚ɹGitHub, DiscordΞΧϯτ࿈ܞAWSಈ࡞ݕূ༻CloudFormation(CFn)ςϯϓϨʔτɹ࣮ࡍʹEC2ΛىಈɺsshՄೳ͔ݕূΫʔϙϯɹAWS༷ɺ͘͞ΒΠϯλʔωοτ༷
ISUCONϙʔλϧͷࣄ༧બ / ຊબڝٕ༻ΠϯελϯεͷIPΞυϨεΛѲɹϗετ্ͷagent͕ϙʔλϧͱ௨৴ϕϯνϚʔΫ࣮ߦɹࢦఆͨ͠Πϯελϯεʹର࣮ͯ͠ߦɹϕϯνϚʔΫ݁ՌొAPIڝٕதͷ݁ՌӾཡɹϕϯνϚʔΫ݁ՌҰཡͱৄࡉɹશνʔϜͷείΞਪҠ
ISUCON12ϙʔλϧͷ࣮https://github.com/isucon/portal࣮OSS(MIT Lisense)ͳͷͰͲͳͨͰ͑·͢2@sorah ͕ISUCON10Ͱ࣮վमɺҾ͖ܧ͍Ͱ32 υΩϡϝϯτ΄΅ͳ͍ͨΊ؆୯ʹಈ͔ͤΔΘ͚Ͱͳ͍…
ISUCON12ϙʔλϧͷߏRails + Shoryuken (SQS job worker)ɹSPAʹ͍ۙߏɹReact + REST API (Protobuf)ɹDiscord, GitHub࿈ܞͳͲඇಉظjobͰ࣮ߦɹDiscord botϕϯνϚʔΧʔɹϙʔλϧAPI͔ΒjobΛऔಘ (Rustdaemon)ɹ→ ରΠϯελϯεʹϕϯνϚʔΫ࣮ߦ (GoCLI)ɹϕϯνϚʔΫ݁ՌΛϙʔλϧAPIʹૹ৴
ISUCON12ϙʔλϧAWS্ʹσϓϩΠAmazon CloudFrontApplication Load Balancer (ALB)Amazon Simple Queue Service (SQS)Amazon ElastiCache RedisAmazon ECS FargateAurora MySQL Serverless v2 [New!]ɹ2022-04 GAɹͪΐ͏ͲͬͯΈ͔ͨͬͨʂ
ISUCON11→12Ͱͷ͓ͳมߋ• ϕϯνϚʔΧʔ͕ EC2 → ECS Fargate ʹ• ISUCON11 νʔϜ͝ͱʹ1ͷ EC2 Λ੩తׂΓͯ• ISUCON12 700νʔϜʹରͯ͠ Fargate 200 λεΫΛڞ༗• RDS ͕ Aurora Serverless v2 ʹʂ
ISUCONϙʔλϧͷར༻ঢ়گࢀՃਃ͠ࠐΈ220ʙ230νʔϜΛ3ճʹ͚ͯࢀՃొ1. ॳճ 240ඵͰച2. 2ճ 110ඵͰച3. 3ճ 20ఔͰചਃ͠ࠐΈ͕ຒ·Δ͚ͩۃʹΞΫηε͕ଟ͍
ISUCONϙʔλϧͷར༻ঢ়گ༧બڝٕ։࢝࣌ࠁʹڝٕ༻ϖʔδ͕openࢀՃऀ1700໊͕͍͍ͬͤʹΞΫηεCFnςϯϓϨʔτμϯϩʔυϕϯνϚʔΫ࣮ߦɹ༧બ࣌ 40,000ճ/8࣌ؒ = ฏۉ83ճ/ɹϐʔΫ࣌120ճ/
ISUCONϙʔλϧʹAurora Serverless v2͕࠷ద?ΞΫηεͷ૿ݮ͕ۃΊͯݦஶΞΫηε͕ଟ͍ظؒಛʹ͍(ʙ࣌ؒ)3ϲ݄ͷӡӦظؒதɺ΄ͱΜͲՋ࠷খ Aurora Capacity Unit(ACU) 0.5ͰेΞΫηε͕૿ݮ͢ΔλΠϛϯάಡΊΔɺ͕…աڈͷܦݧ͕ͳ͍ͨΊ૿Ճ͕ಡΈͮΒ͍ݟੵΓΛޡΔͱΓͳ͍ = োͷՄೳੑ͕͋Δ
ISUCONϙʔλϧʹAurora Serverless v2͕࠷ద!ෛՙ͕૿ݮ͢ΔλΠϛϯά = ਃ͠ࠐΈڝٕ։࢝ɺऴྃ࣌→ ӡӦ͕ଟࣄલεέʔϧΞοϓɺࣄޙεέʔϧμϯͷखΛֻ͚ͨ͘ͳ͍ίετൺֱత͍҆ΠϯελϯελΠϓ USD/h USD/monthdb.t3.small 0.063 45.99Serverless v2 (0.5 ACU) 0.10 73.00db.t4g.medium 0.113 82.49
࣮ࡍͷར༻ঢ়گΛϝτϦΫεͰಡΈղ͘υΩϡϝϯτAurora Serverless v2ͷॏཁͳAmazon CloudWatchϝτϦΫε3͔Β ServerlessDatabaseCapacity ʹʼ ΠϯελϯεϨϕϧͷϝτϦΫεͱͯ͠ɺݱࡏͷDBΠϯελϯεͷ༰ྔͰද͞ΕΔ ACU Λใࠂ͠·͢3 https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.setting-capacity.html#aurora-serverless-v2.parameters-based-on-scaling
ࢀՃొୈ2ظ70ඵͰ230νʔϜ͕ച42k/min = 700req/secఔɹSPAͳͷͰ΄΅ͯ͢APIFargate 16 task (1 vCPU 4GiB)ɹCPU ΄΅100%ʹɹFargateࣄલʹtaskखಈઃఆάϥϑCloudFrontͷϦΫΤετ
ࢀՃొୈ2ظQueries & ServerlessDatabaseCapacityQueries 30 qps → 600 qpsServerlessDatabaseCapacity 0.5 → 2Կ͠ͳ͍Ͱෛՙʹैͯ͠ͳ͠1ͰͷϐʔΫͬͱӶ͍44 ϝτϦΫεऔಘ࣌ʹ5ཻͷ͔͍ͬͯ͠ͳ͔ͬͨͨΊ
༧બ։࢝࣌Queries & ServerlessDatabaseCapacity9:40 ͡Θ͡ΘͱΞΫηε͕૿͑Δ10:00 1700໊͕Ұ੪ʹΞΫηε10:00ͷΫΤϦɹ9:55ͱൺֱͯ͠10ഒɹ9:59ͱൺֱͯ͠5ഒServerlessDatabaseCapacity0.5 → 3ʹॠ࣌ʹैઌճΓ্͕͍ͯͬͯ͠ΔΑ͏ʹʁ
༧બ։࢝࣌SelectLatency &ServerlessDatabaseCapacity։࢝લ͍Ζ͍ΖͳΫΤϦ͕গ→ ϨΠςϯγ҆ఆ͠ͳ͍։࢝ޙҰ੪ʹಉछͷΞΫηε→ ϨΠςϯγ͕҆ఆ→ Queries, ACU͕ٸ૿ͯ҆͠ఆ
༧બ1Λ௨ͯ͠10:00ɹQueries 1.2k/secɹServerlessDatabaseCapacity 2.518:00ɹQueries 2.8k/secɹServerlessDatabaseCapacity 8.520࣌Ҏ߱ʹͶ͍ͯΔͷӡӦʹΑΔࢼͷӨڹ(ޙड़)FargateΕ͍ͯͨ(ΦʔτεέʔϧͰ͍͍ײ͡ʹ૿͑ͨ)
༧બ1Λ௨ͯ͠SelectLatency &ServerlessDatabaseCapacity10:00ʙ17:00·ͰLatency҆ఆ17:00ʙ18:00ϙʔλϧͷڍಈ(ൃߦ͢ΔΫΤϦ)͕มΘͬͨӨڹͷมԽ
༧બऴྃޙͷӡӦࢼڝٕ༻ΠϯελϯεΛશ࠶ىಈޙڝٕதͷείΞ͕࠶ݱͰ͖Δ͔ࢼ700νʔϜͷϕϯνϚʔΫҰؾʹೖ× 3ճCLIΛ࣮ߦ͍ͯͨ͠ମײͰ1ճ࠷ॳඵҾ͔͔ͬΔ→ ͦͷޙεϜʔζʹྲྀΕͨ
༧બऴྃޙͷӡӦࢼ࠷ॳͷϨΠςϯγ͕େ͖ΊCapacityएׯΕͯ૿Ճ2, 3ճCapacity͕མ͖͍ͪͬͯͳ͍→εϜʔζʹै͍ͯ͠Δ"Aurora Serverless v2ͰͷύϑΥʔϚϯεͱεέʔϦϯά"5ʼ ݱࡏͷ༰ྔ͕େ͖͍΄ͲɺεέʔϧΞοϓ͕͘ͳΓ·͢5 https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.setting-capacity.html
εέʔϧΠϯ࣌ͷڍಈQueries(੨) &ServerlessDatabaseCapacity(ᒵ)18:00ʙ ঃʑʹԼ͕Δ͕2.5ఔΛҡ࣋21:00ʙ 0.5·Ͱݮগ૿Ճ࣌ෛՙʹԠͯ͡Ұؾʹ্͕Δݮগ࣌ෛՙ͕ݮ͙ͬͯ͢ʹ࠷·ͰԼ͕Βͣ͋Δఔҡ࣋ͨ͋͠ͱঃʑʹԼ͢Δ
·ͱΊAurora Serverless v2ΛISUCON12ϙʔλϧʹ࣮ઓೖ͠·ͨ͠ಉҰੑೳͰprovisionedͳΠϯελϯεͱൺֱ͢ΔͱߴՁ͕ͩࣗಈͰෛՙैͯ͘͠ΕΔͨΊӡ༻ίετ͕ۃΊ͍ͯීஈՋɺʹಥൃෛՙ͕ൃੜ͢ΔΠϕϯτ༻ͷαΠτӡӦʹۃΊ࣮ͯ༻తͳಛੑ