nginx压测记录

news2024/11/26 1:56:44

nginx压测记录

  • 1 概述
  • 2 原理
  • 3 环境
    • 3.1 设备与部署
    • 3.2 nginx配置/服务器配置
  • 4 netty服务
  • 5 步骤
  • 6 结果
  • 7 写在最后

1 概述

都说nginx的负载均衡能力很强,最近出于好奇对nginx的实际并发能力进行了简单的测试,主要测试了TCP/IP层的长链接负载均衡

2 原理

准备netty服务器与客户端,netty-client每秒向netty-server发送1条数据,netty-server接收各netty-client的数据,检查数据序号的连续性从而检查是否丢包,然后将数据发到内存,再由各数据存储线程将数据存储到本地磁盘,通过数据检查程序也可以检查并提取单个客户端的所有数据,通过随机抽样检查单个客户端发送的数据是否正常

3 环境

3.1 设备与部署

设备操作系统部署服务
服务器1centos7nginx
服务器2centos7netty-server
服务器3centos7netty-server
PC1win10/7netty-client(10000个)
PC1win10/7netty-client(10000个)
PC1win10/7netty-client(10000个)
PC1win10/7netty-client(10000个)
PC1win10/7netty-client(10000个)
PC1win10/7netty-client(10000个)
PC1win10/7netty-client(10000个)

3.2 nginx配置/服务器配置

  • 若nginx报错accept() failed (24: Too many open files),基本是应为系统对同时打开的文件数做了限制,需要对系统以及nginx都进行配置

系统配置:


查看当前用户可同时打开的文件句柄数

ulimit -n

通过命令进行设置(这样设置服务器重启会失效,但可以在/etc/profile文件追加ulimit -n 65535,只针对当前用户有效)

ulimit -n 65535

通过修改系统配置文件进行设置

修改/etc/security/limits.conf文件,追加如下内容
在这里插入图片描述
*代表所有用户,如果想代表某个用户的话,则user soft nofile 65535
soft代表软连接 hard代表硬限制

具体可以参考这篇文章: http://t.csdn.cn/MKZkR

nginx配置


worker_processes 指令控制工作进程数,其默认值为1,这意味着NGINX只运行一个worker。 该值应根据可用内核数,磁盘,网络子系统,服务器负载等更改为最佳值。一般设置为可用的(cpu)核心数。或者,可以将其设置为auto。 这样nginx会自动根据核心数为生成对应数量的worker进程。
worker_rlimit_nofile 同时连接的数量受限于系统上可用的文件描述符的数量,因为每个套接字将打开一个文件描述符。 如果NGINX尝试打开比可用文件描述符更多的套接字,会发现error.log中出现Too many opened files的信息。
worker_connections 该指令设置单个worker进程最大打开的连接数

配置例子内容如下:
在这里插入图片描述
其中worker_rlimit_nofile = worker_processes*worker_connections,worker_rlimit_nofile受限于系统的文件句柄数

  • 若nginx报错no live upstreams while connecting to upstream
    //后续补充///

  • 一般情况下nginx配置对优化比较有作用的为一下几项:

1worker_processesnginx进程数,建议按照cpu 数目来指定,一般为它的倍数
2worker_cpu_affinity为每个进程分配cpu,或者将一个进程分配到多个cpu
3worker_rlimit_nofile这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是系统最多打开文件数
4worker_rlimit_nofile这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是系统最多打开文件数
5use epoll使用epoll 的I/O 模型
6worker_connections每个进程允许的最多连接数, 理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections。
7keepalive_timeout超时时间
8client_header_buffer_size客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE 取得。
9open_file_cache这个将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
10open_file_cache_valid这个是指多长时间检查一次缓存的有效信息
11open_file_cache_min_usesopen_file_cache 指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除
  • 内核参数优化
