Có 1 bạn hỏi mình vấn đề liên quan đến Throughput Controller nên mình có dịp ngồi đọc code của nó, tìm hiểu về công thức nên mình viết bài này để note lại kiến thức cho các bạn muốn tìm hiểu sâu. Đây là link document của JMeter để các bạn tiện reference.
Một vài điểm lưu ý:
- Mặc dù nó tên là Throughput nhưng nó ko liên quan gì đến throughput (cái mà chúng ta nhìn thấy trong report)
- Nó kiểm soát số lần thread đi qua các request nằm bên trong nó bằng 2 cách:
- Số lượng chính xác
- Số phần trăm (%)
Nội dung bài viết
I. Quản lý số lượng request chính xác
Giả sử bạn có 1 scenario, bạn muốn:
Homepage : 1 request Get List Product : 3 request Production Detail: 5 request
Bạn sẽ tạo test plan như sau:
- Homepage
- Based on: Total Executions
- Throughput: 1
- Get List Product
- Based on: Total Executions
- Throughput: 3
- Production Detail
- Based on: Total Executions
- Throughput: 5
Câu hỏi đặt ra là bạn sẽ setting cái Thread Group như thế nào? Bạn có thể sẽ setting như sau:
- Threads = 1
- Loop = 9 (vì 1 + 3 + 5 = 9)
Setting như trên không sai, nhưng thực ra chỉ cần số loop = 5
là đã đủ tạo ra được số request cần thiết. Hoặc là Threads=5, loop=1
Vì sao lại như vậy?
Vì mỗi lần run, JMeter sẽ ưu tiên run từ trên xuống dưới và nó đếm số lần run cho mỗi Throughput Controller.
Lần run đầu tiên (index=0)
Homepage: run --> số execution = 1 (đã đủ) Get List Product: run --> số execution = 1 (chưa đủ) Production Detail: run --> số execution = 1 (chưa đủ)
Lần run thứ 2 (index=1)
Get List Product: run --> số execution = 2 (chưa đủ) Production Detail: run --> số execution = 2 (chưa đủ)
Lần run thứ 3 (index=2)
Get List Product: run --> số execution = 3 (đã đủ) Production Detail: run --> số execution = 3 (chưa đủ)
Lần run thứ 4 (index=3)
Production Detail: run --> số execution = 4 (chưa đủ)
Lần run thứ 5 (index=4)
Production Detail: run --> số execution = 5 (đã đủ)
Sau lần run thứ 5 thì JMeter đã run đủ số request bạn cần, nếu bạn setting số loop nhiều hơn số request thì nó chỉ lãng phí thời gian chạy code của JMeter chứ ko có tác dụng gì. Tuy nhiên số thời gian nó lãng phí cũng rất ít, không đáng kể, nên bạn cũng đừng quá lo lắng.
II. Quản lý số lượng run bằng phần trăm (%)
Config của Throughput Controller như sau:
- Homepage
- Based on: Percent Executions
- Throughput: 10%
- Get List Product
- Based on: Percent Executions
- Throughput: 30%
- Production Detail
- Based on: Percent Executions
- Throughput: 50%
Giả sử mình setting Thread Group như sau: Threads=1, loop=9
, theo logic thông thường, chúng ta sẽ tính toán số lượng request như sau:
Homepage : 10% x 9 = 0.9 request (có làm tròn lên 1 ko?) Get List Product : 30% x 9 = 2.7 request (làm tròn thành 2 hay 3?) Production Detail: 50% x 9 = 4.5 request (làm tròn thành 4 hay 5?)
Đây là kết quả thực tế khi run:
Homepage : 1 request (0.9 --> làm tròn lên 1) Get List Product : 3 request (2.7 --> làm tròn lên 3) Production Detail: 4 request (4.5 --> làm tròn xuống 4)
Vì sao lại như vậy?
Ở kiểu phần trăm này, JMeter sẽ quyết định việc có run request nào dựa trên 1 công thức như sau:
(100.0 * executions + 50.0) / (iterations + 1) < percent;
Trong đó:
executions
là số lần đã run của Throughput Controller (value= 0)iterations
là thứ tự vòng loop ở thời điểm hiện tại (value= 0)percent
là số % mình đã điền ở phía trên
Áp dụng công thức trên cho thằng Production Detail
ta sẽ thấy như sau:
Nó sẽ run 4 lần, áp dụng công thức này cho Homepage
và Get List Product
bạn cũng sẽ ra được kết quả tương tự. Và đây là kết quả thực tế sau khi run JMeter.
Mình có add thêm số loop bên cạnh để bạn tiện theo dõi Production Detail ${__jm__Thread Group__idx}
. Lưu ý, số loop bằng đầu từ 0, nên trên hình bạn sẽ nhìn thấy Production Detail 1,3,5,7
chính là số loop 2,4,6,8
ở hình giải thích phía trên.
Nếu bạn thắc mắc muốn biết công thức trên mình lấy ở đâu thì mình lấy ở trong code của JMeter.
org.apache.jmeter.control.ThroughputController
III. Tổng kết
Đây là 1 cái controller tưởng là đơn giản nhưng có vẻ nó không đơn giản như logic thông thường mà chúng ta vẫn nghĩ, hi vọng là bạn đã hiểu và nắm vững để áp dụng vào performance test của bạn. Like nếu bạn thấy nó hữu ích hoặc bạn like dạo cũng được vì nó giúp mình thấy vui. haha
Cảm ơn anh