2016-04-09 15 views
1

Meine Codes:Go Socket-Server hat EOF-Fehler bekommen?

var connMax int = 0 

    func CheckErr(err error) { 
     if err != nil { 
      fmt.Fprintf(os.Stderr, "Error occured: %s\n", err) 
      os.Exit(1) 
     } 
    } 

    func handler(conn net.Conn) { 
     defer conn.Close() 

     var buf [512]byte 
     n, err := conn.Read(buf[0:]) 
     CheckErr(err) 

     connMax += 1 
     fmt.Println(connMax) 

     result := bytes.NewBuffer(nil) 
     result.Write(buf[0:n]) 

     fmt.Println(string(result.Bytes())) 

     conn.Write([]byte("HTTP/1.1 201 OK\r\n")) 

    func Run() { 
     ln, err := net.Listen("tcp", ":8080") 
     CheckErr(err) 
     for { 
      conn, err := ln.Accept() 
      CheckErr(err) 
      go handler(conn) 
     } 
    } 

Ich versuchte Server mit dem Befehl ab über Paket apache2-utils zu testen. ab -c 1500 -n 10000 http://127.0.0.1:8080/

sobald die fertigen, EOF-Fehler aufgetreten, so Prozess Exit: enter image description here

+0

Wie viele offene Dateideskriptoren hat Ihr Betriebssystem? Benutze 'ulimit -a', um es zu überprüfen. Ich denke, es ist weniger als 10000. – jfly

+0

Siehe auch http://stackoverflow.com/questions/30352725/why-is-my-hello-world-go-server-getting-crushed-by-apachebench – JimB

Antwort

0

io.EOF zeigt an, dass die Verbindung mit dem anderen Ende geschlossen ist. Ich nehme an, dass es daran liegt, dass die Beschränkung von offenen Dateideskriptoren erreicht wird, so dass die Verbindung geschlossen wird. Verwenden Sie ulimit -a, um es zu überprüfen. Wenn es weniger als 10000 ist, verwenden Sie ulimit -n 65536, um es zu ändern. Dies ermöglicht mehr als 10000 Verbindungen. Ich wähle zufällig 65536, und Sie benötigen root-Rechte, um diese Konfiguration durchzuführen.