前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx学习笔记(四) 性能调优

Nginx学习笔记(四) 性能调优

作者头像
写一点笔记
发布2022-08-11 15:27:40
1K0
发布2022-08-11 15:27:40
举报
文章被收录于专栏:程序员备忘录

根据我们之前的一贯思路,对于一个工具来说都有一定边界和基础,然而软件或者数学都是基于一定的边界的,这些边界条件的变化也会对结果产生一定的影响,但是本质上没有改变。作者将这种重要的点叫做边界。边界的改变会对结果有很大的影响,但不改变主题,所以存在最优的边界条件。寻找最优的过程就是优化。

这边作者查阅了相关资料,整理了一些调优的参数。大家可以一起学习一下。

https://www.jianshu.com/p/9d83b9d52b91

一、work_processes

worker_processes表示worker线程的数量,每个worker进程都是单线程的进程,他们会调用各个模块以实现多重多样的功能。一般来每一个请求就会有一个线程。而线程在并发情况下会在不同的cpu上执行代码,所以说有多少个cpu就有多少个worker进程。在没有阻塞的情况下,也就是各个请求不相互影响,那么有多少个cpu就可配置多少个worker进程。如果有阻塞的情况,根据多核cpu执行代码的整体效率来说,就应该多配置一下worker进程,这样cpu的吞吐率就会提升上去。

二、woker_connections

worker_connections表示每个worker进程的最大连接数,默认是1024个,通过使用worker_processes和worker_connections可以设置nginx的总体最大连接数,也就是两个值的乘积。

三、worker_cpu_affinity

worker_cpu_affinity表示绑定nginx的worker进程到指定cpu内核。为什么要绑定worker进程到指定的cpu内核?假设每一个worker进程都是非常繁忙,如果发生多个worker进程抢同一个cpu,那么就会出现同步问题,如果每一个worker进程都独占一个cpu,那么就没有这种问题。

比如有4核cpu,就可以这样配置。

代码语言:javascript
复制
worker_processes 4;
worker_cpu_affinity 1000, 0100,0010,0001;

这里要注意worker_cpu_affinity配置仅仅对linux操作系统有效。

四、worker_priority

worker_priority表示nginxworker进程的优先级,默认为0,。优先级由静态优先级和内核根据进程执行情况所做的动态调整(目前只有±5的调整)共同决定。nice值是进程的静态优先级,它的取值范围是–20~+19,–20是最高优先级,+19是最低优先级。因此,如果用户希望Nginx占有更多的系统资源,那么可以把nice值配置得更小一些,但不建议比内核进程的nice值(通常为–5)还要小。

五、worker_rlimit_nofile

表示nginx的worker进程可以打开最大句柄描述符的个数,更改worker进程的最大打开文件数限制,如果没有设置的话,这个值为操作系统限制。设置后你的操作系统和nginx可以处理比Ulimit -a更多的文件,所以把这个值设置的高,nginx就不会有too many open files的问题了。

六、 accept_mutex

accept_mutex表示是否打开accept锁,accept_mutex是nginx的负载均衡锁,当某一个worker进程建立的连接数达到worker_connections配置的最大连接数的7/8时,会大大减小该worker进程试图建立新tcp连接的机会,accept锁默认是打开的,如果关闭它,那么建立tcp连接的耗时会更短,但是worker进程之间的负载会非常不平衡。

七、 accept_mutex_delay

accept_mutex_delay表示accept锁表示accept锁后到真正建立链接之间的延迟时间,默认为500ms,在使用accept锁后,同一时间只有一个worker进程能够取得accept锁。这个accept锁不是阻塞锁,如果取不到会立即返回,如果只有一个worker进程视图取锁而没有取到,他至少要等待accept_mutex_delay定义的时间才能再次取锁。

知识补习:

通过学习,作者发现之前认为nginx是多进程多线程的,看完文章发现有些小出入,所以作者也不断的思考为何是多进程单线程,如果是多进程单线程,那么cpu资源岂不是得不到最大化利用。一个16核的cpu,你只用跑一个进程。而进程只能在同一时刻在单个核上执行。这么理解的话发现nginx的多进程单线程就没有什么意义了。显然这是不对了。那么肯定是我们对cpu的架构不熟悉导致的。在作者的理解中,cpu都是单进程多线程的,也就是多核cpu。其实还可以单核多cpu的方式甚至多核多cpu。比如说我们的处理器是是单核多cpu,那岂不是正中nginx多进程单线程的设计思路,nginx的性能不就没有任何问题了。这里贴一张从知乎上看到的图片。看到这张图,我们基本就知道了问题所在了。

可是作者在思考,这两者的架构区别,其实都是执行任务,无非一个是并行,一个是并发。本质上都是执行计算任务。多处理器在在功耗上肯定是比较大的,除此之外对于需要多线程的执行的业务肯定是不太行,在芯片的电路设计上肯定是比较麻烦的。多核cpu对多线程业务上支持的比较好,但是对多任务执行上肯定没有多处理器强大。所以认为对单任务的业务系统上,选用多核cpu即可,对于需要多任务执行的服务,那么就可以选择多处理器的cpu,比较折衷的方式是多处理器多核心的架构。但是主流的服务器处理器是这样的吗,为什么我没有找到相关的服务器Cpu,貌似很多cpu都是多核的,如果这样,那么nginx的这种多进程单线程有用吗?可能是作者理解的有问题。麻烦知道的朋友告诉我一下,谢谢!

参考资料:https://www.jianshu.com/p/9d83b9d52b91

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 写点笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档