Stress / Scenario test sử dụng Gatling
Scala
50
Java
78
Gatling
1
White

huydx viết ngày 14/07/2015

image

Giới thiệu

Để tạo nên một service tốt thì việc "stress test" (hay có nghĩa là "test thật lực" :D) là một qui trình không thể thiếu. Stress test tốt có thể giúp phát hiện sớm các bottle neck (hay là các nút thắt) của hệ thống sớm, qua đó giúp chúng ta tránh khỏi các trường hợp như service bị chết "bất đắc kì tử".
Stress test cũng giúp chúng ta chuẩn bị sớm cho các trường hợp bị tấn công , đặc biệt là DDos, để xem hệ thống của chúng ta có thể chịu được tải lớn nhất là bao nhiêu.

Gatling là gì

Gatling là hệ thống stress test sử dụng ngôn ngữ scala, dựa trên nền tảng là akka, netty. Mặc dù viết bằng scala, nhưng các bạn đừng hoảng sợ vội :D, gatling là một trong những tool dễ dùng nhất mà mình từng biết

Chức năng của gatling:

  • Test theo scenario sử dụng scenario script viết bằng scala ( gatling script cực kì dễ viết ;) )
  • Report kết quả bằng html file với giao diện đẹp và rất dễ nhìn
  • Trang bị sẵn "recorder" giúp các bạn có thể tạo scenario bằng việc "record" lại các thao tác trên browser

Cài đặt và sử dụng

Các bạn download Gatling bundle tại đường link sau: http://gatling.io/#/download.
Sau đó giải nén vào một thư mục nào đó, giả sử mình đặt tại

~/GATLING

Record

Step 1

Đầu tiên để làm quen chúng ta sẽ tạo thử một scenario script bằng cách record lại thao tác trên màn hình.
Cách record vô cùng đơn giản, chỉ cần bạn vào thư mục vừa giải nén ở trên, sau đó chạy dòng lệnh tương ứng dưới đây:

bin/recorder.sh #linux
bin/recorder.bat #windows

Chú ý là gatling sử dụng scala, tức là yêu cầu máy của bạn phải cài sẵn java.
Sau khi chạy thì sẽ hiện lên màn hình
alt text

Có khá nhiều mục để điền, cơ mà bạn đừng lo, ở step này thì bạn chả phải làm gì cả.

Step 2

Việc tiếp theo bạn phải làm là setting proxy cho browser.
Tại sao lại cần làm việc này? Lý do là vì gatling sẽ record lại thao tác của bạn nhờ http request thông qua proxy server mà chính nó dựng lên, rất thú vị phải không. Gatling về cơ bản sẽ dựng 1 proxy server bên trong chính nó, với port là Listening port trong hình ở trên. Khi bạn config browser của bạn sử dụng proxy này, mọi thao tác http request sẽ được gatling bắt lại, sau đó dựa vào đó để tạo nên scenario script :).

Mình sẽ setup proxy trên firefox khá đơn giản như hình dưới đây:
alt text

Step 3

Bạn click nút start trên gatling, và sau đó thao tác một số thao tác bất kì trên firefox. Để test thì mình sẽ làm thử các thao tác sau:

  • Vào google
  • Search từ khoá kipalog
  • Vào trang kipalog để xem.

Bạn sẽ thấy trên màn hình gatling hiện ra tất cả các thao tác bạn vừa làm, cả thời gian chờ giữa các thao tác.

alt text

Sau khi hoàn thành xong thì bạn ấn nút Stop & Save, những thao tác bạn vừa làm sẽ được lưu tại thư mục
~/GATLING/user-files/simulations/RecordedSimulation.scala

Mở thừ file ra xem bạn sẽ thấy nội dung như sau:

import scala.concurrent.duration._

import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.jdbc.Predef._

class RecordedSimulation extends Simulation {

