SQL执行慢的原因分析是一个开放性的问题,在实践过程中,我们可以根据多变的情况进行逐步分析。
Go并发编程
AIO(Proactor)与NIO(Reactor)
概要
在讲到IO时,我们会讲到阻塞/非阻塞,即BIO/NIO。那么AIO又是什么呢?
AIO即是Asynchronous IO,异步IO。这里的异步是关于用户读取数据来说是同步还是异步,回到BIO及NIO的场景:
BIO是创建一个IO句柄后,阻塞等待数据返回
NIO在创建完一个IO句柄后,不阻塞等待,而是去做其他事情,当有数据时,用户再进行数据读取,这个时候的读取动作是同步的,即如果缓冲区的数据没读取完,那么会一直读取。
比如select以及poll模型,这两种模型都是非阻塞IO,即当socket套接字创建完成之后,用户可以去做其他事情,当套接字有事件发生时,用户主动将内核数据同步拷贝到用户态。
AIO要优化的的即是,当内核数据有数据时,将内核态数据拷贝到用户态,并不需要用户做主动拷贝。
总结:
AIO将IO就绪事件监听和IO数据读取全部交由操作系统完成,也就不需要多路复用器去监听IO就绪事件、也不需要分配线程读取。
用户完全不需要关注IO过程,只需要关注拿到数据后的处理。
IOCP原理学习
IOCP是由Window内核提供的网络通讯方式,其模式为Proactor
EPOLL原理学习
Epoll在ET(Edge Triggered)边缘触发模式下,Socket必须是非阻塞,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。
et模式,是当发生事件时进行一次通知,epool_wait获取该次事件后,如果用户不处理完缓冲区数据,使用epoll_wait是不会再获取到事件
LT(level Triggered)水平触发模式,支持非阻塞Socket及阻塞Socket,当一个文件句柄准备就绪时,内核会通知用户进行io操作,如果不进行任何操作时,内核还是会继续通知用户关于该句柄的事件。
通过epoll_wait获取到事件后,如果不处理完缓冲区数据,继续使用epoll_wait
epol会将用户空间与内核空间采用mmap技术映射为同一内存,减少内存拷贝
epoll相比于select/poll,在于epoll通过epoll_create创建时,内核开始准备存储句柄的空间,通过epoll_add添加句柄后,在epoll_wait开始等待事件通知,而select/poll每次都需要将句柄列表拷贝给内核。
当进程调用eopll_create()时,内核会创建一个eventpoll结构体,该结构体里采用红黑树来存储epoll_ctl添加进来的句柄,采用双向链表来记录就绪句柄。
当调用epoll_ctl的add操作添加一个句柄时,会把这个句柄存储到红黑树,同时注册一个回调函数给内核。回调函数的操作:当该句柄有中断时,内核调用回调将句柄放到链表
epoll_wait调用时,查看就绪列表有没数据即可,如果有则返回,如果没有则等待timeout后返回
MySQL写缓存原理
MySQL缓冲池buffer pool
Nginx打印Request及Response信息
场景:
生产过程中,使用Nginx做反向代理转发请求到第三方网关时,因为请求出错,所以需要在nginx 打印请求的信息。
给Nginx配置MIME
打包前端项目部署时,运动前端无法加载样式的问题。原因是浏览器没有识别返回的css等文件。