Test tải với Gatling

Làm thế nào để kiểm tra test tải đơn giản cho con server của mình?

Bài viết này sẽ giới thiệu sử dụng công cụ Gatling.

Gatling là gì?

Gatling là một công cụ kiểm tra hiệu suất mã nguồn mở. Nó là một framework dựa trên Scala, Akka và Netty. Đây là một công cụ cho hiệu suất cao và ghi lại các báo cáo thông qua trang html với giao diện thân thiện dễ nhìn. Về script thì dễ bảo trì và tùy chỉnh. Với giao thức HTTP thì Gatling hỗ trợ khá mạnh. Bện cạnh đó còn hỗ trợ những giao thức khác.

Bốn bước cơ bản trong Gatling để hoàn thành test tải:

  • Record: Đây là bước ghi lại các hoạt động của trình duyệt. Gatling có thể record tự động từ bất kì trình duyệt và bất kì hoạt động nào thậm chí cả thời gian chờ.
  • Edit: Kịch bản được record ở bước trên có thể chỉnh sửa lại theo ý muốn. Việc chỉnh sửa dễ dàng vì code dễ đọc và thân thiện.
  • Launch: Nó có thể được khởi chạy thông qua windows command prompt hay Linux terminal. Bên cạnh đó, nó cũng có thể chạy qua Maven build hay Jenkins.
  • Analyze: Gatling cung cấp report rõ ràng, đầy đủ, dễ nhìn và được định dạng bằng HTML. Trang report có thể phóng to hay thu nhỏ.

Thực hiện cài đặt trên Linux

OS
# cat /etc/redhat-release
CentOS release 6.9 (Final)
Install Java
# wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u60-b27/jre-8u60-linux-x64.rpm"
# yum localinstall jre-8u60-linux-x64.rpm
# wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u60-b27/jdk-8u60-linux-x64.rpm"
# yum localinstall jdk-8u60-linux-x64.rpm
Download Nginx
# wget https://repo1.maven.org/maven2/io/gatling/highcharts/gatling-charts-highcharts-bundle/2.2.4/gatling-charts-highcharts-bundle-2.2.4-bundle.zip
# unzip gatling-charts-highcharts-bundle-2.2.4-bundle.zip
Cấu trúc thư mục
gatling-charts-highcharts-bundle-2.2.4
├── bin
│   └── gatling.sh			<- hỗ trợ thực thi các file scala
│   └── recorder.sh			<- hỗ trợ recorder lại thao tác từ trình duyệt
├── conf					<- chứa các files config được đọc từ files scala
│   └── gatling.conf		
│   └── api.conf
│   └── ...
├── lib						<- thư viện java
├── results					<- chứa report sau khi thực hiện test tải
├── target					<- chứa các class được biên dịch
└── user-files				
   └── simulations			<- files scala sẽ chứa script thực hiện test
	   └── computerdatabase
			├── advanced
			│   ├── AdvancedSimulationStep01.scala
			│   ├── AdvancedSimulationStep02.scala
			│   ├── AdvancedSimulationStep03.scala
			│   ├── AdvancedSimulationStep04.scala
			│   └── AdvancedSimulationStep05.scala
			└── BasicSimulation.scala
Viết file test đơn giản
# cd conf/
# touch my_app.conf

vi my_app.conf

Định nghĩa một vài biến trong my_app.conf
# cat my_app.conf
url:"http://192.168.50.1"
qps:1
during:1
Tạo file test trong simulations
# cd user-files/simulations/
# touch TestSimulation.scala

vi TestSimulation.scala

Nội dung file TestSimulation.scala
import scala.concurrent.duration._
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.jdbc.Predef._
import com.typesafe.config._

class TestSimulation extends Simulation {
try {
val conf = ConfigFactory.load("my_app.conf")

val url = conf.getString("url")
var qps = conf.getInt("qps")
var during = conf.getInt("during")

val httpProtocol = http
  .baseURL(url)
  .acceptHeader("text/html,application/xhtml+xml,application/xml,application/json;q=0.9,*/*;q=0.8")
  .acceptEncodingHeader("gzip, deflate")
  .acceptLanguageHeader("en-US")
  .userAgentHeader("Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko")

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

val testParamScn = scenario("TestSimulation")
	.exec(http("Query with param")
		.get("/index.php?r=site/country&amp;area_id=123")
		.headers(headers_0)
		.header("Content-Type", "application/json")
		.check(status.is(200)))
setUp(
  testParamScn.inject(constantUsersPerSec(qps) during (during)).protocols(httpProtocol))

} catch {
case e: Exception =>
e.printStackTrace()
sys.exit(1)
}
}

Run Gatling
# pwd
/PATH/TO/gatling-charts-highcharts-bundle-2.2.4-bundle

# bin/gatling.sh
GATLING_HOME is set to /PATH/TO/gatling-charts-highcharts-bundle-2.2.4-bundle
Choose a simulation number:
     [0] TestSimulation
     [1] computerdatabase.BasicSimulation
     [2] computerdatabase.advanced.AdvancedSimulationStep01
     [3] computerdatabase.advanced.AdvancedSimulationStep02
     [4] computerdatabase.advanced.AdvancedSimulationStep03
     [5] computerdatabase.advanced.AdvancedSimulationStep04
     [6] computerdatabase.advanced.AdvancedSimulationStep05
0
Select simulation id (default is 'testsimulation'). Accepted characters are a-z, A-Z, 0-9, - and _

Select run description (optional)

Simulation TestSimulation started...

================================================================================
2016-01-30 01:56:38                                           5s elapsed
---- TestSimulation ------------------------------------------------------------
[###--                                                                     ]  4%
          waiting: 565    / active: 10     / done:25
---- Requests ------------------------------------------------------------------
> Global                                                   (OK=35     KO=0     )
> Query with param                                         (OK=35     KO=0     )
================================================================================

Simulation TestSimulation completed in 61 seconds
Parsing log file(s)...
Parsing log file(s) done
Generating reports...

================================================================================
---- Global Information --------------------------------------------------------
> request count                                        600 (OK=600    KO=0     )
> min response time                                      2 (OK=2      KO=-     )
> max response time                                     52 (OK=52     KO=-     )
> mean response time                                     3 (OK=3      KO=-     )
> std deviation                                          2 (OK=2      KO=-     )
> response time 50th percentile                          3 (OK=3      KO=-     )
> response time 75th percentile                          3 (OK=3      KO=-     )
> mean requests/sec                                9836.066 (OK=9836.066 KO=-     )
---- Response Time Distribution ------------------------------------------------
> t < 800 ms                                           600 (100%)
> 800 ms < t < 1200 ms                                   0 (  0%)
> t > 1200 ms                                            0 (  0%)
> failed                                                 0 (  0%)
================================================================================

Reports generated in 0s.
Please open the following file: /PATH/TO/gatling-charts-highcharts-bundle-2.2.4-bundle/results/testsimulation-1454086593318/index.html
Install Nginx

Cài đặt nginx để dễ dàng xem kết quả thông qua browser

# yum install epel-release
# yum install nginx
Tạo thư mục chứa kết quả trong thư mục root của nginx
# mkdir /usr/share/nginx/html/gatling
Cấu hình nginx
# vi /etc/nginx/nginx.conf
http {
    ...
    autoindex on;   <-- ADD LINE
    ...
}
Start nginx
# service nginx restart
Xem kết quả trên browser

http://x.x.x.x/gatling/

Tham khảo

http://gatling.io/#/docs