
按点赞数排序
按时间排序
所谓性能好,一般指2点:低时延、高并发,由这2点会带来高吞吐量,也就是百万级的QPS。
我先说低时延是怎么办到的:
1、Nginx内部的算法都非常优秀,是性能优先的。
比如hash表会考虑cpu cache line(参见https://www.nginx-cn.net/article/71),比如location匹配是基于URI规则封装的多叉树(参见https://www.nginx-cn.net/article/69)。
2、Nginx充分使用了OS的各种高性能特性
比如Linux的reuseport、accept_defer、lingering_close、sendfile、aio等等。
再说高并发是怎么达到的:
1、每个请求占用的内存极为有限
每个连接占用的基本内存不过几百字节,这需要很深厚的功力,也只有C语言才能办得到。
2、基于事件驱动的多路复用框架
这个已经说烂了,就不多说了
5
回答于2020-05-20 19:47
说多了就一句话,充分利用系统的特性。
以 Linux 为例,
在 Linux 中的多进程,epoll 模型, reuseport, send_file ....都是高并发的利器
1 多进程让所有核心都在干活,而不是划水
2 epoll 模型让每个核心都干它值得干的事情(相对 select/poll,减少不必要的轮询)
3 reuseport 解决狗界难题-惊群
4 。。。未完待续
1
回答于2020-05-20 16:15
1、IETF的QUIC已经有33个草案了,这是RFC规范,所以现在Nginx不太会去支持其他QUIC版本了。目前Nginx的quic分支,是基于最新的RFC 33 draft草案实现的。你可以参考下spdy与HTTP2在Nginx上的实现,那时HTTP2迟迟未推出时,google的spdy广为使用,Nginx推出了spdy模块,所以这其实是个开发效率、成本的权衡问题。
2、拥塞控制由应用层来实现,还是由内核来实现,对于网络安全性来说,这并不是问题。对于网络来说,每一台主机也未必可信。对于Linux来说,内核也是可以去改的。所以,长期来看,拥塞控制不会是问题,个人看法。
3、11.27号在GOPS上海站还会做HTTP3的进一步探讨。
没有回答,我就只能自己回答了。
查了下代码,进行gdb跟踪调试后发现:这个主要是因为,每个worker单独维护一个前后端 “链路”关联的四元组信息,在多个worker的情况下,不同的worker保存“链路”关联信息相互独立,彼此不共享。因此即使是相同的IP和端口发来的消息,只要是分配到不同的worker进行处理,都有可能查不到之前的“链路”关联信息,从而无法复用。
解决办法:
1. 单worker配置(性能可能偏低)
2. 修改代码,使用共享内存保存已有的前后端“链路”关联信息,不同worker之间共享结果
微信公众号
加入微信群