UPD. اختبار REST API على Golang. 120 000 [# / ثانية] ليس الحد؟

لاحظت مقارنة غير إيجابية للغاية بين Java و GO. الاختبار من قبل عدد كبير من المستخدمين .


قررت أن أتحقق مما إذا كان كل شيء وردية للغاية مع Go.
في المستقبل ، سأقول أنه عند التخزين المؤقت في الذاكرة وإنشاء JSON بسرعة ، تمكنت من الحصول على ما يصل إلى 120،000 [# / ثانية] على 8 نوى مادية.


البرنامج النصي لطلب GET الأساسي:


  • إذا تم العثور على البيانات في ذاكرة التخزين المؤقت وكانت صالحة ، فإننا نشكل JSON من البنية
  • إذا لم تكن هناك بيانات في ذاكرة التخزين المؤقت ، فإننا نبحث عنها في Bolt DB ، إذا وجدناها ، فإننا نقرأ JSON النهائي
  • إذا لم تكن هناك بيانات في Bolt DB ، فإننا نطلبها من قاعدة البيانات ، احفظها في ذاكرة التخزين المؤقت في الذاكرة
  • يتم تخزين البيانات الموجودة في ذاكرة التخزين المؤقت في الذاكرة في القناة العازلة ، بعد تراكم حوالي 10000 عنصر ، يتم التخلص منها على أنها حفظ واحد في Bolt DB
  • إذا تم تغيير البيانات في قاعدة البيانات (تحديث / إدراج) ، فسيتم إرسال إشعار من خلال pg_notify ويتم وضع علامة على البيانات الموجودة في ذاكرة التخزين المؤقت على أنها غير صالحة ، في المرة التالية التي تتم قراءتها ، تتم قراءتها مرة أخرى من قاعدة البيانات

تحت نتائج اختبار القطع ، ورمز منضدة الاختبار GitHub


تحديث 05/06/2020


كانت هناك فرصة للاختبار في سحابة Oracle .
get_db_memory_json1


  • يتم تجميع الحامل على 3 خوادم - 8 Core Intel (16 core core) ، 120 Memory (GB) ، Oracle Linux 7.7
  • NVMe — 6.4 TB NVMe SSD Storage min 250k IOPS (4k block)
  • — 8.2 Network Bandwidth (Gbps)
  • PostgreSQL — 16 000 [get/sec], oncurrency 1024, 60 [ms]. Get 360 000 000 . JSON 1800 .
  • — 100 000 — 120 000 [get/sec], oncurrency 1024, 2 [ms].
  • PostgreSQL — 10 000 [insert/sec].
  • 2 4 8 Core, .


  • JSON Bolt DB 2 HDD, SSD
  • PostgreSQL HDD SDD 100
  • Bolt DB SDD HDD 100
  • JSON " " 10 PostgreSQL SDD
  • — Failed requests Concurrency 16 384


,
GitHub. 4000 , .


, JSON encoder/decode — JSON 2 .


HTTP Get handler JSON


BenchmarkHandler_DeptGetHandler-2         1000000          41277 ns/op     4845.26 MB/s        10941 B/op          259 allocs/op

HTTP Get handler francoispqt/gojay


BenchmarkHandler_DeptGetHandler-2         1000000          13300 ns/op     15036.97 MB/s         3265 B/op           11 allocs/op

:


  • PostgreSQL 11 Windows 10, — 30 .
  • — 10 000 000 , 100 000 000 .
  • JSON 1500 , 1 10 .
  • — core i7-3770 — 4 core (8 thread), 16 , HDD (WD 2.0TB WD2000fyyz), SSD (Intel 530 Series).
  • ApacheBench, concurrency level 1 4096, 1 000 000 .
  • Windows, .
  • RAID . .

:



Concurrency Level , ApacheBench " ".


GET PostgreSQL — HDD ( )


Concurrency LevelRequests per secondTime per req.99% percentile
136.84 [#/sec] (mean)27.145 [ms] (mean)116 [ms]
238.27 [#/sec] (mean)52.262 [ms] (mean)165 [ms]
441.34 [#/sec] (mean)96.755 [ms] (mean)268 [ms]
845.02 [#/sec] (mean)177.687 [ms] (mean)420 [ms]
1647.56 [#/sec] (mean)336.428 [ms] (mean)813 [ms]
12849.19 [#/sec] (mean)2602.228 [ms] (mean)13055 [ms]
51250.5 [#/sec] (mean)10122.343 [ms] (mean)19394 [ms]
204851.91 [#/sec] (mean)39453.681 [ms] (mean)57018 [ms]

GET PostgreSQL — SSD ( )


Concurrency LevelRequests per secondTime per req.99% percentile
1713.82 [#/sec] (mean)1.401 [ms] (mean)2 [ms]
21914.61 [#/sec] (mean)1.045 [ms] (mean)2 [ms]
43326.52 [#/sec] (mean)1.202 [ms] (mean)2 [ms]
84599.95 [#/sec] (mean)1.739 [ms] (mean)4 [ms]
164599.80 [#/sec] (mean)3.478 [ms] (mean)9 [ms]
1285243.76 [#/sec] (mean)24.410 [ms] (mean)102 [ms]
5125354.35 [#/sec] (mean)95.623 [ms] (mean)506 [ms]
20485285.83 [#/sec] (mean)387.451 [ms] (mean)2871 [ms]

GET BOLT DB — HDD (JSON BOLT DB)


Concurrency LevelRequests per secondTime per req.99% percentile
181.55 [#/sec] (mean)12.262 [ms] (mean)38 [ms]
267.04 [#/sec] (mean)29.832 [ms] (mean)97 [ms]
472.51 [#/sec] (mean)55.167 [ms] (mean)183 [ms]
892.48 [#/sec] (mean)86.502 [ms] (mean)291 [ms]
1689.42 [#/sec] (mean)178.923 [ms] (mean)550 [ms]
12886.76 [#/sec] (mean)1475.378 [ms] (mean)11280 [ms]
51292.38 [#/sec] (mean)2771.145 [ms] (mean)10238 [ms]
2048100.56 [#/sec] (mean)20366.847 [ms] (mean)18632 [ms]
4096106.98 [#/sec] (mean)38289.063 [ms] (mean)37074[ms]

GET BOLT DB — SSD (JSON BOLT DB)


Concurrency LevelRequests per secondTime per req.99% percentile
13411.07 [#/sec] (mean)0.293 [ms] (mean)1 [ms]
27468.21 [#/sec] (mean)0.268 [ms] (mean)1 [ms]
49501.15 [#/sec] (mean)0.421 [ms] (mean)2 [ms]
810481.68 [#/sec] (mean)0.763 [ms] (mean)3 [ms]
1610052.14 [#/sec] (mean)1.592 [ms] (mean)5 [ms]
12810754.02 [#/sec] (mean)11.903 [ms] (mean)20 [ms]
51211030.61 [#/sec] (mean)46.416 [ms] (mean)66 [ms]
204810634.72 [#/sec] (mean)192.577 [ms] (mean)362 [ms]
409610659.04 [#/sec] (mean)384.275 [ms] (mean)720 [ms]

GET


Concurrency LevelRequests per secondTime per req.99% percentile
19178.22 [#/sec] (mean)0.109 [ms] (mean)1 [ms]
222580.40 [#/sec] (mean)0.089 [ms] (mean)1 [ms]
436163.33 [#/sec] (mean)0.111 [ms] (mean)1 [ms]
856109.17 [#/sec] (mean)0.143 [ms] (mean)1 [ms]
1643942.75 [#/sec] (mean)0.364 [ms] (mean)2 [ms]
12855005.53 [#/sec] (mean)2.327 [ms] (mean)6 [ms]
51235338.01 [#/sec] (mean)14.489 [ms] (mean)25 [ms]
204838090.35 [#/sec] (mean)53.767 [ms] (mean)228 [ms]
409630196.47 [#/sec] (mean)135.645 [ms] (mean)609 [ms]

Oracle



Oracle 3- :


  • VM.DenseIO2.8 — 8 Core Intel (16 virtual core), 120 Memory (GB), Oracle Linux 7.7
  • NVMe — 6.4 TB NVMe SSD Storage (1 drives) min 250k IOPS (4k block)
  • — 8.2 Network Bandwidth (Gbps)
  • — PostgreSQL 12. .
  • ApacheBench:
    • concurrency level 4 16384
    • 10 000 1 000 000 .
    • 2 8 ApacheBench ( ab 1 )

اختبار موقف


GET


  • JSON — 1800 . Dept 10 Emp.
  • Dept — 33 000 000, Emp — 330 000 000 .

:


  • GET PostgreSQL
  • GET JSON BBolt ( 74 )
  • GET ( map)

.


Requests per second Concurrency.


get_db_memory_json1


Time per req. [ms] Concurrency ( ).


get_db_memory_json1


99% percentile [ms] Concurrency.


get_db_memory_json1


99% percentile [ms] Concurrency ( ).


get_db_memory_json1


backend 100 000 [#/sec] BBolt (oncurrency 128).
1600% , 1464%.
/ NVMe 0,02 [ms] (500 000 IOPS).


get_db_memory_json1



Benchmark, HTTP Get handler 13300 ns


BenchmarkHandler_DeptGetHandler-2         1000000          13300 ns/op     15036.97 MB/s         3265 B/op           11 allocs/op

ApacheBench, mean — 0.088 ms.
0.088 — 0.013 = 0.055 ms.


:


  • net/http.(*conn).serve — (61.85%)
  • net/http.(*connReader).backgroundRead — (7.04%)
  • runtime.gcBgMarkWorker — (18.30%)

HTTP server (61.85%):


  • — net/http.(*conn).readRequest — (9.29%). .
  • — net/http.(*response).finishRequest — (21.74%). .
  • — net/http.(*ServeMux).ServeHTTP — (23.33%).

img


readRequest, finishRequest backgroundRead (39.66%), IO Windows — internalpoll.(ioSrv).ExecIO — (24.78%).


دعونا نرى ما فعله معالج net / http. (* ServeMux) .ServeHTTP:


  • تحليل عنوان URL ومعالجة المعلمات - github.com/gorilla/mux.(*Route).Match - (2.29٪)
  • توليد JSON من بنية في الذاكرة - github.com/francoispqt/gojay.marshal - (9.92٪)
  • العمل مع ذاكرة التخزين المؤقت في الذاكرة - (4.53٪)

img


All Articles