Nginx
nginx调度模式
1.无调度模式
所有工作进程都会在连接事件被触发时争相与客户端建立连接,建立连接成功则开始处理客户端请求。无调度模式下所有进程都会争抢资源,但最终只有一个进程可以与客户端建立连接,对于系统而言这将瞬间产生大量资源消耗,这就是所谓的惊群现象。
2.互斥锁模式(accept_mutex)
互斥锁是一种声名机制,每个工作进程都会周期性地争抢互斥锁,一旦某个工作进程抢到互斥锁,就表示其拥有接受HTTP建立连接事件的处理权,并将当前进程的socket监听注入事件引擎(如epoll)中,接收外部的连接事件。其他工作进程只能继续处理已经建立的读写事件,并周期性地轮询查看互斥锁的状态,只有互斥锁被释放后工作进程才可以抢占互斥锁,获取HTTP建立连接事件的处理权。当工作进程最大连接数的1/8与该进程可用连接(free_connection)的差大于或等于1时,则放弃本轮争抢互斥锁的机会,不再接收新的连接请求,只处理已建立连接的读写事件。互斥锁模式有效地避免了惊群现象,对于大量HTTP的短连接,该机制有效避免了因工作进程争抢事件处理权而产生的资源消耗。但对于大量启用长连接方式的HTTP连接,互斥锁模式会将压力集中在少数工作进程上,进而因工作进程负载不均而导致QPS下降。
3.套接字分片(Socket Sharding)
套接字分片是由内核提供的一种分配机制,该机制允许每个工作进程都有一组相同的监听套接字。当有外部连接请求时,由内核决定哪个工作进程的套接字监听可以接收连接。这有效避免了惊群现象的发生,相比互斥锁机制提高了多核系统的性能。该功能需要在配置listen指令时启用reuseport参数。
Nginx 1.11.3以后的版本中互斥锁模式默认是关闭的,由于Nginx的工作进程数量有限,且Nginx通常会在高并发场景下应用,很少有空闲的工作进程,所以惊群现象的影响不大。无调度模式因少了争抢互斥锁的处理,在高并发场景下可提高系统的响应能力。套接字分片模式则因为由Linux内核提供进程的调度机制,所以性能最好。
nginx事件驱动
事件驱动程序设计(Event-Driven Programming)是一种程序设计模型,这种模型的程序流程是由外部操作或消息交互事件触发的。其代码架构通常是预先设计一个事件循环方法,再由这个事件循环方法不断地检查当前要处理的信息,并根据相应的信息触发事件函数进行事件处理。通常未被处理的事件会放在事件队列中等待处理,而被事件函数处理的事件也会形成一个事件串,因此事件驱动模型的重点就在于事件处理的弹性和异步化。
Nginx 1.11.3以后的版本中互斥锁模式默认是关闭的,由于Nginx的工作进程数量有限,且Nginx通常会在高并发场景下应用,很少有空闲的工作进程,所以惊群现象的影响不大。无调度模式因少了争抢互斥锁的处理,在高并发场景下可提高系统的响应能力。套接字分片模式则因为由Linux内核提供进程的调度机制,所以性能最好。
nginx模块分类
1)模块分类
·核心模块(core)。该模块提供了Nginx服务运行的基本功能,如Nginx的进程管理、CPU亲缘性、内存管理、配置文件解析、日志等功能。
·事件模块(event)。该模块负责进行连接处理,提供对不同操作系统的I/O网络模型支持和自动根据系统平台选择最有效I/O网络模型的方法。
nginx指令域root与alias区别
默认情况下,本地文件的路径是root指令设定根目录的相对路径,通过alias指令可以将匹配的访问路径宠幸指定为新定义的文件路径 root配置样例如下: location /flv/ { root /data/web; } 当root指令在location指令域时,root设置的是location匹配访问路径的上一层目录,样例中被请求文件的实际本地路径为/data/web/flv/。 ·location中的路径是否带“/”,对本地路径的访问无任何影响。 alias配置样例如下: server{ listen 8080; server_name www.nginxtest.org; root /opt/nginx-web/www; location /flv/ { alias /opt/nginx-web/flv/; } location /js { alias /opt/nginx-web/js; } location /img { alias /opt/nginx-web/img/; } } alias指定的目录是location路径的实际目录。
零复制技术
http { sendfile on; } ·默认配置下,Nginx读取本地文件后,在进行网络传输时会先将硬盘文件从硬盘中读取到Nginx的文件缓冲区中,操作流程为硬盘→内核文件缓冲区→应用缓冲区。然后将Nginx文件缓冲区的数据写入网络接口,操作流程:应用缓冲区→内核网络缓冲区→网络接口。Nginx的本地文件在进行网络传输的过程中,经历了上述两个操作过程,两次操作都在内核缓冲区中存储了相同的数据。为了提高文件的传输效率,内核提供了零复制技术,该技术支持文件在内核缓冲区内直接交换打开的文件句柄,无须重复复制文件内容到缓冲区,则上述两个操作的流程变为:硬盘→内核文件缓冲区→内核网络缓冲区→网络接口。 ·零复制技术减少了文件的读写次数,提升了本地文件的网络传输速度。 ·内核缓冲区的默认大小为4096B