Save 37% off PRO during our Black Friday Sale! »

load-test-with-gatling

 load-test-with-gatling

負荷試験を実施したのでその何ようについて社外発表で登壇しました。
How to Run a load test with gatling.

0716da116339e3580ea12a82a0e0aaa2?s=128

Hirokazu Maruta

February 06, 2019
Tweet

Transcript

  1. ԶͷΨτϦϯά͕ՐΛ෾ͥ͘ʂ giftee SaaS div. Engineer
 ·ΔͨͻΖ͔ͣ ʢެ։൛ʣ

  2. ڈ೥ͷ12݄ͷ࿩

  3. େ෺Ωϟϯϖʔϯ͕͋Γ·ͨ͠ ެ։༻ࢿྉͳͷͰ ৄࡉΛফ͍ͯ͠·͢

  4. Ͱɻ

  5. Α͋͘Δ࿩

  6. ࠓͷγεςϜͬͯɺ େن໛Ҋ݅ ଱͑ΒΕΔΜ͚ͩͬʁ

  7. ʮΑͬ͠Όෛՙςετͨ͠Ζʂʯ ኯ(ʈ)(ʈ)

  8. ԶͷΨτϦϯά͕ՐΛ෾ͥ͘ʂ giftee SaaS div. Engineer
 ·ΔͨͻΖ͔ͣ ʢެ։൛ʣ

  9. ࣗݾ঺հ • ؙా୓࿨ʢ·ΔͨͻΖ͔ͣʣ • Twitter: @mochi_suna • giftee.co SaaSνʔϜΤϯδχΞ •

    झຯɿϐΞϊɺϘυήɺΞΠίϯ࡞੒ʢΧούʣ • ۙگɿ4݄ʹ݁ࠗࣜΛ߇͑ͯ·͢
  10. ͓࢓ࣄʹ͍ͭͯ΋͏গ͠ ٠઒͕ਅ໘໨ʹॻ͍ͯͨͷͰ۷ΓԼ͛·͢ɾɾɾ • ֎෦ൢചը໘ͷCMS • νέοτൃ݊APIͷ࡞੒ • νέοτ݊໘ͷ࡞੒

  11. Agenda • What is "Gatling" • Why Gatling • How

    to use Gatling • Tips • Report
  12. ɾɾɾͱ͍͏͜ͱͰ

  13. ࠓճऔΓѻ͏΋ͷ

  14. None
  15. ※๻ͷ೥୅ͩͱ͜Ε͕ਅͬઌʹࢥ͍͖ͭ·͢ ໊લ͔Βੌͦ͏ ౰೔͸ɺ๭ອըͷ ѱಙ঎ਓ͕υϠإͰ ΨτϦϯάߏ͑Δ͕࢟ ͜͜ʹೖ͍ͬͯ·ͨ͠

  16. What is "Gatling" • "Load and Performance testing framework" •

    "Open-source, based on Scala” • JMeterʹର౳͢Δ͙Β͍༗໊ • Scalaྗͳͯ͘΋ׂͱॻ͚Δ • ϨϙʔτػೳͳͲཉ͍͠ػೳ͕ॆ࣮
  17. ෺ʑ໊͍͠લͩ͠ྑͦ͞͏ શྗͰஶ࡞ݖʹ݌՞ചΔελΠϧ ࿹͕ ΨτϦϯάͷ αΠϘʔάೣ Վ͍ͳ͕Β ΨτϦϯάΛͿͬ์͢ ঁͷࢠ ࿹͕ ΨτϦϯάͷ

    ΨϯμϜ ΠϯΫͰԚ͠߹͏ ήʔϜͷΩϟϥ ౰೔͸৭ʑೖͬͯ·ͨ͠ ΨτϦϯάߏ͑ͨ ѱಙ๵қ঎ͷ υϠإ
  18. ͳͥGatlingΛ࢖͏ʁ

  19. ଟ༷ͳෛՙࢼݧπʔϧ • ੈͷதʹෛՙࢼݧπʔϧͬͯࢁ΄Ͳ͋Δ͚Ͳ…

  20. ༻్ʹ߹ΘͤͯબΜͩΒྑ͍ ࠓճͷ৔߹ • flood.io (※)Ͱςετ݁ՌΛڞ༗͍ͨ͠ • ͱʹ͔͘ظ͕ؒ୹͘ૣ͘࡞Γ͔ͨͬͨ • γʔέϯεςετ͠΍͍͢ Λຬͨ͢΋ͷͰ͋Ε͹ԿͰ΋Α͔ͬͨ

  21. flood.io Ϋϥ΢υϕʔεͷϩʔυςεταʔϏε • ෛՙࢼݧͷͨΊʹࣗલͰαʔόʔཱͯΔͷ͸͠ΜͲ͍ • ϩʔΧϧͩͱࢼݧ಺༰ˍ݁Ռͱ͍͏ܗͰڞ༗͠ʹ͍͘ ͜͏͍ͬͨ໰୊ΛΑ͠ͳʹͯ͘͠ΕΔ

  22. flood.io͕αϙʔτ

  23. ݸਓతͳ໰୊Ͱ ʮJMeterͰҎલςετͨ͜͠ͱ͋ΔΑʯ ʮ͓ɺ΋Β͍·͢Ͷʯ ʮͲΕͲΕʯ

  24. ݸਓతͳ໰୊Ͱ ʮJMeterͰҎલςετͨ͜͠ͱ͋ΔΑʯ ʮ͓ɺ΋Β͍·͢Ͷʯ ʮͲΕͲΕʯ

  25. ݸਓతͳ໰୊Ͱ ʮJMeterͰҎલςετͨ͜͠ͱ͋ΔΑʯ ʮ͓ɺ΋Β͍·͢Ͷʯ ʮͲΕͲΕʯ

  26. ͋ͬ͸ɺ͜ΓΌແཧͩ ʹ͠Α͏ɻ

  27. ͪͳΈʹ ࠓճ͸ૉૣ͍ରԠ͕Ͱ͖ͳ͍ͱ൑அ͕ͨ͠… • https://github.com/flood-io/ruby-jmeter

  28. ͪͳΈʹ ࠓճ͸ૉૣ͍ରԠ͕Ͱ͖ͳ͍ͱ൑அ͕ͨ͠… • https://github.com/flood-io/ruby-jmeter • JMeterͷςετγφϦΦΛRubyͰॻ͚Δ • flood.io͕࡞͍ͬͯΔ ͜Μͳͷ΋͋Δʢશ෦ऴΘ͔ͬͯΒ஌ͬͨʣ

  29. ଟ༷ͳෛՙࢼݧπʔϧʢ࠶ܝʣ • ੈͷதʹෛՙࢼݧπʔϧͬͯࢁ΄Ͳ͋Δ͚Ͳ…

  30. ଟ༷ͳෛՙࢼݧπʔϧʢ࠶ܝʣ • ੈͷதʹෛՙࢼݧπʔϧͬͯࢁ΄Ͳ͋Δ͚Ͳ… ༻్ʹ߹Θͤͯ޷͖ͳ΋ͷ࢖͓͏

  31. ɹɹ౰೔͸ ஍্࠷ڧͷੜ෺͕ڝ͏ͳͱ་͢γʔϯ ɹɹ͕ೖ͍ͬͯ·ͨ͠

  32. ຊ୊ɿGatlingΛ࢖͏

  33. Πϯετʔϧ 1.JDK8ͷΠϯετʔϧ 2.ຊՈαΠτ͔ΒzipΛDL 3.zipΛల։ Ҏ্

  34. ϓϩδΣΫτͷத਎ • ల։ͨ͠ϓϩδΣΫτͷσΟϨΫτϦߏ଄

  35. ϓϩδΣΫτͷத਎ • ओʹ͜ͷล͕࢖͏ͱ͜Ζ ɿgatlingͷ࣮ߦϑΝΠϧͳͲʢbin/gatling.shʣ ɿ࣮ߦ݁ՌͷϨϙʔτ ɿ࣮ߦ͍ͨ͠εΫϦϓτΛஔ͘ͱ͜Ζ

  36. user-filesʹϑΝΠϧΛ௥Ճ • user-files/…/advanced഑Լ • σϑΥϧτͰαϯϓϧ͕͋Δ • ׂͱࢀߟʹͳΔ

  37. ͜͜ʹεΫϦϓτΛ௥Ճ ௒؆୯ͳྫ 1. ੩తϖʔδʹΞΫηε 2. 200OKΛ֬ೝ 3. ࠷ॳʹ10userΛੜ੒

  38. ࡉ͔͘ݟ͍ͯ͘ http.baseURL • ςετର৅ͷURLΛࢦఆ • γφϦΦ͸͜͜Ͱࢦ ఆͨ͠URLʹର࣮͠ߦ • setUp(*).protocols

  39. ࡉ͔͘ݟ͍ͯ͘ scenario • ॲཧ͍ͨ͠γφϦΦ • ग़ྗ໊ΛࢦఆͰ͖Δ • γφϦΦಉ࢜Λ࿈ଓͰܨ͛Δ ͜ͱ΋Ͱ͖Δ •

    inject͢Δ͜ͱͰϢʔβʔͷ ಈ͖Λ੍ޚͰ͖Δ
  40. ࡉ͔͘ݟ͍ͯ͘ setUp • Ϣʔβʔ਺Λ੍ޚ • ʮԿਓͷϢʔβʔ͕ʯ • ʮಉ࣌ʹʯ • ʮͲ͏ૢ࡞͢Δ͔ʯ

    Έ͍ͨͳಈ͖Λ࣮ݱͰ͖Δ
  41. ݁ՌΛݟΔ • ίϚϯυΛ࣮ߦ͢Δͱ͜Μͳ݁Ռ͕ग़Δ

  42. ݁ՌΛݟΔ • ίϚϯυΛ࣮ߦ͢Δͱ͜Μͳ݁Ռ͕ग़Δ Global: 
 ɹશγφϦΦͷ݁Ռ GlobalҎԼ: • ֤γφϦΦͷ݁Ռ •

    ϦμΠϨΫτ͸φϯόϦϯά
  43. ࣮ߦ݁Ռ • શ݅਺ॲཧ͕ऴΘΔͱhtmlʹు͖ग़͞ΕΔ • Τϥʔ਺ɾ཰ɺԠ౴࣌ؒ • ϦΫΤετ਺ͳͲ͕Θ͔Δ

  44. Tips

  45. Ϣʔβʔ੍ޚฤ

  46. nਓΛಉ࣌ʹ্ཱͪ͛Δ atOnceUsers(n) ͜ͷ৔߹͸n=100

  47. ඵؒnਓϢʔβʔ͕ΞΫηε constantUsersPerSec(n) during(t seconds) • n=100 • t=5 • 100ਓͣͭΞΫςΟϒ’Ϣʔβʔ͕૿͍͑ͯΔ

  48. tඵͰϦΫΤετ͕nਓ·Ͱ૿Ճ rampUsers(n) during(t seconds) • n=100 • t=5 5ඵ͔͚ͯ100userʹͳΔ 20[user/s]Ͱۉ͞Ε͍ͯΔͷ͕Θ͔Δ

  49. ࣮ફɿෛՙΛ্͔͛ͯΒΩʔϓ 1. 100ϢʔβʔͰ։࢝ 2. 5ඵ͔͚ͯ200ਓ૿Ճ 3. ఆ਺300ਓͰ10ඵΩʔϓ

  50. ศརͳૢ࡞

  51. POSTͷϨεϙϯεΛอଘ͢Δ • ͋ΔAPIʹPOSTͯ͠ɺͦͷ݁ՌΛར༻͍ͨ͠ • saveAsͰσʔλΛอଘ • ࣦഊͨ͠৔߹͸exitHereIfFailedͰଈதஅ

  52. body͋ΓͰPOST • bodyʹJSONΛ౉͚ͩ͢ • ؔ਺Խ͓ͯ͘͠ͱศར

  53. GETʢϨεϙϯεΛར༻ʣ • جຊతʹ͸POSTͱಉ͡ • session => Ͱηογϣϯ৘ใΛར༻Մೳ • session(“hoge")ͰऔಘՄೳ

  54. Sessionʹ஋Λอଘ • exec಺͔Βsession.setͰ΋֨ೲՄೳ • "${url}" ͰࢀরͰ͖ΔΑ͏ʹͳΔ

  55. ৭ʑ͍͚ͬͨͲ

  56. खΛಈ͔͞ͳ͍ͱ Θ͔Μͳ͍ΑͶ

  57. ԶͷΨτϦϯά

  58. αϯϓϧ࡞Γ·ͨ͠ https://github.com/mochisuna/load-test-sample localhost:8080 localhost:3306 localhost:8000 POST: create_user GET: refer_user POST:

    display_user
  59. POST: Ϣʔβʔ࡞੒ localhost:8080 localhost:3306 localhost:8000

  60. GET: Ϣʔβʔऔಘ localhost:8080 localhost:3306 localhost:8000

  61. POST: ϦμΠϨΫτ localhost:8080 localhost:3306 localhost:8000

  62. POST: ϦμΠϨΫτ localhost:8080 localhost:3306 localhost:8000

  63. ՐΛ෾ͥ͘ ख଍Λ৳͹ͯ͠ઓ͏ Πϯυਓ͕ೖͬͯ·ͨ͠

  64. ݁Ռ

  65. ࣮ߦ͢Δͱɾɾɾ • Redirect 1ͰࢮΜͰΔΘ • Nginx͕ࢮΜͰΜͳʔʢଞਓࣄʣ ͳͲ͕Θ͔Δ

  66. ࣮ࡍͷࢼݧͰ͸Ͳ͏͔ͩͬͨ

  67. flood.ioͰ࣮ફ Ͳ͕͜ ϘτϧωοΫ͔ ͙͢Θ͔Δ

  68. ݁ՌΛ౿·͑൑அ ࠓ·ͰɿʮͱΓ͋͑ͣ୆਺૿΍͠ͱ͖Ό͑͑΍Ζʯ ࠓճɿ • ʮn୆Ͱr [req/s]͍͚ͨʯ • ʮm%༨৒ʹεέʔϧΞ΢τ͓͖ͯ͠·͠ΐ͏ʯ

  69. ݁ՌΛ౿·͑൑அ ࠓ·ͰɿʮͱΓ͋͑ͣ୆਺૿΍͠ͱ͖Ό͑͑΍Ζʯ ࠓճɿ • ʮn୆Ͱr [req/s]͍͚ͨʯ • ʮm%༨৒ʹεέʔϧΞ΢τ͓͖ͯ͠·͠ΐ͏ʯ ఆྔతͳ൑அɾίετݮʂ

  70. ͜ͷ݁ՌΛ౿·͑ຊ൪ ɹɹɹɹɹ66,901݅ ɹɹɹɹɹ41,400݅ ɹɹɹɹɹ51,000݅ ɹɹɹɹɹ 6,750݅ ετΞ" ετΞ# ετΞ$ ετΞ%

  71. ͜ͷ݁ՌΛ౿·͑ຊ൪ ɹɹɹɹɹ66,901݅ ɹɹɹɹɹ41,400݅ ɹɹɹɹɹ51,000݅ ɹɹɹɹɹ 6,750݅ ετΞ" ετΞ# ετΞ$ ετΞ%

    ແఀࢭͰ෷͍ग़͠ୡ੒ʂ
  72. ·ͱΊ • gatling͸ͭΑ͍ͧʔ͍ͧ͢͝ʔ • ෳࡶͳॲཧ΍ಛघͳϢʔβʔૢ࡞΋τϨʔεՄೳ • flood.ioศར • ్தͰόʔδϣϯ্͕Γ΍͕ͬͨ •

    Scalaྗͳͯ͘΋͍͚Δ͚Ͳɺͨ·ʹσόοά͕େม • ಛʹsessionपΓ
  73. ͦͷଞ • ຊ౰͸AWSʹσϞ؀ڥݐ͔ͯͨͬͨ • ʮTerraformͰશࣗಈώϡʔʂʯͱ͔΍ͬͯͨΒ ࣌ؒͳ͘ͳͬͨ • αϯϓϧ࡞Δͷָ͔ͬͨ͠

  74. ૝ఆ࣭໰

  75. ෛՙࢼݧΛ͢ΔλΠϛϯά͸ʁ • ݱঢ়ɺׂͱର঱ྍ๏త • खॱΛཱ֬͢Δͷʹ΋ίετ͔͔Δ͠ɾɾɾ • ຊ౰͸CI/CDͱಉ͙͡Β͍ͷස౓ʹ͍ͨ͠ • ଞͷاۀ͞Μͱ͔Ͳ͏ͯ͠ΔΜͩΖ͏ʁ

  76. Ͳͷ͙Β͍ͷظؒͰ࣮ࢪͨ͠ʁ • ຊ൪ɿ12/5 • ෛՙࢼݧνʔϜൃ଍ɿ11/13 • طଘͷ؀ڥΛಉ͡΋ͷΛߏஙɿʙ11/19 • γφϦΦ࡞੒ɿʙ11/29ʢ͔ͳΓ٧·ͬͨɾɾɾʣ •

    ෛՙࢼݧɿʙ12/5ʢ౰೔·ͰΘͪΌΘͪΌʣ
  77. Ͳͷ͙Β͍ͷظؒͰ࣮ࢪͨ͠ʁ • ຊ൪ɿ12/5 • ෛՙࢼݧνʔϜൃ଍ɿ11/13 • طଘͷ؀ڥΛಉ͡΋ͷΛߏஙɿʙ11/19 • γφϦΦ࡞੒ɿʙ11/29ʢ͔ͳΓ٧·ͬͨɾɾɾʣ •

    ෛՙࢼݧɿʙ12/5ʢ౰೔·ͰΘͪΌΘͪΌʣ ख࡞ۀͰݐͯͨ؀ڥͷෳ੡͕஍ࠈͩͬͨ
  78. ͳΜͰgo • ॻ͖͔͚ͨͬͨͩ • αϯϓϧʹϚδʹͳΓͨ͘ͳ͔ͬͨ • ͜ͷن໛ͷαϯϓϧͳΒָʹॻ͚ΔͰ͢ • ผʹීஈ࢖ͬͯΔRailsʹർΕͨͱ͔ͦ͏͍͏ͷͰ͸ͳ͍ •

    νϡʔχϯάͱ͔͸ͦ΋ͦ΋΍Δؾͳ͔ͬͨ