上一篇 下一篇 分享链接 返回 返回顶部

香港服务器Nginx高并发连接数如何结合CPU与响应时间调优

发布人:Minchunlin 发布时间:2026-10-07 15:19 阅读量:12

连接数上限调大以后,Nginx不再提示连接不足,页面却可能更慢:原先被挡在入口的请求进入了上游,CPU、应用线程池或数据库队列随之承压。香港服务器的高并发调优不能只看worker_connections,而应在同一观察窗口内,把连接状态、CPU、响应时间、错误率和上游队列对应起来,判断限制究竟发生在哪里。

可执行的顺序是:先确认连接与文件描述符是否真的不足,再观察放开连接后CPU和P95响应时间是否同时恶化;如果瓶颈转移到计算、网络或上游,就分别通过缓存、适度压缩、静态资源分流、反向代理连接复用和超时约束处理。连接数决定“能接住多少连接”,并不直接决定“能及时完成多少请求”。

一、建立同一时间窗口,区分连接容量与处理能力

香港服务器常见的访问链路是“客户端—公网—Nginx—应用—数据库”。其中,公网往返时间、服务器出口带宽和应用处理时间对用户体验的影响不同,不能用一个平均响应时间混在一起解释。

建议以连续5分钟作为一次对照窗口,保留10秒粒度的采样;压测前另留预热时间,不把建立缓存、启动应用和加载文件的阶段混入稳定窗口。对照期间固定请求速率、接口比例、响应体大小、TLS方式、客户端连接复用方式和压测来源。

需要同步采集的指标

观察对象建议记录主要用途
Nginx连接Active、Reading、Writing、Waiting,以及accepted、handled增量区分请求处理、空闲长连接与接入异常
请求结果成功请求数/秒、P50/P95/P99、499/502/504比例判断吞吐提升是否以延迟和失败为代价
CPU总利用率、单核利用率、user、system、softirq、steal区分计算负载、内核网络开销与虚拟化资源竞争
内存worker RSS、系统可用内存、swap活动、文件页缓存判断连接与缓冲增加是否造成内存压力
存储吞吐、延迟、队列、临时文件写入量判断缓存、日志和响应落盘是否成为瓶颈
网络进出站速率、重传、RTT、丢包、监听队列判断出口拥塞与接入排队
上游连接时间、首部等待时间、完整响应时间、应用队列判断慢请求是否主要来自应用

stub_status中的Waiting主要表示等待新请求的空闲客户端连接,不是应用排队数;Writing也不能直接等同于“CPU正在处理的请求”。HTTP/2还可能在一个客户端连接内承载多个并发请求,因此连接数与请求并发数不能简单互换。

可在现有http块中加入一个仅本机可访问的观察入口:

server {
    listen 127.0.0.1:8081;
    server_name localhost;

    location = /nginx_status {
        stub_status;
        allow 127.0.0.1;
        deny all;
        access_log off;
    }
}

使用前检查端口是否冲突,并通过nginx -V、nginx -t核验当前构建和配置。它提供的是基础连接计数;请求分位数、缓存命中率和上游队列仍需要访问日志或应用监控补充。

accepted与handled应比较同一窗口内的增量。两者出现差距可以提示接入资源限制,但还要结合错误日志确认原因,不能把历史累计差值直接当作本次故障。

用日志拆开“响应慢”的组成

下面的日志格式定义放在http块中,再在需要观察的站点启用:

log_format perf escape=json
    '{"time":"$time_iso8601",'
    '"uri":"$uri",'
    '"status":$status,'
    '"request_time":$request_time,'
    '"upstream_connect_time":"$upstream_connect_time",'
    '"upstream_header_time":"$upstream_header_time",'
    '"upstream_response_time":"$upstream_response_time",'
    '"upstream_addr":"$upstream_addr",'
    '"cache":"$upstream_cache_status",'
    '"bytes_sent":$bytes_sent,'
    '"connection_requests":$connection_requests}';

access_log /var/log/nginx/access_perf.log perf;

request_time反映Nginx侧从开始读取请求到请求结束的时间,不包含完整的客户端DNS解析、TCP/TLS建连过程。用户侧还应单独记录端到端耗时和首字节时间,按访问地区、运营商与接口分组。

发生重试时,上游时间字段可能包含多个值;没有访问上游时则可能为-。日志分析不能一律强制转换成单个数字,也不要直接把这些时间相减后称为“应用排队时间”。应用队列应由应用侧独立测量。

二、连接数上升后,先看CPU与长尾是否一起变化