1net.ipv4.tcp_max_tw_bucketstimewait 的数量,默认是180000
2net.ipv4.ip_local_port_range允许系统打开的端口范围。
3net.ipv4.tcp_tw_recycle启用timewait 快速回收
4net.ipv4.tcp_tw_reuse开启重用。允许将TIME-WAIT sockets 重新用于新的TCP 连接。
5net.ipv4.tcp_syncookies开启SYN Cookies,当出现SYN 等待队列溢出时,启用cookies 来处理。
6net.core.somaxconnweb 应用中listen 函数的backlog 默认会给我们内核参数的net.core.somaxconn 限制到128,而nginx 定义的NGX_LISTEN_BACKLOG 默认为511,所以有必要调整这个值。
7net.core.netdev_max_backlog每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
8net.ipv4.tcp_max_orphans系统中最多有多少个TCP 套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS 攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。
9net.ipv4.tcp_max_syn_backlog记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M 内存的系统而言,缺省值是1024,小内存的系统则是128。
10net.ipv4.tcp_timestamps时间戳可以避免序列号的卷绕。一个1Gbps 的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。
11net.ipv4.tcp_synack_retries为了打开对端的连接,内核需要发送一个SYN 并附带一个回应前面一个SYN 的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量。
12net.ipv4.tcp_syn_retries在内核放弃建立连接之前发送SYN 包的数量。
13net.ipv4.tcp_fin_timeout如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2 状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒。2.2 内核的通常值是180 秒,3你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB 服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2 的危险性比FIN-WAIT-1 要小,因为它最多只能吃掉1.5K 内存,但是它们的生存期长些。
14net.ipv4.tcp_keepalive_time当keepalive 起用的时候,TCP 发送keepalive 消息的频度。缺省是2 小时。

4 netty服务

https://github.com/Abstract-Class/netty-test

  • netty-server
    代码放到了GitHub
  • netty-client
    代码放到了GitHub

5 步骤

  • 部署nginx服务并配置反向代理
  • 部署netty-server
  • 逐个开启netty-client
  • 逐个关闭netty-client
  • 查看客户端数据连续性统计结果
  • 通过数据检查程序抽样检查单个netty-client数据的正确性

6 结果

  • 使用两台服务器
连接数服务器具体的状态数据情况
60000服务器正常数据自检正常,抽样检查正常
70000nginx报错no live upstreams while connecting to upstream数据自检正常,数据抽样检查正常
  • 使用单台服务器
    /后续完善//

7 写在最后

笔者水平有限,结果仅供参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/529642.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 与数据科学实验(Exp9)

实验9 多分类手写数字识别实验 1.实验数据 (1)训练集 所给数据一共有42000张灰度图像(分辨率为28*28),目前以train_data.csv文件给出. 图像内容涵盖了10个手写数字0-9。 图像示例如图所示: train_data.…

算法(一)—— 回溯(4)困难题

文章目录 1 37 解数独2 51 N 皇后 1 37 解数独 首先明确需要两个for循环,这样才可以遍历整个9*9的表。 此题数字的选取逻辑再次展现了回溯的暴力性。 此题需要拥有返回值,与数据结构(六)—— 二叉树(5)中…

物联网和云计算:如何将设备数据和云端服务相结合

第一章:引言 物联网和云计算是当今IT领域中的两个重要概念,它们的结合为企业和个人带来了巨大的机遇和挑战。物联网通过连接各种设备和传感器,实现了设备之间的互联互通,而云计算则提供了强大的计算和存储能力。本文将深入探讨如何…

MySQL学习(基础篇1.0)

MySQL概述(基础) SQL 全称Structured Query Language,结构化察浑语言。操作关系型数据库的编程语言,定义了一套操作关系型数据库的统一标准。 SQL通用语法 SQL语言的统统用语法: SQL语句可以单行或多行书写,以分号…

论文阅读|基于图神经网络的配电网故障定位方法

来源:北京交通大学硕士学位论文,2022 摘要 电网拓扑形态多样,重构场景频繁,,传统故障定位方法的单一阈值设定无法满足要求,基于人工智能的配电网故障定位技术具有很大的应用潜力,但仍存在着拓…

HTML概述及常用语法

什么是 HTML HTML 用来描述网页的一种语言 HTML -- hyper text markup language 超文本标记语言 超文本包括&#xff1a;文字、图片、音频、视频、动画等等 标记语言&#xff1a;是一套标记标签&#xff0c; HTML 使用标记标签来 描述 网页 <> HTML 发展史 HTML5 …

Web基础 ( 二 ) CSS

2.CSS 2.1.概念与基础 2.1.1.什么是CSS Cascading Style Sheets 全称层叠样式单 简称样式表。 是告诉浏览器如何来显示HTML的元素的特殊标记 2.1.2.编写方式 2.1.2.1.外部文件 在html文件的<head>中加入<link>结点来引入外部的文件 <link rel"stylesh…

Go Wails Docker图形界面管理工具 (5)

文章目录 1. 前言2. 效果图3. 代码 1. 前言 接上篇&#xff0c;本次添加Docker存储卷功能 待优化: 优化分页效果添加存储卷大小查看功能 2. 效果图 3. 代码 直接调用官方库 app.go func (a *App) VolumeList() ([]*volume.Volume, error) {resp, err : Cli.VolumeList(context…

