3.nginx长连接优化

在单机的情况下的压测结果: 

分布式的压测结果:

虽然tps还是比较少,但是还是有提升,主要是因为数据库的服务器的配置是很低的,所以扩展这里其实就更有帮助,这里就不再修改了。 

而对于nginx和服务之间的连接还是短连接,所以还是有性能消耗,接下来我们把nginx的连接改成长连接:

 由于数据库服务器配置问题,所以数字上看不出太多变化,如果配置好的机器,变化是非常大的。


为什么nginx性能那么高?

epoll多路复用完成非阻塞式io操作:传统java开发都会使用bio模型,也就是阻塞进程式模型。接下来再介绍一下linux select模型,他不是传统意义上客户端访问服务端,调用socket.write,而是服务端监听例如100个客户端,当某几个客户端状态发生变化的时候,唤醒自己并且轮询客户端处理发生变化的几个。这个的坏处是轮询遍历效率不高,且最多监听1024个客户端。对于很多的服务器那么就力不从心了。所以在linux2.6以后就诞生了epoll模型,他也是监听客户端连接,但会设置回调函数,如果有变化则直接唤醒自己并执行回调函数,且理论上没有限制。

master worker进程模型使得可以做平滑的重启,使客户端不会被断开。接下来看下面这张图:

请求到master进程后,由master进程发给worker进程来进行处理。

看下进程:

那么客户端发送请求到底连接哪个worker呢?client请求发送后,worker进程会抢占资源,应用互斥锁锁住资源,然后通过三次握手建立连接,建立好以后,往后这个客户端的请求都由这个进程来处理。 master进程只处理管理员的信号,当配置或命令发生变化的时候,master会马上感知到并通知worker,并new出新的worker进程,并将老的worker进程的连接转移到新的worker上,满足客户端请求。所以就算重启,用户也不用断开。

协程机制

由于worker模型是单线程的,对于大量请求如何完成异步化操作?协程是比线程更小的模型,它依附于线程的内存模型,切换开销更小。如果协程程序遇到阻塞,nginx的协程机制会自动的把协程的权限剥夺,并在线程中掉另一个非阻塞的线程去执行,代码同步编写非常简单,而且由于协程依附于线程,所以是串行的,不需要加锁。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章