2.3.3 优化性能的配置项

下面是优化性能的配置项的相关介绍。

(1)Nginx worker进程个数

语法:worker_processes number;

默认:worker_processes 1;

在master/worker运行方式下,定义worker进程的个数。

worker进程的数量会直接影响性能。那么,用户配置多少个worker进程才好呢?这实际上与业务需求有关。

每个worker进程都是单线程的进程,它们会调用各个模块以实现多种多样的功能。如果这些模块确认不会出现阻塞式的调用,那么,有多少CPU内核就应该配置多少个进程;反之,如果有可能出现阻塞式调用,那么需要配置稍多一些的worker进程。

例如,如果业务方面会致使用户请求大量读取本地磁盘上的静态资源文件,而且服务器上的内存较小,以至于大部分的请求访问静态资源文件时都必须读取磁盘(磁头的寻址是缓慢的),而不是内存中的磁盘缓存,那么磁盘I/O调用可能会阻塞住worker进程少量时间,进而导致服务整体性能下降。

多worker进程可以充分利用多核系统架构,但若worker进程的数量多于CPU内核数,那么会增大进程间切换带来的消耗(Linux是抢占式内核)。一般情况下,用户要配置与CPU内核数相等的worker进程,并且使用下面的worker_cpu_affinity配置来绑定CPU内核。

(2)绑定Nginx worker进程到指定的CPU内核

语法:worker_cpu_affinity cpumask[cpumask……]

为什么要绑定worker进程到指定的CPU内核呢?假定每一个worker进程都是非常繁忙的,如果多个worker进程都在抢同一个CPU,那么这就会出现同步问题。反之,如果每一个worker进程都独享一个CPU,就在内核的调度策略上实现了完全的并发。

例如,如果有4颗CPU内核,就可以进行如下配置:


worker_processes 4;

worker_cpu_affinity 1000 0100 0010 0001;


注意 worker_cpu_affinity配置仅对Linux操作系统有效。Linux操作系统使用sched_setaffinity()系统调用实现这个功能。

(3)SSL硬件加速

语法:ssl_engine device;

如果服务器上有SSL硬件加速设备,那么就可以进行配置以加快SSL协议的处理速度。用户可以使用OpenSSL提供的命令来查看是否有SSL硬件加速设备:


openssl engine-t


(4)系统调用gettimeofday的执行频率

语法:timer_resolution t;

默认情况下,每次内核的事件调用(如epoll、select、poll、kqueue等)返回时,都会执行一次gettimeofday,实现用内核的时钟来更新Nginx中的缓存时钟。在早期的Linux内核中,gettimeofday的执行代价不小,因为中间有一次内核态到用户态的内存复制。当需要降低gettimeofday的调用频率时,可以使用timer_resolution配置。例如,"timer_resolution 100ms;"表示至少每100ms才调用一次gettimeofday。

但在目前的大多数内核中,如x86-64体系架构,gettimeofday只是一次vsyscall,仅仅对共享内存页中的数据做访问,并不是通常的系统调用,代价并不大,一般不必使用这个配置。而且,如果希望日志文件中每行打印的时间更准确,也可以使用它。

(5)Nginx worker进程优先级设置

语法:worker_priority nice;

默认:worker_priority 0;

该配置项用于设置Nginx worker进程的nice优先级。

在Linux或其他类UNIX操作系统中,当许多进程都处于可执行状态时,将按照所有进程的优先级来决定本次内核选择哪一个进程执行。进程所分配的CPU时间片大小也与进程优先级相关,优先级越高,进程分配到的时间片也就越大(例如,在默认配置下,最小的时间片只有5ms,最大的时间片则有800ms)。这样,优先级高的进程会占有更多的系统资源。

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