下面是一组用于说明判断方法的模拟数据,并非实际监控结果。环境为4个可用vCPU、8 GiB内存的香港服务器,固定提供800次请求/秒,请求中包含可缓存的公共查询接口。

对照窗口每worker连接上限客户端Active约值CPU利用率成功请求/秒P95响应时间失败比例应用排队P95
A:原配置1024320045%756360 ms5.5%12 ms
B:只提高连接上限4096350088%796610 ms0.5%90 ms
C:保留连接上限,增加公共接口缓存4096290059%797180 ms约0.4%8 ms

窗口A还需有对应证据,例如错误日志出现worker_connections are not enough,或worker打开的文件数逼近限制。否则,不能仅凭失败比例推断连接不足。

窗口B说明连接上限放开后,成功吞吐提高了,但CPU和应用排队时间同步增长,P95反而变差。窗口C则提供另一个因果候选:减少重复上游计算后,排队和长尾一起下降。

二、连接数上升后,先看CPU与长尾是否一起变化配图

条件化判断:提高连接数后,若成功吞吐增加而CPU、应用队列和P95同时上升,应优先判断处理能力不足或瓶颈转移,而不是继续增加连接上限。

worker_connections不是网站可承受的请求数

对常见反向代理场景,一个处理中请求通常涉及客户端连接和上游连接。此外还有空闲上游连接、监听套接字、日志文件等资源。

例如4个worker、每个worker_connections 4096,只能表示理论连接槽位约为16384,不能宣称可同时处理16384个反向代理请求。实际容量还受以下条件影响:

上部显示客户端到单个worker再到应用的两侧连接,下部放大worker连接槽位池,另设文件描述符边界与处理能力边界;四worker总量仅作为理论槽位计算标注

  • worker之间是否均衡,是否有单个worker先触顶。
  • 上游连接与空闲连接池占用了多少槽位。
  • 每个进程的文件描述符限制是否足够。
  • CPU、内存、带宽和应用处理能力是否先达到边界。

下面是需要合并到现有配置相应位置的示例,不应作为完整文件直接覆盖:

worker_processes auto;
worker_rlimit_nofile 65535;

events {
    worker_connections 4096;
}

worker_processes auto还应结合进程实际可用的CPU资源检查,容器或受CPU配额约束的环境不能只看宿主机核数。worker_rlimit_nofile也不能绕过操作系统硬限制及服务管理器的约束。若服务由systemd管理,应先确认实际服务单元,再查看其LimitNOFILE;同时检查worker进程的实际限制与打开文件数。

长连接要结合内存和复用率调整

在http或站点配置中,可以把以下值作为对照测试起点:

keepalive_timeout 15s;
keepalive_requests 1000;

这不是通用推荐阈值。缩短客户端keepalive时间可能减少Waiting连接和文件描述符占用,却会增加TCP/TLS重建成本。香港服务器面对较高RTT的访问来源时,连接复用通常更有价值。

如果Waiting较多,但CPU、RSS、文件描述符和响应时间都稳定,没有必要仅为了让Active下降而关闭长连接。反之,若大量低复用连接长期占用资源,才应测试缩短空闲时间,并同时观察新建连接率、TLS CPU开销和客户端首字节时间。

三、CPU变高时,用网络、I/O与内存排除替代解释

CPU升高不一定意味着需要增加CPU,也不一定意味着Nginx配置有问题。应先确定增长发生在哪个进程、哪个CPU时间分类,以及它是否领先于响应时间恶化。

CPU、队列与上游时间一起升高

如果应用进程CPU明显增加,Nginx CPU变化不大,且upstream_response_time、应用任务队列同步上升,主要瓶颈通常在应用侧。此时提高Nginx连接数只能让更多请求进入等待。

如果Nginx的user CPU随响应体增大而上升,优先检查TLS、压缩和响应过滤;如果system或softirq占比升高,应检查短连接频率、包速率、重传以及网络处理负载。

还应看单核分布。整机平均CPU为50%,不代表每个worker都有余量;单个核心长期繁忙可能已经造成局部排队。虚拟服务器若steal明显上升,也应把资源竞争作为候选原因,而不是直接归因于网站代码。

带宽接近上限时,低CPU同样可能很慢

以十进制单位估算:800次响应/秒,每次平均发送25 kB,则正文数据约为:

800 × 25,000 × 8 = 160,000,000 bit/s,即160 Mbps。

这个结果还没有计入协议开销、响应头、重传及其他流量。如果服务器出口为200 Mbps,正文流量就已占约80%。继续放大连接数可能增加发送排队,表现为Writing增加、request_time变长,而上游时间保持稳定。