    val httpProtocol = http
        .baseURL("http://google.com")
        .inferHtmlResources()
        .acceptHeader("image/png,image/*;q=0.8,*/*;q=0.5")
        .acceptEncodingHeader("gzip, deflate")
        .acceptLanguageHeader("ja,en-US;q=0.7,en;q=0.3")
        .connection("keep-alive")
        .userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:37.0) Gecko/20100101 Firefox/37.0")

    val headers_0 = Map("Accept" -> "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")

    val headers_2 = Map("Accept" -> "*/*")

    val headers_4 = Map(
        "Accept" -> "application/json, text/plain, */*",
        "X-XSRF-TOKEN" -> "t56ufTNRqOAPaE51Z+AaqvvIZMQKbi5z4+bOrmVlVI0=")

    val uri1 = "google.com"
    val uri2 = "js-agent.newrelic.com"
    val uri3 = "ktmt.github.io"
    val uri4 = "http://www.google-analytics.com"
    val uri5 = "bam.nr-data.net"
    val uri6 = "http://kipalog.com"
    val uri7 = "ruby.org.vn"

    val scn = scenario("RecordedSimulation")
        .exec(http("request_0")
            .get("/")
            .headers(headers_0)
            .resources(http("request_1")
            .get(uri6 + "/")
            .headers(headers_0),
            http("request_2")
            .get(uri4 + "/analytics.js")
            .headers(headers_2)
            .check(status.is(304)),
            http("request_3")
            .get(uri4 + "/r/collect?v=1&_v=j37&a=1117594451&t=pageview&_s=1&dl=http%3A%2F%2Fkipalog.com%2Fposts&dr=http%3A%2F%2Fwww.google.co.jp%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3D%26esrc%3Ds%26source%3Dweb%26cd%3D1%26ved%3D0CB0QFjAAahUKEwjr0IvpvtrGAhWmLKYKHdkVAMo%26url%3Dhttp%253A%252F%252Fkipalog.com%252F%26ei%3D0u6kVeufHKbZmAXZq4DQDA%26usg%3DAFQjCNHNWTXwkfkeUuWoub-_x5JkQtSJ5A%26bvm%3Dbv.97653015%2Cd.dGo&ul=ja&de=UTF-8&dt=Kipalog&sd=24-bit&sr=1440x900&vp=1440x745&je=1&_u=AACAAEABI~&jid=1940449042&cid=521737232.1436853580&tid=UA-53121223-2&_r=1&z=1907358178"),
            http("request_4")
            .get(uri6 + "/posts/pagination?filter=top&page=1")
            .headers(headers_4),
            http("request_5")
            .get("http://" + uri3 + "/images/logo.jpg")
            .check(status.is(304)),
            http("request_6")
            .get("http://" + uri7 + "/images/ruby-vietnam-logo.png?1418271887"),
            http("request_7")
            .get("http://" + uri2 + "/nr-632.min.js")
            .headers(headers_2)
            .check(status.is(304)),
            http("request_8")
            .get("http://" + uri5 + "/1/d5ddd9fcfb?a=4188188&pl=1436872404158&v=632.2b17625&to=dVoKEBQKXV0AFhoRCkVBF0sPC1VUHQ%3D%3D&ap=1869&be=2431&fe=1255&dc=94&f=%5B%5D&perf=%7B%22timing%22:%7B%22of%22:1436872404158,%22n%22:0,%22dl%22:2422,%22di%22:2508,%22ds%22:2525,%22de%22:2632,%22dc%22:3685,%22l%22:3685,%22le%22:3686,%22r%22:0,%22re%22:283,%22f%22:283,%22dn%22:283,%22dne%22:283,%22c%22:283,%22ce%22:283,%22rq%22:284,%22rp%22:2421,%22rpe%22:2421%7D,%22navigation%22:%7B%22ty%22:255,%22rc%22:1%7D%7D&jsonp=NREUM.setToken")
            .headers(headers_2)))

    setUp(scn.inject(atOnceUsers(1))).protocols(httpProtocol)
}%

Bạn nhìn nội dung là có thể lờ mờ đoán được cách viết scenario cho gatling rồi nhỉ :D.

Run Scenario

Bước tiếp theo sẽ là, bạn sử dụng file scenario vừa tạo ở trên để chạy stress test. Cách chạy cũng rất đơn giản, bạn chỉ cần chạy file bash:

~/GATLING/bin/gatling.sh
Choose a simulation number:
     [0] RecordedSimulation
     [1] computerdatabase.BasicSimulation
     [2] computerdatabase.advanced.AdvancedSimulationStep01
     [3] computerdatabase.advanced.AdvancedSimulationStep02
     [4] computerdatabase.advanced.AdvancedSimulationStep03
     [5] computerdatabase.advanced.AdvancedSimulationStep04
     [6] computerdatabase.advanced.AdvancedSimulationStep05
//Bạn chọn 0

Sau đó chỉ cần enter cho đến khi script được chạy.
alt text

Kết quả chạy sẽ được report vào một file html nằm ở cuối cùng

Please open the following file: results/recordedsimulation-1436872870628/index.html

Mở file html ra bạn sẽ thấy một report rất chi tiết bao gồm: Số lượng request gửi, số lượng request thất bại, tỉ lệ

alt text

Kết luận

Với gatling các bạn có thể tạo stress test scenario vô cùng dễ dàng.
Hy vọng với gatling chúng ta có thể bỏ xó được anh bạn jmeter vừa cổ lỗ vừa khó dùng (phải viết scenario bằng xml orz ).
Trong phần tới mình sẽ viết chi tiết hơn về cách viết scenario file, cũng như các tuỳ chỉnh các thông số để có một scenario test hợp lý hơn.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

huydx

116 bài viết.
960 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
153 14
Introduction (Link) là một cuộc thi ở Nhật, và cũng chỉ có riêng ở Nhật. Đây là một cuộc thi khá đặc trưng bởi sự thú vị của cách thi của nó, những...
huydx viết gần 2 năm trước
153 14
White
126 15
Happy programmer là gì nhỉ, chắc ai đọc xong title của bài post này cũng không hiểu ý mình định nói đến là gì :D. Đầu tiên với cá nhân mình thì hap...
huydx viết hơn 3 năm trước
126 15
White
98 10
(Ảnh) Mở đầu Chắc nhiều bạn đã nghe đến khái niệm oauth. Về cơ bản thì oauth là một phương thức chứng thực, mà nhờ đó một web service hay một ap...
huydx viết 3 năm trước
98 10
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
116 bài viết.
960 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!