连接数问题
在使用mysql时有时候会报too many connections错误,这是连接数过多导致的,然后就会去修改max_connections参数,但是这个参数也不能无上限的增大,容易造成机器内存不足,还是需要找到为什么会有这么多连接的原因
阻塞IO模型 默认情况下,所有文件操作都是阻塞的。 在进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用进程的缓冲区中或者发生错误才返回,在此期间会一直等待。
非阻塞IO模型 recvfrom从应用层到内核的时候,如果缓冲区没有数据的话,就直接返回一个EWOULDBLOCK错误,然后轮询检查这个状态,看内核是否有数据到来
IO复用模型 linux中提供了select/poll,通过将一个或多个fd传递给select或poll系统调用,阻塞在select操作上,这样select/poll就可以侦测多个fd是否处于就绪状态。不过其是顺序扫描且支持的fd数量有限。
升级版的epoll基于事件驱动方式代替顺序扫描,当有fd就绪时,调用回调函数进行通知,性能更高
信号驱动IO模型 通过系统调用sigaction执行一个信号处理函数(该系统调用会立即返回,进程继续工作,非阻塞)。当数据准备就绪时,为该进程生成一个SIGIO信号,通过信号回调通知应用程序调用recvfrom来读取数据
内核通知我们何时可以开始一个IO操作,还需要通过recvfrom来读取数据,在将数据从内核复制到自己的缓冲区
异步IO 告知内核启动某个操作,并让内核在整个操作(包括数据从内核复制到用户自己的缓冲区)完成后通知。
内核通知我们操作何时已经完成