Lewati ke isi

Penerapan dan Pemeliharaan / Benchmark Kinerja

Dokumen ini terutama menjelaskan cara melakukan benchmark kinerja pada DataFlux Func.

1. Pendahuluan

Semua hasil contoh dalam dokumen ini diperoleh dari pengujian pada lingkungan perangkat keras berikut:

Keterangan
Komputer HP ProBook Laptop
CPU AMD Ryzen 5 7530U with Radeon Graphics / 4.5 GHz
Memori 32 GB / 3200 MHz (0.3 ns)
Sistem Operasi Ubuntu 22.04.5 LTS

2. Paket Pengujian Benchmark

Unduh Benchmark.zip, lalu impor ke DataFlux Func.

Paket pengujian Benchmark berisi konten berikut:

Konten Keterangan
Kumpulan Skrip benchmark
Fungsi benchmark__main.hello_world Fungsi kosong yang langsung mengembalikan "ok", digunakan untuk pengujian konkurensi
Fungsi benchmark__main.json_dump Melakukan serialisasi / deserialisasi JSON, digunakan untuk pengujian kinerja
Fungsi benchmark__main.calc_pi Menghitung nilai pi, digunakan untuk pengujian kinerja
API Sinkron benchmark-hello-world Digunakan untuk pengujian konkurensi
Tugas Terjadwal benchmark-hello-world Digunakan untuk menguji kinerja penjadwalan tugas
Tugas Terjadwal benchmark-compute-pi Digunakan untuk menguji kinerja komputasi (menghitung nilai pi)
Tugas Terjadwal benchmark-json-dump-and-load Digunakan untuk menguji kinerja komputasi (serialisasi / deserialisasi JSON)

3. Menjalankan Pengujian

Setelah mengimpor paket pengujian Benchmark, karena Tugas Terjadwal berjalan otomatis, tunggu beberapa menit, lalu hasilnya dapat dilihat dari catatan tugas.

Sedangkan pengujian kinerja konkurensi pada DataFlux Func perlu dilakukan dengan bantuan alat lain.

3.1 Menguji Kinerja Penjadwalan Tugas

Setelah mengimpor paket pengujian Benchmark, tunggu beberapa menit, lalu hasil dapat dilihat pada catatan tugas "Hello, World" di "Tugas Terjadwal".

Umumnya, durasi setiap tugas seharusnya tidak lebih dari 10 milidetik.

cron-job-hello-world.png

3.2 Menguji Kinerja Komputasi

Setelah mengimpor paket pengujian Benchmark, tunggu beberapa menit, lalu hasil dapat dilihat pada catatan tugas "Compute pi" dan "JSON dump and load" di "Tugas Terjadwal".

Berdasarkan lingkungan pengujian pada bagian "Pendahuluan", setiap tugas memakan waktu sekitar 1 detik:

  • Menghitung nilai pi ("Compute pi")

cron-job-compute-pi.png

  • Serialisasi / deserialisasi JSON ("JSON dump and load")

cron-job-json-dump-and-load.png

3.3 Menguji Kinerja Konkurensi API Fungsi

Saat menguji kinerja konkurensi, Anda dapat menggunakan alat ab (ApacheBench) untuk melakukan pengujian.

Jika ab belum diinstal, Anda dapat menginstalnya dengan perintah berikut:

Bash
1
apt-get install apache2-utils
Bash
1
yum install httpd-tools

Gunakan ab untuk menguji pemanggilan "Hello, World" dalam paket pengujian, perintahnya sebagai berikut:

Bash
1
ab -c 10 -n 5000 -k http://localhost:8088/api/v1/sync/benchmark-hello-world
Bash
1
ab -c 10 -n 5000 -k http://{DataFlux Func IP atau domain}:8088/api/v1/sync/benchmark-hello-world

Berdasarkan lingkungan pengujian pada bagian "Pendahuluan", konkurensi fungsi kosong sekitar 1000 (Requests per second):

Keluaran pengujian ab
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# ab -c 10 -n 5000 -k http://localhost:8088/api/v1/sync/benchmark-hello-world
This is ApacheBench, Version 2.3 <$Revision: 1879490 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 500 requests
Completed 1000 requests
...
Completed 5000 requests
Finished 5000 requests


Server Software:
Server Hostname:        localhost
Server Port:            8088

Document Path:          /api/v1/sync/benchmark-hello-world
Document Length:        13 bytes

Concurrency Level:      10
Time taken for tests:   4.694 seconds
Complete requests:      5000
Failed requests:        0
Keep-Alive requests:    5000
Total transferred:      3045525 bytes
HTML transferred:       65000 bytes
Requests per second:    1065.17 [#/sec] (mean)
Time per request:       9.388 [ms] (mean)
Time per request:       0.939 [ms] (mean, across all concurrent requests)
Transfer rate:          633.60 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       1
Processing:     5    9   1.8      9      29
Waiting:        4    9   1.8      9      29
Total:          5    9   1.8      9      29

Percentage of the requests served within a certain time (ms)
  50%      9
  66%     10
  75%     10
  80%     10
  90%     12
  95%     13
  98%     14
  99%     15
  100%     29 (longest request)

4. Penyebab yang Mempengaruhi Kinerja

Karena isi eksekusi aktual tugas ditentukan oleh Skrip yang benar-benar dipanggil, jika eksekusi tugas memakan waktu lama, Anda dapat memeriksa apakah kode memiliki masalah berikut:

4.1 Banyak print(...)

Untuk memudahkan debugging, seseorang mungkin langsung mengeluarkan semua data dalam DB dan data yang dikembalikan oleh API melalui print(...) dalam Skrip.

Karena DataFlux Func secara otomatis mencatat konten print(...) saat tugas dieksekusi, operasi semacam ini akan menyebabkan penurunan kinerja yang sangat besar.

Disarankan untuk hanya mempertahankan output print(...) yang diperlukan setelah kode digunakan di produksi, dan hindari output teks dalam jumlah besar.

4.2 Respons Sistem Eksternal Lambat

Ketika melakukan kueri ke database eksternal, memanggil antarmuka API (termasuk menjalankan kueri DQL, dll.) dalam Skrip, jika terjadi kemacetan jaringan, atau bahkan hanya karena sistem pihak lain merespons lambat, hal ini juga akan menyebabkan tugas memakan waktu lama untuk dieksekusi.

Hal ini pada dasarnya tidak ada hubungannya dengan DataFlux Func; Anda sebaiknya menghubungi penanggung jawab sistem eksternal tersebut untuk meningkatkan kecepatan respons.

Berikut adalah contoh kode sederhana untuk menguji waktu pemrosesan:

Python
1
2
3
4
5
6
7
import time
import requests

def test():
    t1 = time.time()
    requests.get('http://github.com')
    print(f'Cost: {time.time() -  t1} s')