Linux中关于时间修改的命令

目录 Linux中关于时间修改的命令 data命令 语法格式 示例 date命令中的参数以及作用 常用格式示例 timedatectl命令 语法格式 timedatectl 命令中的参数以及作用 常用格式 Linux中关于时间修改的命令 data命令 data --- 用于显示或设置系统的时间与日期 用户只需在强…

干货丨警惕!14个容易导致拒稿的常见错误

Hello,大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 从做研究、到写论文、再到投稿&#xff0c;每一步都是巨大的挑战。以下列举了一些在这些过程中可能导致拒稿的常见错误&#xff0c;希望能帮助大家避开。 01 格式问题 1.没有遵守投稿须知 期刊提供了…

oracle基于时间点恢复遇到ORA-10877错误

一次给客户进行基于时间点恢复的时候,出现报错ORA-10877,如下: 这里很奇怪,这个归档日志有的,当前全库的备份是05-14 23点的,所以应该是可以恢复的,检查一下alter日志: 这里报错,指定的时间scn不属于当前的incarnation,那么检查一下当前的incarnation: 这里当前的incarnation是…

Linux实操篇---常用的基本命令3(用户(组)管理命令、文件权限类、搜索查找类、压缩解压类)

一、用户管理命令 Linux是一个多用户&#xff0c;多任务的分时操作系统。甚至有可能同时登录&#xff0c;同时操作。所以给用户不同的账号。 useradd添加新用户 基本语法&#xff1a; 只能用root进行操作。 useradd 用户名 添加新用户 useradd -g 组名 用户名 添加新用…

MyBatis Plus 代码生成器

一、引入POM依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency><dependency><groupId>com.baomidou</groupId&g…

3ds Max云渲染平台哪个好?

3ds Max云渲染平台哪个好&#xff1f; 3ds Max是一款包含建模、动画、粒子动力学等强大功能的三维动画制作软件&#xff0c;3ds Max对特定如游戏建模、特效制作、产品模型设计等领域都具备了过硬的专业能力&#xff0c;同时3ds Max也是很多CGer青睐的CG软件。 作为支持3ds Ma…

黑马Redis笔记高级篇 | Redis最佳实践

黑马Redis笔记高级篇 | Redis最佳实践 1、Redis键值设计1.1、优雅的key结构1.2、拒绝BigKey1.3、恰当的数据类型1.4、总结 2、批处理优化1.1、Pipeline1.2、集群下的批处理 3、服务端优化3.1、持久化配置3.2、慢查询3.3、命令及安全配置3.4、内存配置 4、集群最佳实践 1、Redis…

深度学习用于医学预后-第二课第三周14-15节-评估方法比较以及Kaplan-Meier估计

评估对比 我们现在对 t25 的生存率得出了一个新的估计值&#xff0c;为0.56。现在&#xff0c;让我们将其与之前所做的估计进行比较。 当我们假设所有患者在他们截尾时间立即死亡时&#xff0c;我们获得了一个低生存概率为0.29。而在另一极端&#xff0c;如果我们假设他们永久…

LeetCode 周赛 345(2023/05/14)体验一题多解的算法之美

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 提问。 往期回顾&#xff1a;LeetCode 双周赛第 104 场 流水的动态规划&#xff0c;铁打的结构化思考 周赛概览 T1. 找出转圈游戏输家&#xff08;Easy&#xff09; 标签&#xff…

微信小程序入门02-安装mysql

我们上一篇介绍的是微信开发者工具的安装&#xff0c;开发一个小程序肯定要有后端服务&#xff0c;有后端服务首先要可以存储和查询数据。 数据库种类比较多&#xff0c;我们这里选择mysql&#xff0c;为啥选择这个呢&#xff0c;因为首先用的人多比较稳定&#xff0c;再一个免…

MapReduce:Index索引案例

案例需求 a.html hello world hello lucy hello jack hello liuyan b.html hello aaa aaa bbb bbb ccc hello liuyan liuyan tangyan c.html world hello liuyan tangyan tangyan aaa bbb ccc 计算每个单词在每个文件中出现的次数 aaa b.html-2 c.html-1 bbb b.h…

文本三剑客awk

awk 工作原理&#xff1a; 逐行读取文本&#xff0c;默认以空格或tab键为分隔符进行分隔&#xff0c;将分隔所得的各个字段保存到内建变量中&#xff0c;并按模式或者条件执行编辑命令。 sed命令常用于一整行的处理&#xff0c;而awk比较倾向于将一行分成多个“字段”然后再进…