因此,香港服务器还应把不同访问来源分开观察:

  • 多个地区同时变慢,且出口速率逼近限制:优先检查服务器出口与发送队列。
  • 只有某个地区或运营商变慢,服务器资源稳定:优先检查对应路径的RTT、丢包和重传。
  • 上游时间不变,但用户端耗时增加:不要直接用增加应用worker的方式处理。

I/O和内存压力可能来自缓冲与缓存

反向代理开启响应缓冲后,Nginx可以较快接收上游响应,再向较慢客户端发送,降低上游被慢客户端长期占用的程度。但较大响应可能产生临时文件写入,磁盘压力随之增加。

增加proxy_buffers也不是免费的。例如,每个活跃请求对应8个16 KiB缓冲块,仅这些缓冲块的配置容量就是128 KiB;2000个请求对应约250 MiB。实际分配和占用与响应过程有关,不能把这个估算当作固定RSS,但足以说明批量放大缓冲的内存风险。

判断时应同时看worker RSS、系统可用内存、swap活动、临时目录写入和磁盘延迟。Linux文件页缓存增加并不等同于进程内存泄漏;持续swap活动、worker RSS增长和长尾恶化同时出现,才更值得关注。

围绕Nginx高并发业务的计算、内存与I/O需求,A5数据提供香港物理服务器租用,涵盖Xeon Gold与AMD EPYC平台,并有大内存、SSD或NVMe存储配置,为反向代理、应用服务、数据库缓存及静态资源承载提供资源基础。香港产品还提供不同套餐的CN2与国际带宽方案,将服务端处理资源与面向不同访问来源的网络需求结合,支持企业网站、业务后台和接口服务的部署。

四、缓存、压缩与静态资源,分别对应不同瓶颈

窗口C的改善来自减少重复处理,但缓存并非适用于所有接口。应先确定内容能否共享,再根据命中率、回源请求量和上游CPU验证收益。

公共响应缓存:降低上游重复计算

下面示例只缓存公开、无身份关联的查询路径。缓存目录需预先准备,磁盘容量和Nginx运行用户权限应与实际环境匹配:

proxy_cache_path /var/cache/nginx/public_api
    levels=1:2
    keys_zone=public_api:32m
    max_size=2g
    inactive=10m
    use_temp_path=off;

upstream app_backend {
    server 127.0.0.1:9000;
    keepalive 64;
}

server {
    listen 80;
    server_name example.com;

    location /public-data/ {
        proxy_pass http://app_backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host $host;

        proxy_cache public_api;
        proxy_cache_key "$scheme|$host|$request_uri";
        proxy_cache_valid 200 30s;
        proxy_cache_lock on;

        proxy_cache_bypass $http_authorization $http_cookie;
        proxy_no_cache $http_authorization $http_cookie
                       $upstream_http_set_cookie;

        proxy_connect_timeout 2s;
        proxy_send_timeout 10s;
        proxy_read_timeout 15s;
        proxy_buffering on;

        add_header X-Cache-Status $upstream_cache_status always;
    }
}

以上指令放在现有http块内;80端口仅用于展示站点结构,生产HTTPS站点应合并到已有TLS配置。

这里的缓存边界是:

  • 仅用于明确允许共享的公共响应,不用于订单、账户、权限结果和用户专属数据。
  • 默认缓存方法为GET、HEAD;不要随意扩展到写操作。
  • 请求携带Authorization或Cookie时,保守地绕过缓存。
  • 保留Nginx对上游Cache-Control、Expires、Vary、Set-Cookie等字段的正常处理,不通过忽略响应头强行缓存。

proxy_cache_valid 200 30s提供的是符合缓存条件时的有效期设置;上游缓存控制头仍可能影响实际有效期。业务应定义可接受的数据陈旧范围,而不是把30秒当作所有接口都适用的值。

keys_zone=32m主要用于缓存键等共享元数据,不是把32 MiB响应内容全部放进内存;max_size控制磁盘缓存规模,清理也不是瞬间完成。验证缓存时至少同时看命中率、回源请求数、上游CPU、缓存目录I/O和数据正确性。

压缩:带宽下降是否足以抵消CPU增加

文本资源可以采用适中的压缩等级进行对照:

gzip on;
gzip_comp_level 4;
gzip_min_length 1024;
gzip_vary on;
gzip_types text/css application/javascript image/svg+xml;

JPEG、视频和压缩包通常不需要再做gzip。等级提高是否值得,应以节省的出口流量和增加的CPU为依据,而不是以压缩率单独判断。

