2015-09-01 16 views
5

Dưới đây là một Go http (tcp) kiểm tra kết nối kịch bản đơn giảnGo, tcp quá nhiều tập tin mở gỡ lỗi

func main() { 
    ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
     fmt.Fprintln(w, "Hello, client") 
    })) 
    defer ts.Close() 
    var wg sync.WaitGroup 
    for i := 0; i < 2000; i++ { 
     wg.Add(1) 
     go func(i int) { 
      defer wg.Done() 
      resp, err := http.Get(ts.URL) 
      if err != nil { 
       panic(err) 
      } 
      greeting, err := ioutil.ReadAll(resp.Body) 
      resp.Body.Close() 
      if err != nil { 
       panic(err) 
      } 
      fmt.Printf("%s", i, greeting) 
     }(i) 
    } 
    wg.Wait() 
} 

Và Nếu tôi chạy này trong Ubuntu tôi nhận được:

panic: Get http://127.0.0.1:33202: dial tcp 127.0.0.1:33202: too many open files

bài viết khác nói để đảm bảo kết nối Close, mà tôi đang làm tất cả ở đây. Và những người khác nói rằng để tăng giới hạn kết nối tối đa với ulimit hoặc thử sudo sysctl -w fs.inotify.max_user_watches=100000 nhưng vẫn không hoạt động.

Làm cách nào để chạy hàng triệu kết nối goroutin tcp trong một máy chủ? Nó chỉ bị hỏng với 2.000 kết nối.

Cảm ơn,

Trả lời

15

Tôi nghĩ rằng bạn cần phải thay đổi file descriptor tối đa của bạn. Tôi đã chạy vào cùng một vấn đề trên một trong các máy ảo phát triển của tôi trước và cần thiết để thay đổi các mô tả tập tin tối đa, không phải bất cứ điều gì với các thiết lập inotify.

FWIW, chương trình của bạn chạy tốt trên máy ảo của tôi.

·> ulimit -n 
120000 

Nhưng sau khi tôi chạy

·> ulimit -n 500 
·> ulimit -n 
500 

tôi nhận được:

panic: Get http://127.0.0.1:51227: dial tcp 127.0.0.1:51227: socket: too many open files 
-1

tôi phải cũng tự đặt tiêu đề kết nối chặt chẽ để tránh những vấn đề mô tả file:

r, _ := http.NewRequest(http.MethodDelete, url, nil) 
r.Close = true 
res, err := c.Do(r) 
res.Body.Close(); 

Nếu không có r.Close = true a nd res.Body.Close() Tôi nhấn giới hạn bộ mô tả tập tin. Với cả hai tôi có thể bắn ra nhiều như tôi cần.

+2

Điều này không dường như không hoạt động. – shicky

+0

tính năng này không hoạt động! – Ankita

0

quá thể goruntine trong chức năng của bạn, hãy thử này https://github.com/leenanxi/nasync

//it has a simple usage 
nasync.Do(yourAsyncTask) 

trong mã của bạn

for i := 0; i < 2000; i++ { 
    nasync.Do(func() { 
     resp, err := http.Get("https://www.baidu.com") 
     ... 
    }) 
} 

tối đa mặc định đi goruntine trong nasync lib là 1.000

+0

lib này hoạt động, và nó ít tốn kém nhất tài nguyên async lib – lee

0

thay đổi ulimit để tránh lỗi "quá nhiều tệp mở" theo mặc định max ulimit là 4096 cho linux và 1024 cho mac, u có thể c hange ulimit đến 4096 bằng cách gõ ulimit -n 4096 cho ngoài 4096 bạn cần sửa đổi limits.conf trong thư mục etc/security cho linux và đặt giới hạn cứng thành 100000 bằng cách thêm dòng này "* hard core 100000"

Các vấn đề liên quan