提高单机性能存在两条路线
- 减少I/O的阻塞时间
- 提高CPU的利用的效率
总结来说就是提高CPU运转的时间和运转的效率
golang实践
对于http标准库, 采用一个请求分配一个goroutine,来减少I/O阻塞的时间,并且goroutine是更加轻量级的执行体(相对于线程和进程)就提高了CPU的效率,因为线程/进程调度,上下文切换的时间要远大于goroutine的时间。但是标准库中并没有控制goroutine的数量
for {
rw, e := l.Accept()
if e != nil {
select {
case <-srv.getDoneChan():
return ErrServerClosed
default:
}
if ne, ok := e.(net.Error); ok && ne.Temporary() {
if tempDelay == 0 {
tempDelay = 5 * time.Millisecond
} else {
tempDelay *= 2
}
if max := 1 * time.Second; tempDelay > max {
tempDelay = max
}
srv.logf("http: Accept error: %v; retrying in %v", e, tempDelay)
time.Sleep(tempDelay)
continue
}
return e
}
if cc := srv.ConnContext; cc != nil {
ctx = cc(ctx, rw)
if ctx == nil {
panic("ConnContext returned nil")
}
}
tempDelay = 0
c := srv.newConn(rw)
c.setState(c.rwc, StateNew) // before Serve can return
go c.serve(ctx)
}
可以上面的的代码块看出,标准库是对每一个conn包装下后通过go
关键字启动处理函数,并没有控制goroutine的数量。可以采用goroutine池去处理,例如httprouter