1. 全局配置

影响服务器的整体行为和性能。这些配置通常放在 Nginx 配置文件的最顶层。在全局配置块中,可以设置用户权限、进程数、日志路径等全局参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Nginx 运行的用户和用户组。
user nginx nginx;

# 设置工作进程的数量。通常设置为 CPU 核心数。
worker_processes auto;

# 设置工作进程可以打开的最大文件描述符数量。
worker_rlimit_nofile 1024;

# 设置全局错误日志的路径和日志级别。
error_log /var/log/nginx/error.log warn;

# 设置存储 Nginx 主进程 ID 的文件路径。
pid /var/run/nginx.pid;

如果服务器上的文件描述符数量不足以满足并发连接的需求,可能会导致 Nginx 的性能下降或者无法处理更多的连接请求。增大限制可以提高 Nginx 处理并发连接时的能力,特别是在高流量或大负载情况下

  • 操作系统限制:配置 worker_rlimit_nofile 前,确保操作系统本身的文件描述符限制足够大。在 Linux 中,可以通过 ulimit -n 命令查看和调整当前用户的文件描述符限制。

  • 性能优化:合理设置 worker_rlimit_nofile 可以帮助提高 Nginx 处理并发请求的能力,但设置过高可能会消耗过多系统资源,影响其他服务的稳定性。

  • 监控和调整:在生产环境中,建议结合监控工具(如 Prometheus + Grafana)对 Nginx 的性能指标进行监控,以便及时调整配置来优化服务器性能。

2. events模块

events 模块用于设置与网络连接和工作进程相关的参数。该模块主要用于优化服务器的并发性能和连接处理能力。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
events {
worker_connections 2048; # 每个工作进程的最大连接数,默认值1024

worker_processes 4; # 假设有4个cpu核心
worker_cpu_affinity 0001 0010 0100 1000; # 分别绑定到各个核心

use epoll; # 指定事件模型为 epoll(适用于 Linux)。可能的值:`epoll`(Linux)、`kqueue`(BSD系统)、`select`(几乎所有系统)、`poll`(几乎所有系统)

multi_accept on; # 允许工作进程一次接受多个新连接

accept_mutex on; # 启用接受新连接的互斥锁

accept_mutex_delay 100ms; # 设置接受新连接前的延迟时间。默认值:500ms

worker_aio_requests 64; # 设置异步 I/O 操作的最大请求数。默认值:32
}
  • worker_connections:每个工作进程可以处理的最大连接数。增大这个值可以提高并发能力。
  • use:明确指定事件驱动模型,epoll 适用于高并发的 Linux 系统。
  • multi_accept:使得工作进程能够一次性接受多个连接,减少上下文切换,提高效率。
  • accept_mutex:启用互斥锁机制,避免多个进程同时接受连接而导致的惊群效应。
  • accept_mutex_delay:当启用 accept_mutex 时,设置每个进程尝试接受新连接前的等待时间,有助于平衡负载。
  • worker_aio_requests:设置每个工作进程可同时处理的异步 I/O 操作请求数,有助于提高文件传输性能。

可以根据服务器的具体需求和工作负载进行调整,以优化 Nginx 的性能和连接处理能力。

关于cpu affinity

在 Nginx 中配置 worker_cpu_affinity 可以显著影响性能,尤其是在多核处理器上运行时。理解绑定和不绑定 CPU 核心的区别以及其原理,可以帮助我们做出优化决策。

不绑定和绑定的区别

不绑定(默认行为)

  • 定义:Nginx 的 worker 进程可以在任何可用的 CPU 核心上运行,操作系统会动态地在不同核心之间分配负载。
  • 优点
    • 灵活性高:操作系统可以根据负载情况动态地将进程迁移到不同的 CPU 核心,以平衡负载。
    • 配置简单:无需额外配置,适用于一般情况下的负载均衡。
  • 缺点
    • 上下文切换多:频繁的核心迁移可能导致更多的上下文切换,增加开销。
    • 缓存命中率低:进程在不同核心之间迁移时,缓存中的数据可能无效,降低缓存命中率。

绑定(CPU Affinity)

  • 定义:将 Nginx 的 worker 进程绑定到特定的 CPU 核心上,使得这些进程只能在指定的核心上运行。
  • 优点
    • 减少上下文切换:CPU 绑定可以减少进程在不同 CPU 核心之间的迁移,从而减少上下文切换的开销。
    • 缓存命中率:绑定进程后,数据更可能在同一个 CPU 的缓存中,因此缓存命中率更高,提高了性能。
    • 更好的资源利用:通过绑定,可以确保特定的工作负载在特定的 CPU 上运行,更好地利用 CPU 资源。
  • 缺点
    • 灵活性降低:绑定后,进程只能在特定核心上运行,若核心负载过重,无法动态迁移到其他空闲核心,可能导致负载不均衡。
    • 复杂配置:需要根据具体的硬件和应用需求进行合理的配置,不同系统的最佳配置可能不同。

原理

CPU 绑定的原理在于操作系统的调度机制。以下是一些关键点:

  1. CPU 亲和性(CPU Affinity)

    • 每个进程在创建时,操作系统会为其分配一个默认的 CPU 亲和性掩码,表示该进程可以在哪些 CPU 核心上运行。
    • 通过设置 CPU 亲和性掩码,可以限制进程只能在指定的 CPU 核心上运行。
  2. 上下文切换

    • 当操作系统将进程从一个 CPU 核心迁移到另一个 CPU 核心时,需要保存和恢复进程的状态,这个过程称为上下文切换。
    • 上下文切换是有开销的,包括保存和恢复寄存器状态、内存状态等。
  3. 缓存一致性

    • 每个 CPU 核心都有自己的缓存,如果进程频繁在不同核心之间迁移,可能导致缓存中的数据无效,降低缓存命中率。
    • CPU 绑定可以使得进程在同一个核心上运行,缓存数据更加一致,减少缓存失效的情况。

在实际应用中,是否启用 CPU 绑定取决于具体的工作负载和硬件配置:

  • 对于高并发、低延迟要求的应用,启用 CPU 绑定可能带来显著的性能提升。
  • 对于负载均衡要求高、负载波动大的应用,不绑定可能提供更好的灵活性和负载均衡效果。