若网络接近上限、CPU仍有余量,适度压缩可能缩短发送时间;若CPU已经导致排队,继续提高压缩等级可能使P95更差。含敏感内容且混合可控输入的动态响应,还需要评估压缩侧信道风险,不能简单套用静态资源策略。

静态资源:减少应用参与,避免错误缓存

静态文件可以由Nginx直接提供,并在适用环境中使用sendfile。对内容哈希命名的资源,例如带版本指纹的JS、CSS,可以设置较长缓存期;HTML入口和会原地更新的文件则应采用较短缓存或协商缓存。

把静态资源交给Nginx后,如果应用CPU下降但出口速率仍然饱和,说明计算瓶颈得到缓解,网络瓶颈仍在。此时再比较浏览器缓存、资源体积优化与CDN分发,而不是继续增加应用连接数。

五、反向代理连接复用与超时,要约束等待而非掩盖故障

客户端keepalive与上游keepalive是两套机制。前者减少客户端重复建连,后者减少Nginx到应用的重复建连。

示例中的keepalive 64表示每个worker可保留的空闲上游连接数量,不是上游总并发上限。4个worker最多可形成约256条此类空闲连接,活跃连接还要另外计算。因此,连接池需要结合应用最大连接数和实际复用率评估。

当upstream_connect_time下降,而完整上游响应时间几乎不变,说明连接复用优化了建连成本,但主要耗时仍在应用处理。若上游连接时间上升,可能涉及监听队列、连接资源或链路问题,需要继续核验,不能仅凭这个字段断定网络故障。

超时限制的是哪一段等待

参数作用调整时同时观察
proxy_connect_timeout建立上游连接的等待时间连接失败、上游监听队列、链路RTT
proxy_send_timeout向上游发送请求时,两次写操作之间的超时大请求上传、上游接收能力
proxy_read_timeout从上游读取响应时,两次读操作之间的超时应用执行时间、流式输出、504比例
send_timeout向客户端发送响应时,两次写操作之间的超时慢客户端、公网链路、发送队列

其中proxy_read_timeout不是整个请求的总时长限制。持续输出数据的流式响应,即使总时间较长,也未必触发它。

上下两个对照区使用相同秒刻度,持续输出区每10秒出现一次读取事件,停滞区在首次读取后15秒没有新数据而超时;明确只示意上游读取阶段

示例中的2秒、10秒、15秒只是针对本机普通公共查询接口的测试值。跨机房上游、上传、报表和流式接口应分别设定,不能整站套用。超时缩短后若连接下降、错误率上升,只能说明请求更早被终止,不能说明性能改善;超时延长后若错误减少但P99和队列持续增长,也可能只是把故障推迟。

499通常意味着客户端提前断开,需要结合客户端超时与链路分析;502和504则应对应上游错误日志、连接情况和等待阶段。重试同样要关注额外上游请求量,尤其不能未经业务确认就重试可能产生副作用的写操作。

六、形成判断后复测,让改善同时体现在吞吐与尾延迟

配置修改前应备份当前配置及相关include文件,记录原值与影响站点。缓存目录、服务资源限制等变更要单独记录影响范围;回滚时恢复原配置或资源设置,再按原服务管理方式加载。不要把连接上限、压缩、缓存和超时一次性全部修改,否则难以判断收益来源。

一次有效的复测可以按以下顺序进行:

  1. 保持请求组成和速率不变,只修改一个因素。
  2. 使用实际运行的Nginx二进制和配置路径执行nginx -t。
  3. 检查通过后,按现有服务管理方式平滑加载;检查失败则不加载,恢复修改。
  4. 等待预热完成及旧worker退出,再采集稳定窗口。
  5. 同时比较成功吞吐、P95/P99、错误率、资源压力和响应内容正确性。
  6. 对缓存、长连接分别补做冷缓存和低复用场景,避免只验证有利条件。

如果修改后无法加载,应检查指令所属层级、模块支持、目录权限和端口冲突;如果能够加载但延迟或错误恶化,则恢复原值,并保留对应窗口数据。验收标准不应只是“连接数更多”或“CPU更低”,而应是同等请求压力下,成功吞吐满足需求、长尾可控、错误没有扩大,并且上游仍有可用余量。

下一次提高香港服务器Nginx连接上限时,建议固定观察四组联动指标:Active/Waiting+worker文件描述符;CPU分布+P95/P99;上游响应时间+应用队列;出口速率/重传+Writing连接。加入缓存时,再补充命中率、回源量和缓存I/O;调整压缩时,则补充平均响应字节数。只有这些指标在同一窗口内支持同一个判断,连接数调整才是容量优化,而不只是把等待从入口移到了系统内部。