spice and wolfspice and wolf Be the One you wanna Be

nginx性能调优

nginx性能调优是一门艺术,我们要如何欣赏这门艺术,取决于我们如何使用它和我们使用时对它的了解程度。

使用负载工具模拟真实负载

在获取你创建的服务的真实瓶颈时,反复测试和测量是有必要的。

而作为测试和测量的手段,负载工具是必要的,而典型的有Apache JMeter,Locust,Gatling等。

对客户端放开连接

近年来,随着HTTP/1.1的广泛的使用,各种应用都需要更多的连接数来维持应用的性能,所以极低的连接数将成为应用性能的瓶颈,为此我们需要增大每个客户端的最大连接数,并相应的加长连接超时时间。

http {
    keepalive_requests 320;
    keepalive_timeout 300s;
    # ...
}

连接复用

连接复用能有效提高上游服务的性能。

proxy_http_version 1.1;
proxy_set_header Connetcion "";

upstream backend {
    server 10.0.0.42;
    server 10.0.2.56;

    keepalive 32;
}

keepalive指令表示最多能维持32个空闲连接,任何nginx worker线程都能复用这些空闲的连接。而proxy_http_version表示代理请求将使用http1.1版本,从而让单个连接有一次性发送复数个请求的能力,最后proxy_set_header Connection “”指令允许连接维持打开状态,以让其有复用的可能。

缓存请求体

server {
    proxy_buffering on;
    proxy_buffer_size 8k;
    proxy_buffers 8 32k;
    proxy_busy_buffer_size 64k;
    # ...
}

proxy_buffering的可选值为on和off,默认值为on,表示开启;proxy_buffer_size表示读取从相应服务返回的响应首部的内存大小;proxy_buffers表示请求体缓存的数量和大小;proxy_busy_buffer_size用于限制在忙的响应缓存的大小。

缓存日志

缓存日志是为了减少工作线程阻碍的可能性。

http {
    access_log /var/log/nginx/access.log main buffer=32k flush=1m gzip=1;
}

这条配置将允许将日志缓存到内存中,而最迟在flush的时间后才将内存中的日志写到硬盘上。

操作系统调参

你需要修改一些系统参数来应付服连接峰值负载或严重阻塞的站点。

net.core.somaxconn是Linux中的一个内核参数,表示socket监听的backlog上限。而backlog表示socket的监听队列,当一个请求尚未被处理或建立时,它就会进入backlog中。而socket server可以一次性处理backlog中的所有请求,处理后的请求不在位于监听队列中。所以当Server处理请求较慢时,会使监听队列被逐渐填满,最终导致新请求被拒绝。该参数的默认值是128,所以当Linux系统部署了需要经常处理新请求的高负载的服务时,就需要加大这个参数值,可以通过以下方式修改:

# 该方法会在重启后失效
# sysctl -w net.core.somaxconn=1024
# 永久生效的方法
# vi /etc/sysctl.conf
# 新增一行
net.core.somaxconn=1024

上面的参数可能不太常用,但是加大文件描述符数量是一种更一般性的手段,用以提高服务性能。在Linux中,每一个连接都会打开一个文件句柄,所以更多个连接将意味着更多的文件句柄,这也就意味着越高负载的服务需要越高上限的文件描述符数量,这需要在/etc/security/limits.conf文件中设置,同样,你也需要在nginx配置中加大worker_connections和worker_rlimit_nofile的数量。

另一方面,瞬时端口也可能需要加大,当nginx作为反向代理服务器时,每一个上游连接都会打开一个临时端口用于返回数据,如果系统配置没有打开最大的瞬时端口,就需要改改了,这个配置项为net.ipv4.ip_local_port_range。这个参数一般会设置到1024-65535。TCP端口上限为1024,65535则是瞬时端口的上限,记住瞬时端口的最小值一定要大于监听端口的最大值。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Press ESC to close