Tôi có máy chủ api Scotty tạo cấu hình truy vấn Elasticsearch, tìm nạp kết quả từ ES và hiển thị json.GHC cho mỗi chủ đề Chiến lược GC
So với các máy chủ khác như Phoenix và Gin, tôi nhận được sử dụng CPU cao và thông lượng phục vụ ES phản ứng bằng cách sử dụng BloodHound nhưng Gin và Phoenix là độ lớn hơn Scotty hiệu quả bộ nhớ.
Thống kê cho Scotty
wrk -t30 -c100 -d30s "http://localhost:3000/filters?apid=1&hfa=true"
Running 30s test @ http://localhost:3000/filters?apid=1&hfa=true
30 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 192.04ms 305.45ms 1.95s 83.06%
Req/Sec 133.42 118.21 1.37k 75.54%
68669 requests in 30.10s, 19.97MB read
Requests/sec: 2281.51
Transfer/sec: 679.28KB
Những số liệu thống kê được trên máy Mac của tôi có GHC 7.10.1 cài đặt
thông tin Processor 2.5GHx i5
Memory info 8GB 1600Mhz DDR3
tôi khá ấn tượng bởi sự đồng thời dựa trên chủ đề nhẹ của GHC nhưng hiệu quả bộ nhớ vẫn là một mối quan tâm lớn.
Profiling sử dụng bộ nhớ mang lại cho tôi những số liệu thống kê sau
39,222,354,072 bytes allocated in the heap
277,239,312 bytes copied during GC
522,218,848 bytes maximum residency (14 sample(s))
761,408 bytes maximum slop
1124 MB total memory in use (0 MB lost due to fragmentation)
Tot time (elapsed) Avg pause Max pause
Gen 0 373 colls, 373 par 2.802s 0.978s 0.0026s 0.0150s
Gen 1 14 colls, 13 par 0.534s 0.166s 0.0119s 0.0253s
Parallel GC work balance: 42.38% (serial 0%, perfect 100%)
TASKS: 18 (1 bound, 17 peak workers (17 total), using -N4)
SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)
INIT time 0.001s ( 0.008s elapsed)
MUT time 31.425s (36.161s elapsed)
GC time 3.337s ( 1.144s elapsed)
EXIT time 0.000s ( 0.001s elapsed)
Total time 34.765s (37.314s elapsed)
Alloc rate 1,248,117,604 bytes per MUT second
Productivity 90.4% of total user, 84.2% of total elapsed
gc_alloc_block_sync: 27215
whitehole_spin: 0
gen[0].sync: 8919
gen[1].sync: 30902
Phoenix không bao giờ mất hơn 150 MB, trong khi Gin mất trí nhớ thấp hơn nhiều.
Tôi tin rằng GHC sử dụng chiến lược đánh dấu và quét cho GC. Tôi cũng tin rằng nó sẽ được tốt hơn để sử dụng cho mỗi chiến lược GC gia tăng thread giống như Erlang VM cho hiệu quả bộ nhớ tốt hơn.
Và bằng cách giải thích câu trả lời của Don Stewart thành related question, phải có một số cách để thay đổi chiến lược GC trong GHC.
Tôi cũng lưu ý rằng việc sử dụng bộ nhớ vẫn ổn định và khá thấp khi mức độ tương tranh thấp, vì vậy tôi nghĩ việc sử dụng bộ nhớ chỉ tăng lên khi đồng thời là khá cao.
Bất kỳ ý tưởng/con trỏ nào để giải quyết vấn đề này.
Câu hỏi * thực tế của bạn * là gì? Làm cách nào để giảm mức sử dụng bộ nhớ? – MathematicalOrchid
Rộng rãi có. Cụ thể hơn nếu tôi có thể tìm cách kích hoạt chiến lược GC cho mỗi luồng trong GHC. – user2512324
Tôi đã ấn tượng rằng các phiên bản gần đây của GHC * đã * thực hiện GC trên mỗi luồng, nhưng tôi có thể sai về điều đó ... – MathematicalOrchid