y8c 2017の発表資料です。
ΠϯϑϥΤϯδχΞͷWEBΞϓϦೖ1 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
View Slide
ࣗݾհ• খपฏ• @oza_shu• Sler→WEBۀք2 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
͢͜ͱ• ࡞͍ͯ͠ΔΞϓϦ(Ԍ্த)• ΞϓϦ࡞Λ࢝ΊͯΑ͔ͬͨ͜ͱ• ΞϓϦ։ൃ͕ϓϩάϥϛϯάೖʹ͓͢͢Ίͳཧ༝͞ͳ͍͜ͱ• ϓϩάϥϛϯάݴޠ• ϑϨʔϜϫʔΫ3 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
ฉ͍ͯ΄͍͠ਓ• ͜Ε͔Βϓϩάϥϛϯάษڧ͍ͨ͠ਓ• ษڧͯ͠Δ͚ͲԿΛ࡞ͬͨΒ͍͍͔Θ͔Βͳ͍ਓ• ίʔυॻ͚ΔΑ͏ʹͳΓ͍ͨΠϯϑϥΤϯδχΞ• ϓϩάϥϛϯάॻ͚ΔΑ͏ʹͳΓ͍ͨͱ૬ஊ͞ΕΔਓ4 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
ϓϩάϥϛϯά͕Ͱ͖ΔͱҾ༻: 20ࡀΛա͔͗ͯΒϓϩάϥϛϯάΛֶ΅͏ͱܾΊͨਓͨͪ5 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
WEBΞϓϦ͕͓͢͢Ίͷཧ༝• ೲظ͕ٛͳ͍• ඞཁͳٕज़͕ଟذʹΔ• αʔό্Ͱಈ͍͍ͯΔΞϓϦͷಈ͖͕Θ͔Δ• োରԠͰΞϓϦͷιʔείʔυΛ͑ΔΑ͏ʹͳΔ• ॻ͘ͱಈ͘ʂ͢͝ʔ͍ʂͨͷ͠ʔ͍ʂ6 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
࡞͍ͬͯΔͷCollect-Qiitaཁ݅• Qiitaͷ࠷৽هࣄऔಘͱݕࡧ• ϩάΠϯػೳ• ηογϣϯอ࣋• ͓ؾʹೖΓػೳ(Ԍ্த)7 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
DEMOؒʹ߹Θͳ͔ͬͨ!ΞΧϯτ࡞ʙهࣄͷݕࡧ·Ͱ͏͍ͯ͝!8 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
Collect-QiitaͰඞཁͱͳΔٕज़• Qiitaͷ࠷৽هࣄऔಘͱݕࡧ• GET,POST,ϧʔςΟϯά,ςϯϓϨʔτ,FORMॲཧ• ϩάΠϯػೳ• DB࿈ܞ, ηΩϡϦςΟ• ηογϣϯอ࣋• Ωϟογϡ, HTTPϓϩτίϧ• ͓ؾʹೖΓػೳ• DB࿈ܞ, Ajax??9 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
ΞϓϦΛ࡞Γ࢝ΊΔͱػೳΛՃͨ͘͠ͳΔ• APIΛୟ͍ͯهࣄΛͱͬͯ͜Εͨʂ• هࣄΛ͓ؾʹೖΓొ͍ͨ͠ʂ• ϩάΠϯೝূ͠ͳ͍ͱͩʂ• ηογϣϯཧඞཁͳΜͩɻRedisͰอଘ͍ͨ͠ͳ!• DockerͰίϯςφʹͯ͠Έ͍ͨʂ• ྲྀߦΓͩ͠k8sͰϚΠΫϩαʔϏεʹ͢Δ??10 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
࣍ͷҰา͕Θ͔Δ!Ҿ༻: 20ࡀΛա͔͗ͯΒϓϩάϥϛϯάΛֶ΅͏ͱܾΊͨਓͨͪ11 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
WEBΞϓϦ͕͓͢͢Ίͷཧ༝• ೲظ͕ٛͳ͍• ػೳՃͯ͠Ԍ্͍͍ͯ͠• ඞཁͳٕज़͕ଟذʹΔ• ৭Μͳٕज़ֶָ͕͍ͯ͠ʂ• αʔό্Ͱಈ͍͍ͯΔ͕ͳΜͳͷ͔ΕΔ• ͲΜͳٕज़͕ΘΕ͍ͯΔͷ͔Δͷָ͍͠ʂ• ॻ͘ͱಈ͘ʂ͢͝ʔ͍ʂͨͷ͠ʔ͍ʂɹ- !12 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
ࣗͷ࡞ͬͨΞϓϦͲ͏ͬͯಈ͍͍ͯΔΜͩΖ͏?- ΞϓϦΛಈ͔͍ͯ͠Δϓϩηεʹ͍ͭͯͬͱΓ͍ͨ- Ͳ͏ͬͯΞϓϦʹΞΫηε͍ͯ͠Δͷ͔Γ͍ͨ13 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
ΞϓϦΛಈ͔͍ͯ͠Δϓϩηεʹ͍ͭͯͬͱΓ͍ͨ• ΧʔωϧϓϩηεΛׂΓৼΒΕͨPIDΛΈͯͱͯ͠ѻ͏• ࣮ߦதͷϓϩηε͕ϦιʔεΛ։͘ͱϑΝΠϧσΟεΫϦϓλׂ͕ΓͯΒΕΔ14 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
ίʔυྫ(1) PIDΛΈͯΈΑ͏# ݱࡏͷϓϩηεΛฦ͢import osprint ("My pid:", os.getpid())$ python3 3_processes_have_pid.pyMy pid: 1059215 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
ίʔυྫ(2) ϑΝΠϧσΟεΫϦϓλ# ϑΝΠϧσΟεΫϦϓλׂ͕ΓͯΒΕ͍ͯΔ͔ΈͯΈΑ͏if __name__ == "__main__":with open("/etc/passwd") as passwd:print(passwd.fileno())passwd.closedtry:print(passwd.fileno())except ValueError:print("The file already has closed")# ϑΝΠϧΛด͡Δͱফ͑Δ$ python3 5_processes_have_file_descriptors_closed_file.2.py3The file already has closed16 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
ϑΝΠϧσΟεΫϦϓλʹ੍ݶ͕͋ΔϑΝΠϧ͕։͚ͳͯ͘োରԠΛͨ͜͠ͱ͕͋ͬͨͳιϑτϦϛοτΛ্͛ͨ͜ͱΛࢥ͍ग़ͨ͠PythonͰopenͰϑΝΠϧΛ։͍ͨΒด͡Α͏ͱॻ͍ͯ͋ͬͨʂwithจΛ͏ͷΛ͓͢͢Ί͞Εͨཧ༝͕Θ͔ͬͨʂ17 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
fork()ؾʹͳͬͯ͘Δϓϩηε͕Fork͞ΕΔͬͯͲ͏͍͏͜ͱ͚ͩͬ?ࢠϓϩηεϓϩηεͰΘΕ͍ͯΔશͯͷϝϞϦͷίϐʔΛҾ͖ܧ͙ϑΝΠϧσΟεΫϦϓλ(ιέοτ)• prefork• ίϐʔɾΦϯɾϥΠτʢCoWɺCopy on Writeʣ• ԿͰκϯϏϓϩηεͬͯͳΔΜ͚ͩͬ• ϓϩηεؒ௨৴• ύΠϓॲཧ,ετϦʔϜ,ϝοηʔδ• γάφϧॲཧ• ϓϩηεάϧʔϓ,ηογϣϯάϧʔϓ18 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
Ͳ͏ͬͯΞϓϦʹΞΫηε͍ͯ͠Δͷ͔Γ͍ͨ• HTTPΞϓϦέʔγϣϯϓϩτίϧ• HTTPTCP(UDP)্Ͱ༻͞ΕɺΫϥΠΞϯτͱαʔόͰΓͱΓ͞ΕΔ19 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
HTTPϓϩτίϧ• HTTPͲ͏͍͏ϓϩτίϧʁ• ͲΜͳϔομ͕͋Δʁ• KeepAliveΊͪΌͪ͘ΌศརͰ• HTTPͱHTTP2ͷҧ͍?• requestsϞδϡʔϧ͕ศར20 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
WEBαʔόͷಈ͖• αʔόWEBϖʔδʹΞΫηε͠ʹ͘ΔΫϥΠΞϯτͷTCPϙʔτΛLISTEN͢Δ• ΫϥΠΞϯταʔόʹଓͯ͠ϦΫΤετΛ͛Δ• αʔόWEBϖʔδΛϦΫΤετͯ͠ฦ͢21 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
TCPαʔόͷ࣮• echoαʔόͷ࣮؆୯• socketϞδϡʔϧ͕ศར• ෳͷΫϥΠΞϯτ͔ΒͷଓʹରԠͤͯ͘͞• ϚϧνϓϩηεϚϧνεϨουɺΠϕϯτۦಈ• I/O(C10K)• thread,queue,select(),epoll()• GunicornͷίʔϧυϦʔσΟϯά22 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
ֶशͷґଘ॥• ಈ͘ͱָ͍͠• αϯϓϧίʔυιʔείʔυΛಡΜͰಈ͔ͯ͠ΈΔ• RFCಡΜͰ༷ಡΉΑ͏ʹͳΔ• πʔϧʹৼΓճ͞Εͣීวతͳٕज़Λ͑Δ• Կॻ͍͍͍͔ͯͳΜͯ·ͳ͘ͳΔ23 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
ෳͷϨΠϠɺʹߦ͚ΔҾ༻: 20ࡀΛա͔͗ͯΒϓϩάϥϛϯάΛֶ΅͏ͱܾΊͨਓͨͪ24 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )
·ͱΊ• ϓϩάϥϛϯάͷ࣍ͷҰา͕Θ͔Δ• োରԠͰιʔείʔυϨϕϧͰಈ࡞Λ͑Δ• ϓϩτίϧϨΠϠͳීวతͳٕज़ֶ͕Δ• ٕज़Λ͏॥• ٕज़Λ͏͜ͱͨͷ͍͠ʂ• ٕज़ͷͰϑϨϯζͰ͖Δʂ• ٕज़ͷΛ͠ͳ͕Βɺ͓ञΛҿΉͷͨͷ͍͠ʂ25 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )