详解Nginx服务器中的Socket切分

 更新时间:2015年06月26日 10:43:10   投稿:goldensun  
这篇文章主要介绍了Nginx服务器中的Socket切分,以新发布的1.9.1版本的Nginx为基础,需要的朋友可以参考下

NGINX发布的1.9.1版本引入了一个新的特性:允许使用SO_REUSEPORT套接字选项,该选项在许多操作系统的新版本中是可用的,包括DragonFly BSD和Linux(内核版本3.9及以后)。该套接字选项允许多个套接字监听同一IP和端口的组合。内核能够在这些套接字中对传入的连接进行负载均衡。

(对于NGINX Plus客户,此功能将在年底发布的版本7中出现)

SO_REUSEPORT选项有许多潜在的实际应用。其他服务也可以使用它来简单实现执行中的滚动升级(Nginx已经通过不同的办法支持了滚动升级)。对于NGINX而言,启用该选项可以减少在某些场景下的锁竞争而改善性能。


如下图描述,当SO_REUSEPORT选项有效时,一个单独的监听socket通知工作进程接入的连接,并且每个工作线程都试图获得连接。

2015626103725449.png (850×785)

当SO_REUSEPORT选项启用是,存在对每一个IP地址和端口绑定连接的多个socket监听器,每一个工作进程都可以分配一个。系统内核决定哪一个有效的socket监听器(通过隐式的方式,给哪一个工作进程)获得连接。这可以减少工作进程之间获得新连接时的封锁竞争(译者注:工作进程请求获得互斥资源加锁之间的竞争),同时在多核系统可以提高性能。然而,这也意味着当一个工作进程陷入阻塞操作时,阻塞影响的不仅是已经接受连接的工作进程,也同时让内核发送连接请求计划分配的工作进程因此变为阻塞。

2015626103752434.png (850×780)

 设置共享Socket

为了让SO_REUSEPORT socket选项起作用,应为HTTP或TCP(流模式)通信选项内的listen项直接引入新近的reuseport参数,就像下例这样:
 

复制代码 代码如下:

http {
     server {          listen 80 reuseport;
          server_name  localhost;
          ...
     }
}
 
stream {
     server {          listen 12345 reuseport;
          ...
     }
}

引用reuseport参数后,对引用的socket,accept_mutex参数将会无效,因为互斥量(mutex)对reuseport来说是多余的。对没有使用reuseport的端口,设置accept_mutex仍然是有价值的。

reuseport的基准性能测试

我在一个36核的AWS实例运行wrk基准测试工具测试4个NGINX 工作进程.为了减少网络的影响,客户端和NGINX都运行在本地,并且让NGINX返回OK字符串而不是一个文件。我比较三种NGINX配置:默认(等同于accept_mutex on ),accept_mutex off,和reuseport。如图所示,reuseport的每秒请求是其余的两到三倍,同时延迟和延迟标准差也是减少的。

2015626103816357.png (595×333)

 我又运行了另一个相关的性能测试——客户端和NGINX分别在不同的机器上且NGINX返回一个HTML文件。如下表所示,用 reuseport 减少的延迟和之前的性能测试相似,延迟的标准差减少的更为显著(接近十分之一)。其他结果(没有显示在表格中)同样令人振奋。使用 reuseport ,负载被均匀分离到了worker进程。在默认条件下(等同于 accept_mutex on),一些worker分到了较高百分比的负载,而用 accept_mutex off 所有worker都受到了较高的负载。

 

复制代码 代码如下:
Latency (ms)  Latency stdev (ms)  CPU Load
Default  15.65  26.59  0.3
accept_mutex off  15.59  26.48  10
reuseport  12.35  3.15  0.3

 

在这些性能测试中,连接请求的速度是很高的,但是请求不需要大量的处理。其他的基本的测试应该指出——当应用流量符合这种场景时 reuseport 也能大幅提高性能。(reuseport 参数在 mail 上下文环境下不能用在 listen 指令下,例如email,因为email流量一定不会匹配这种场景。)我们鼓励你先测试而不是直接大规模应用。关于测试NGNIX性能的一些技巧,看看Konstantin Pavlov在nginx2014大会上的演讲

相关文章

  • Linux漏洞扫描工具lynis使用方法解析

    Linux漏洞扫描工具lynis使用方法解析

    这篇文章主要介绍了Linux漏洞扫描工具lynis使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • centos7.2.1511安装jdk1.8.0_151及mysql5.6.38的方法

    centos7.2.1511安装jdk1.8.0_151及mysql5.6.38的方法

    这篇文章主要介绍了centos7.2.1511安装jdk1.8.0_151及mysql5.6.38的方法,较为详细的讲述了centos7.2.1511安装jdk1.8.0_151及mysql5.6.38的具体步骤与相关设置技巧,需要的朋友可以参考下
    2018-01-01
  • Apache ECharts介绍

    Apache ECharts介绍

    Apache ECharts 是一款基于 JavaScript 的数据可视化图表库,提供直观、生动、可交互、可个性化定制的数据可视化图表,本文给大家分享Apache ECharts简介,感兴趣的朋友一起看看吧
    2023-11-11
  • 浅谈linux rwxrwxrwt文件夹属性

    浅谈linux rwxrwxrwt文件夹属性

    下面小编就为大家带来一篇浅谈linux rwxrwxrwt文件夹属性。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • Linux创建进程达到65535的方法

    Linux创建进程达到65535的方法

    这篇文章主要介绍了Linux创建进程达到65535的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • 在 CentOS 8/RHEL 8 上安装和使用 Cockpit的方法

    在 CentOS 8/RHEL 8 上安装和使用 Cockpit的方法

    Cockpit 是一个基于 Web 的服务器管理工具,可用于 CentOS 和 RHEL 系统。最近发布的 CentOS 8 和 RHEL 8,其中 cockpit 是默认的服务器管理工具。这篇文章主要介绍了在 CentOS 8/RHEL 8 上安装和使用 Cockpit的方法,需要的朋友可以参考下
    2019-10-10
  • kali linux 系统版本的查看方法

    kali linux 系统版本的查看方法

    今天小编就为大家分享一篇kali linux 系统版本的查看方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Apache RewriteBase 指令使用介绍

    Apache RewriteBase 指令使用介绍

    RewriteBase指令显式地设置了目录级重写的基准URL。在下文中,你将看到RewriteRule可以用于目录级的配置文件中(.htaccess)并在局部范围内起作用,即规则实际处理的只是剥离了本地路径前缀的一部分
    2016-04-04
  • CentOS Yum编译安装MySQL 5.6

    CentOS Yum编译安装MySQL 5.6

    这篇文章主要为大家详细介绍了CentOS Yum编译安装MySQL 5.6,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 在Linux中打开、提取和创建rar文件的操作方法

    在Linux中打开、提取和创建rar文件的操作方法

    RAR 是一种流行的文件压缩格式,以其高效的压缩算法和将大文件压缩为较小档案的能力而闻名,虽然 Linux 本身支持 ZIP 和 TAR 等常见档案格式,但处理 RAR 文件需要额外的工具,在这篇博文中,我们将探讨如何在 Linux 中打开、提取和创建 RAR 文件,需要的朋友可以参考下
    2024-04-04

最新评论