0%

本文首发于《中国金融电脑》第420期,金网在线地址链接

引言:

随着云原生、微服务的飞速发展,传统的负载均衡技术已逐渐难以满足日益复杂的业务需求。为了应对这一挑战,分布式负载均衡技术应运而生,它以其卓越的弹性、自助操作和可观测性,成为现代数据中心网络设计的核心。
本系列文章旨在深入探讨分布式负载均衡系统的多维度价值,从基础概念到技术实现,再到实际应用案例的全面分析。我希望通过这一系列的深入剖析,为读者提供一个全面的视角,理解分布式负载均衡技术如何为企业构建一个更加稳定、灵活和高效的网络环境。

系列概览:

  1. 构建弹性网络之分布式负载均衡技术(一):概念与功能
    在本篇中,我将介绍分布式负载均衡的基本概念,探讨其核心功能以及它如何为企业网络带来革命性的改进。
  2. 构建弹性网络之分布式负载均衡技术(二):技术与实现
    第二篇文章将深入技术层面,分析分布式负载均衡的关键技术要素,以及如何实现这些技术,确保网络的高性能和高可用性。
  3. 构建弹性网络之分布式负载均衡技术(三):案例与分析
    最后一篇将通过实际案例展示分布式负载均衡技术的应用效果,分析其在不同业务场景下的表现和优势。
    通过本系列文章,我期望读者能够获得必要的知识,以评估和实施分布式负载均衡解决方案,从而提升自身网络的弹性和响应能力,满足不断变化的业务需求。
    阅读全文 »

当下性能测试已成为确保软件质量的关键环节。其中,wrk作为一款轻量级、高性能的HTTP基准测试工具,以其简洁的命令行界面和出色的性能著称。wrk通过-c参数能够模拟高并发的网络请求,帮助我们评估服务器在极端负载下的表现。如果你打算做C10K数万并发连接这个量级的测试,wrk是合适的(相比ab/jmeter等工具),然而,如果你想尝试进行数百万级别的高并发测试时,官方wrk就无能为力了。

首先,wrk不支持自定义源IP地址,这在需要模拟来自不同客户端的请求时尤为不便,做并发测试时TCP连接数也上不去(此时你在curl命令中验证会看到类似Cannot assign request address的错误)。其次,wrk在每个连接上预分配的内存相对较大,这在单机上尝试建立大量连接时,会导致内存资源迅速耗尽,wrk进程会因为OOM被内核杀掉(如果wrk进程突然消失,你通常可以在/var/log/messages中看到形如Out of memory的日志)。这些限制对于需要评估高性能服务的开发者来说,无疑是一个不小的障碍。

在接下来的内容中,我将探讨如何通过修改wrk源码解决上述问题,以期帮助读者更好地利用wrk进行极限并发测试。

阅读全文 »

有同学反馈:在配置Nginx四层限速时,proxy_upload_rate和proxy_download_rate有一定的概率不生效。我按照他的步骤也能复现,但这与官方Nginx很稳定(相对其他开源软件)的印象并不相符,是不是Nginx的官方BUG呢?这里的真实原因,其实是Nginx字节限速机制与时间更新频率的协商导致的,这篇文章我们就来研究下Nginx的字节限速。

首先看下测试场景:基于UDP协议搭建四层代理(UDP协议更简单,更容易复现BUG),在nginx.conf中配置每秒最大上传10个字节:

1
proxy_upload_rate 10;

客户端先发送10字节,服务器接收到后(用回包触发)客户端立刻再次发送10字节,预期服务器将在1秒后收到第2个报文,但实际上服务器有可能立刻收到报文,即proxy_upload_rate未生效或者不可控!一旦配置项处于不可解释的状态,这对于严谨的应用场景是不可接受的。而这个现象的原因,本质上是目前Nginx实现机制所致,接下来我会基于1.21版本的源码上解释其原理。

基于字节的限速实现原理

首先,我们要明确上例属于Nginx中的哪种限速。由于Nginx使用了内核协议栈,因此Nginx既不能对Packet级别的报文、也不能对TCP连接建立进行限速,而是只能在用户态基于调用socket编程API的时机,在字节转发速率、应用层协议的HTTP请求上(如官方的limit_req)做限制。
socket与TCP协议栈

阅读全文 »

文章简介: 本文是我在《F5 NGINX Sprint 2022》大会分享的文字版整理。《NGINX网络协议栈优化》有两个关键词,第一个是网络协议,因此不涉及 NGINX 的业务模块。第二个关键词是性能优化,目标是让NGINX的性能达到目前硬件架构的极限。

很高兴大家回到这次深潜之旅,让我们继续挖掘 NGINX 的潜力。今天我的分享包括四个部分。首先从整体上来看一下 NGINX的协议栈如何进行优化。接着我们将按照 OSI七层网络模型,自上而下依次讨论HTTP协议栈、TLS/SSL协议栈以及TCP/IP协议栈。

首先要明确NGINX的优化方向。优化的目标在我看来可以用三个词表示——快、多、省

  • ”是指降低请求的时延,请求时延是用户能够感知到的最明显因素。
  • ”指的是 NGINX正在处理的所有TCP连接数量以及收发的总字节数,比如总吞吐量能否打满网卡。
  • ”指处理一个 TCP 连接时所消耗的资源要尽量的少,这样我们的并发连接才能够达到千万、亿级别。

在做协议栈优化时,我们必须同时兼顾知识深度广度。开发习惯从实现的角度看问题,知识面倾向深度。而运维更关注服务部署、运行,比如要了解IDC地理位置、网络规划、服务器硬件配置等情况,因此知识面是倾向广度的。NGINX运行在 Linux 或者 FreeBSD 等操作系统上,操作系统的内核协议栈和进程调度机制都会影响 NGINX 性能,所以优化内核参数时相对更需要深度。了解 NGINX 所在网络环境,针对丢包率、网卡特性、CPU特性、交换机和防火墙的规格、协议特性等要素优化 NGINX 时,相对又会偏重广度。

NGINX 协议栈优化方法论

首先我们看下面两张图,先同步下思路。

NGINX架构

第一张图由 NGINX 官方提供,我们从三个层面来解读它。
官方架构

阅读全文 »

开源版Nginx最为人诟病的就是不具备动态配置、远程API及集群管理的能力,而APISIX作为CNCF毕业的开源七层网关,基于etcd、Lua实现了对Nginx集群的动态管理。
apisix架构图

让Nginx具备动态、集群管理能力并不容易,因为这将面临以下问题:

  • 微服务架构使得上游服务种类多、数量大,这导致路由规则、上游Server的变更极为频率。而Nginx的路由匹配是基于静态的Trie前缀树、哈希表、正则数组实现的,一旦server_name、location变动,不执行reload就无法实现配置的动态变更;
  • Nginx将自己定位于ADC边缘负载均衡,因此它对上游并不支持HTTP2协议。这增大了OpenResty生态实现etcd gRPC接口的难度,因此通过watch机制接收配置变更必然效率低下;
  • 多进程架构增大了Worker进程间的数据同步难度,必须选择1个低成本的实现机制,保证每个Nginx节点、Worker进程都持有最新的配置;

等等。

APISIX基于Lua定时器及lua-resty-etcd模块实现了配置的动态管理,本文将基于APISIX2.8、OpenResty1.19.3.2、Nginx1.19.3分析APISIX实现REST API远程控制Nginx集群的原理。

阅读全文 »