Giới hạn trên về số lượng kết nối HTTP đồng thời mà một máy chủ rất đơn giản được thực hiện trong Go có thể xử lý là gì?Số lượng tối đa lý thuyết của các kết nối HTTP đồng thời (đồng thời) trong máy chủ Go là gì?
10
A
Trả lời
11
Số lượng kết nối HTTP đồng thời bị giới hạn bởi bộ nhớ khả dụng và theo giới hạn của hệ điều hành.
Trong Linux, giới hạn hệ điều hành mềm - chẳng hạn như số lượng tệp mở tối đa - có thể được in ra và thay đổi bằng cách sử dụng ulimit
.
Về mặt bộ nhớ, mỗi kết nối HTTP trong máy chủ HTTP Go tối thiểu chạy trên 32 bit bit tiêu thụ 21 KiB bộ nhớ (mã nguồn của máy chủ này, có thể kết hợp với phiên bản Go 2013-03-23, là phía dưới). Trên Linux 64 bit, mức tiêu thụ bộ nhớ có thể cao hơn.
Trên hệ thống 32 bit có bộ nhớ 1GB có sẵn cho máy chủ, 21 KiB có nghĩa là có thể kết nối đồng thời 50.000 đồng thời. Điều này không không bao gồm bộ nhớ được nhân Linux sử dụng.
package main
import (
"flag"
"fmt"
"net/http"
"os"
"runtime"
"sync"
)
var isClient = flag.Bool("client", false, "Whether to start the HTTP server or the HTTP client")
var N = flag.Int("n", 1000, "Number of concurrent HTTP requests")
var wait = make(chan byte)
var counter = 0
var reachedN = make(chan byte)
func handler(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "some text")
counter++
if counter == *N {
reachedN <- 0
}
<-wait // Block this goroutine
}
func main() {
flag.Parse()
if *N <= 0 {
fmt.Fprintf(os.Stderr, "invalid number of goroutines")
os.Exit(1)
}
if *isClient {
// Initiate N http connections
var wg sync.WaitGroup
for i := 0; i < *N; i++ {
wg.Add(1)
go func(ii int) {
_, err := http.Get("http://127.0.0.1:12345")
if err != nil {
fmt.Fprintf(os.Stderr, "client %d: %s\n", ii, err)
os.Exit(1)
}
wg.Done()
}(i)
}
wg.Wait()
} else {
runtime.GOMAXPROCS(1) // No concurrency
// Read MemStats
var m0 runtime.MemStats
runtime.ReadMemStats(&m0)
go func() {
<-reachedN // Wait until there are *N concurrent requests
// Read MemStats
var m1 runtime.MemStats
runtime.ReadMemStats(&m1)
fmt.Printf("Number of HTTP connections: %d\n", *N)
fmt.Printf("Memory consumption per connection: %.2f bytes\n", float64(m1.Sys-m0.Sys)/float64(*N))
os.Exit(1)
}()
http.HandleFunc("/", handler)
err := http.ListenAndServe(":12345", nil)
if err != nil {
fmt.Fprintf(os.Stderr, "server: %s\n", err)
os.Exit(1)
}
}
}
Các vấn đề liên quan
- 1. Số lượng kết nối đồng thời tối đa trên một cổng (socket) của Máy chủ
- 2. Số lượng tối đa HttpWebRequests đồng thời
- 3. Số cổng mở đồng thời tối đa của Erlang?
- 4. Cách tìm số lượng kết nối SQL Server đồng thời
- 5. Giới hạn số lượng kết nối đồng thời trong Apache2
- 6. máy chủ đẩy cho hàng triệu kết nối đồng thời
- 7. Jenkins - số lượng công việc đồng thời tối đa
- 8. Kết nối đồng thời tối đa với MySQL
- 9. Tăng số lượng kết nối đồng thời trong tomcat 7
- 10. Số lượng tối đa của kết nối cho mỗi máy chủ với twisted.web.client.Agent
- 11. Nhiều kết nối mạng đồng thời - Máy chủ Telnet, Python
- 12. Số lượng kết nối đồng thời tối đa mà trình duyệt sẽ thực hiện là bao nhiêu?
- 13. Tạo số lượng chủ đề động đồng thời
- 14. Đồng thời và Đa luồng
- 15. "Hello World" của các chương trình đồng thời là gì?
- 16. Máy chủ QTcpS chậm với nhiều khách hàng đồng thời
- 17. Kết nối TCP đồng thời mở trong dịch vụ WCF
- 18. SQL - Cách tìm những hành động nào đang sử dụng tất cả các kết nối đồng thời tối đa
- 19. Nginx: Giới hạn số lượng kết nối đồng thời trên mỗi IP tới phần phụ trợ
- 20. Mô hình đồng thời Meteor là gì?
- 21. Người dùng đồng thời tối đa trong Spring Security
- 22. Số chủ đề cao nhất hợp lý để chạy đồng thời trong Jmeter là bao nhiêu?
- 23. Làm thế nào để đếm số lượng các chủ đề đồng thời trong ứng dụng .NET?
- 24. Xử lý các POST HTTP đồng thời lớn trong ứng dụng ASP.NET
- 25. Đồng thời kết nối DB pool trong Haskell
- 26. Thời lượng tối đa của cookie javascript
- 27. Số lượng tối đa lý thuyết của các kết nối TCP mở là một hộp Linux hiện đại có thể có
- 28. Đồng thời BerkeleyDB
- 29. đồng thời trong PHP
- 30. Xử lý đồng thời trong Scala
Cần lưu ý rằng mặc dù tất cả các cổng chỉ là cổng, nhóm thấp được xem là đã đặt trước. Tác động của việc gây rối với bất cứ thứ gì dưới 1024 có thể làm hỏng một điều gì đó bất ngờ. Ví dụ, bạn đã mở cổng 80 để chấp nhận yêu cầu, nhưng bạn không thể chấp nhận bất kỳ vì bạn đang gửi dữ liệu ra khỏi nó. – Incognito
Ẩn danh, tôi thích nhận xét của bạn, nhưng bạn có thể giải thích thêm một chút không? Là 1024 byte hoặc KB? Nếu tôi gửi yêu cầu http ra từ một máy chủ Unix 64 bit, thì tối đa tôi có thể gửi đồng thời là gì? Cảm ơn! – trillions
@Atom Mã không còn biên dịch trên go v1.0.3 kể từ ngày 3/23/13. Bạn có thể sửa nó không? –