J'ai remarqué une comparaison pas très positive de Java vs GO. Test par un grand nombre d'utilisateurs .
J'ai décidé de vérifier si tout est si rose avec Go.
Pour l'avenir, je dirai que lors de la mise en cache en mémoire et de la création JSON à la volée, j'ai réussi à obtenir jusqu'à 120 000 [# / sec] sur 8 cœurs physiques.
Script de requĂŞte GET de base:
- Si les données se trouvent dans le cache en mémoire et qu'elles sont valides, nous formons JSON à partir de la structure
- S'il n'y a pas de données dans le cache, alors nous les recherchons dans Bolt DB, si nous les trouvons, alors nous lisons le JSON fini
- S'il n'y a pas de données dans Bolt DB, nous les demandons à la base de données, les enregistrons dans le cache en mémoire
- Les données dans le cache en mémoire sont accumulées dans le canal tampon, après l'accumulation d'environ 10 000 éléments, elles sont réinitialisées par une seule sauvegarde dans Bolt DB
- Si les données de la base de données ont changé (mise à jour / insertion), une notification est envoyée via pg_notify et les données dans le cache sont marquées comme invalides; la prochaine fois qu'elles seront accédées, elles seront relues à partir de la base de données
Sous les résultats des tests de coupe, et le code du banc d'essai GitHub
Mise Ă jour 05/06/2020
Il y avait une chance de tester dans le cloud Oracle .
![get_db_memory_json1](https://habrastorage.org/getpro/habr/post_images/c19/9a3/571/c199a35717d719c1f3bbd729cc4583d4.png)
- le support est assemblé sur 3 serveurs - Intel 8 cœurs (16 cœurs virtuels), 120 mémoires (Go), 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 ( )
GET PostgreSQL — SSD ( )
GET BOLT DB — HDD (JSON BOLT DB)
GET BOLT DB — SSD (JSON BOLT DB)
GET
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 )
![banc d'essai](https://habrastorage.org/getpro/habr/post_images/5b9/840/4cb/5b98404cbbb595fc4a79e83d1c613ea3.png)
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](https://habrastorage.org/getpro/habr/post_images/c19/9a3/571/c199a35717d719c1f3bbd729cc4583d4.png)
Time per req. [ms] Concurrency ( ).
![get_db_memory_json1](https://habrastorage.org/getpro/habr/post_images/d51/593/d22/d51593d225698827addeb4df4bc732a6.png)
99% percentile [ms] Concurrency.
![get_db_memory_json1](https://habrastorage.org/getpro/habr/post_images/788/791/d6b/788791d6bfee4cea28ff0a3c78a3b780.png)
99% percentile [ms] Concurrency ( ).
![get_db_memory_json1](https://habrastorage.org/getpro/habr/post_images/e0e/11a/3c5/e0e11a3c57b5492f102156574f4b94ca.png)
backend 100 000 [#/sec] BBolt (oncurrency 128).
1600% , 1464%.
/ NVMe 0,02 [ms] (500 000 IOPS).
![get_db_memory_json1](https://habrastorage.org/getpro/habr/post_images/54e/48b/9fd/54e48b9fd96200a80277701a80207e9a.png)
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](https://habrastorage.org/getpro/habr/post_images/92d/3d9/59c/92d3d959c7148c6878afcdf092b410f0.png)
readRequest, finishRequest backgroundRead (39.66%), IO Windows — internalpoll.(ioSrv).ExecIO — (24.78%).
Voyons ce que notre principal gestionnaire net / http. (* ServeMux) .ServeHTTP a fait:
- Analyse d'URL et traitement des paramètres - github.com/gorilla/mux.(*Route).Match - (2,29%)
- Génération de JSON à partir d'une structure en mémoire - github.com/francoispqt/gojay.marshal - (9,92%)
- Travailler avec le cache en mémoire - (4,53%)
![img](https://habrastorage.org/getpro/habr/post_images/93a/e50/cad/93ae50cad147c62231e182e4d8b26cb8.png)