根据我们之前的一贯思路,对于一个工具来说都有一定边界和基础,然而软件或者数学都是基于一定的边界的,这些边界条件的变化也会对结果产生一定的影响,但是本质上没有改变。作者将这种重要的点叫做边界。边界的改变会对结果有很大的影响,但不改变主题,所以存在最优的边界条件。寻找最优的过程就是优化。
这边作者查阅了相关资料,整理了一些调优的参数。大家可以一起学习一下。
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,就可以这样配置。
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