ab压力测试 和 nginx 配置优化 及 用户打开的最大进程数

2023-11-09

原文:https://blog.csdn.net/wudinaniya/article/details/86064797 
 

一 ab压力测试 和 nginx 配置优化
压力测试工具 ApacheBench 简称ab,是Apache 中自带的基准性能测试的工具。通过ab命令可以创建并发线程模拟多用户访问或调用某一URL地址。
为了测试服务器的并发能力,可以利用apache 中 提供的 ApacheBench 工具,该工具可以在一台计算机中向一个 url 地址发送大量的并发请求,然后检测服务器响应这些请求花费了多少时间,有多少请求处理失败。利用ApacheBench(简称ab)工具可以模拟一台服务器被大量客户端并发连接的情况,以测试服务器的并发能力。

ApacheBench的安装

执行sudo yum -y install httpd-tools 安装apache httpd的工具包,这个工具包中包含压力测试工具ApacheBench。

[root@jtfwq ~]# rpm -qa httpd-tools
[root@jtfwq ~]# yum -y install httpd-tools


nginx 配置优化

1 连接数优化

当nginx作为负载均衡服务器时,能够接收的并发连接应该越多越好。我们可以用 ApacheBench 工具来测试服务器的并发能力。

为了准备测试环境,使用VMware部署两台虚拟机,如图所示。

在上图中,服务器是待测试机,安装了nginx并使用默认配置;客户端使用 ab 工具进行并发访问测试。

linux系统默认限制了一个进程最多打开的文件数量。通过 ulimit -a|grep open 可以查看当前系统的限制。


使用ab工具:


注意:192.168.81.250后面的 / 不能省略。
上述操作中,ab命令的选项-n表示发送的请求总数,-c表示并发数,后面的网址是请求的服务器url地址。

为了能更好地理解ApacheBench的测试报告,下面通过一个具体事例进行演示:

[root@slave1 ~]# ab -n1000 -c1000 http://192.168.81.250/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
 
Benchmarking 192.168.81.250 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests                   #完成1000个请求
 
 
Server Software:        nginx/1.14.0     #服务器软件
Server Hostname:        192.168.81.250   #服务器主机名
Server Port:            80               #服务器端口号
 
Document Path:          /                #文档路径
Document Length:        169 bytes        #文档大小
 
Concurrency Level:      1000             #并发数
Time taken for tests:   1.042 seconds    #完成测试所用的时间
Complete requests:      1000             #完成的请求数
Failed requests:        0                #失败的请求数
Write errors:           0
Non-2xx responses:      1000
Total transferred:      319000 bytes                   #总传输数据量大小
HTML transferred:       169000 bytes                   #HTML数据量大小
Requests per second:    959.72 [#/sec] (mean)          #平均每秒请求数
Time per request:       1041.971 [ms] (mean)           #平均每次并发请求所用时间
Time per request:       1.042 [ms] (mean, across all concurrent requests)  #平均每个请求所用时间
Transfer rate:          298.98 [Kbytes/sec] received   #平均每秒传输的数据量
 
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        4  181 189.6    133     566
Processing:    30  127  63.6     97     582
Waiting:       16  118  61.6     91     297
Total:         54  308 186.3    310     680
Percentage of the requests served within a certain time (ms)    #各请求的时间分布如下
  50%    310                                                    #50%的请求花费了310毫秒
  66%    319
  75%    324
  80%    395
  90%    635                                                    #90%的请求花费了635毫秒
  95%    637
  98%    638
  99%    639                                                    #99%的请求花费了639毫秒
 100%    680 (longest request)                                  #所有请求花费了680毫秒


从上述测试报告可以看出,服务器能够承受1000个并发连接,总共耗时约1.04秒。接下来将请求总数和并发设置为1030,会发现ab无法进行测试,出现如下提示。

socket: Too many open files (24)

如图:


该提示表示打开的文件超出了系统限制。按照 linux 一切皆文件的理念,连接数也是文件,linux系统默认限制了一个进程最多打开的文件数量。默认是1024。使用如下命令可以查看(前面提到过):

[root@slave1 ~]# ulimit -a|grep open
open files                      (-n) 1024


从上述结果中可以看出,当前对于文件打开数量(open files)的限制为 1024,使用 ulimit -n 数字 命令可以临时更改这个数量。下面修改打开文件数量为 65535:

修改linux服务器对于打开文件数量的限制 方法1(临时有效)

[root@slave1 ~]# ulimit -n 65535                 #修改打开文件数量限制
[root@slave1 ~]# ulimit -a|grep open             #查看打开文件数量限制
open files                      (-n) 65535   


但这只更改了客户端linux系统,而服务器端仍然存在限制,所以重新运行ab命令进行测试

[root@slave1 ~]# ab -n1500 -c1500 http://192.168.81.250/trace/images/01.png


在1500 并发连接情况下,依然会出现失败的请求,所以也要改服务器端对打开文件数量的限制。在ab的测试报告中会看到如下信息:

Complete requests:      1500     #完成发送的请求数
Failed requests:        1        #失败的请求数

从信息中可以看出,在1500的并发数下nginx服务器出现了失败的情况。

修改linux服务器对于打开文件数量的限制 方法2(永久有效):
--- 更改配置文件 /etc/profile 和 /etc/security/limits.conf

 #将ulimit加入到 /etc/profile 文件底部
[root@slave1 ~]# echo "ulimit -n 65535" >> /etc/profile
 #加载修改后的profile
[root@slave1 ~]# source /etc/profile

OK,好多朋友都以为大功告成了,可以突然发现自己再次登录进来的时候,ulimit的值还是1024,这是为什么呢? 
关键的原因是你登录的用户是什么身份,是不是root用户,由于服务器的root用户权限很大,一般是不能用来登录的,都是通过自己本人的登录权限进行登录,并通过sudo方式切换到root用户下进行工作。 用户登录的时候执行sh脚本的顺序: 

/etc/profile.d/file 
/etc/profile 
/etc/bashrc 
/mingjie/.bashrc 
/mingjie/.bash_profile 

由于ulimit -n的脚本命令加载在第二部分,用户登录时由于权限原因在第二步还不能完成ulimit的修改,所以ulimit的值还是系统默认的1024。 

解决办法: 
修改linux的软硬件限制文件/etc/security/limits.conf. 

[root@slave1 ~]# echo "* soft nofile 65535" >> /etc/security/limits.conf 
[root@slave1 ~]# echo "* hard nofile 65535" >> /etc/security/limits.conf 
[root@slave1 ~]# ulimit -a|grep open
open files                      (-n) 65535

2  优化nginx连接数

前提是先设置好 linux服务器对于打开文件数量的限制

为了使nginx能够承载更高的并发数,可以编辑 conf/nginx.conf 配置文件进行配置,具体如下。

#user  nobody;
user root;
worker_processes  auto;
worker_rlimit_nofile 65535;
 
events {
    worker_connections  65535;
    multi_accept on;
}


在上述配置中,worker_processes 指令用于指定工作进程的个数,设置为auto时 nginx 将根据 cpu 的核心数来控制;worker_rlimit_nofile 用于设置最多打开的文件数量;worker_connections 用于设置每个工作进程可接收的连接数;multi_accept 表示是否允许一个工作进程响应多个请求。
    nginx 支持select、poll、kqueue、epoll 等多种类型的连接处理方式,在默认情况下会自动选择最适合系统的方式。在系统内核和 glibc (C运行库)支持的情况下,nginx会自动使用 epoll 方式。epoll 时linux平台上性能非常高的一种多路I/O复用模型。

接下来,使用ApacheBench工具进行 3000 并发数测试,具体操作如下。

[root@slave1 ~]# ab -n3000 -c3000 http://192.168.81.250/trace/images/01.png
.
.
.
 
 
Concurrency Level:      3000
Time taken for tests:   4.114 seconds
Complete requests:      3000
Failed requests:        0


从测试报告中可以看出,nginx 完成了并发测试,没有出现失败的请求。

二 用户打开的最大进程数
1 查看用户打开的最大进程数

ulimit -a

max user processes           (-u)  #系统限制某用户下最多可以运行多少进程或线程

再比如:


或者直接使用   ulimit -u

2 这些个值是怎么来的?

ulimit -u 出现的max user processes 的值默认是   # cat /proc/sys/kernel/threads-max的值/2,即系统线程数的一半

3 怎么修改linux最大进程数

我的一个低配版的服务器参数如下:(ulimit -a  或 ulimit -u 查看)

[root@izbp1845cet96se1qmb5ekz ~]# ulimit -u
3895

3.1 在 /etc/security/limits.conf 文件里添加如下内容:

* soft nproc 65535
* hard nproc 65535

方法如下:

[root@izbp1845cet96se1qmb5ekz ~]# echo "* soft nproc 65535" >> /etc/security/limits.conf 
[root@izbp1845cet96se1qmb5ekz ~]# echo "* hard nproc 65535" >> /etc/security/limits.conf 


如果使用*号让全局用户生效是受文件/etc/security/limits.d/20-nproc.conf中nproc值大小制约的

3.2 修改 /etc/security/limits.d/20-nproc.conf
修改为:

*          soft    nproc     65535

如图:

3.3 系统总限制

经过以上3.1,3.2 两步,再次查看 max user processes ,已变更为:


但上面的max user processes (-u)  65535   的值也只是表象,用户最大进程数无法达到65535,因为用户的max  user processes的值,最后是受全局的kernel.pid_max的值限制。也就是说若kernel.pid_max=3895  ,那么用户能打开的最大进程数还是3895。

查看全局的 pid_max 方法:

方法一:

[root@izbp1845cet96se1qmb5ekz ~]# cat /proc/sys/kernel/pid_max 
32768

方法二:

[root@izbp1845cet96se1qmb5ekz ~]# sysctl kernel.pid_max
kernel.pid_max = 32768

其实,这个值 32678 已经够用了。

修改这个值的方法:

echo 65535 > /proc/sys/kernel/pid_max

所以以上都操作完成后,才算是正确修改了max user processes 的值

上面只是临时生效,重启机器后会失效

永久生效方法:

在/etc/sysctl.conf中添加kernel.pid_max = 65535

# vim /etc/sysctl.conf

kernel.pid_max = 65535

或者:

echo "kernel.pid_max = 65535" >> /etc/sysctl.conf

然后重启机器
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ab压力测试 和 nginx 配置优化 及 用户打开的最大进程数 的相关文章

  • python批量写入数据

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 python批量写入文件内容 前言 一 使用步骤 1 引入库 前言 提示 这里可以添加本文要记录的大概内容 python批量写入文件内容 提示 以下是本篇文章正文内容 下面案
  • Arthas(阿尔萨斯) 的安装与使用

    arthas官方文档 https arthas aliyun com doc index html点击此处进入 是Alibaba开源的Java诊断工具 深受开发者喜爱 在线排查问题 无需重启 动态跟踪Java代码 实时监控JVM状态 Art
  • 对象池简单理解

    unity中一些需要频繁创建和销毁的对象 在销毁时会频繁的调用gc 非常占用cpu时 造成性能瓶颈 这时候就需要对象池技术 使用对象池在销毁时并不调用gc 而是仅仅将需要销毁的obj失活 当再次创建同类对象时 在对象池中查找可以使用的对象进
  • SoloPi APP性能测试用

    这款名为 SoloPi 的小工具 作用在于监测安卓机的运行状态 包括 CPU 内存 乃至大家感受最直观的帧率等等 SoloPi 本身是非常良心的 首先它开源 保证了干净安全 其次它也没有广告和多余的后台进程 非常令人放心 SoloPi ht
  • 浅谈 Vue 项目优化

    好久不写博文了 本文作为我使用半年 vue 框架的经验小结 随便谈谈 且本文只适用于 vue cli 初始化的项目或依赖于 webpack 打包的项目 前几天看到大家说 vue 项目越大越难优化 带来很多痛苦 这是避免不了的 问题终究要解决
  • 深聊性能测试,从入门到放弃之:Locust性能自动化(七)HAR-files→locustfiles自动转换 :Transformer的使用

    Transformer 使用 1 引言 2 安装及调用 2 1 介绍 2 2 安装 2 3 使用 2 3 1 保存HAR files 2 3 2 命令行工具 2 3 3 作为库被调用 3 创建HAR file 3 1 简介 3 2 录制场景
  • JavaScript 函数防抖(debounce)的实现

    函数防抖是什么 函数防抖是指对于在事件被触发n秒后再执行的回调 如果在这n秒内又重新被触发 则重新开始计时 是常见的优化 适用于 表单组件输入内容验证 防止多次点击导致表单多次提交 等情况 防止函数过于频繁的不必要的调用 代码实现 思路 用
  • Linux服务器内存消耗过高

    Linux服务器内存消耗过高 问题描述 Linux服务器的内存持续消耗过高 重启后可以恢复正常 但业务运行后问题依旧存在 而且没有明显高消耗内存进程存在 问题原因 slab消耗内存过多 解决方案 登录问题Linux服务器 执行free和to
  • Android性能优化之应用瘦身(APK瘦身)

    关于作者 CSDN内容合伙人 技术专家 从零开始做日活千万级APP 专注于分享各领域原创系列文章 擅长java后端 移动开发 人工智能等 希望大家多多支持 目录 一 导读 二 概览 2 1 apk组成 三 优化方向 3 1 源代码 3 1
  • dumpsys meminfo内存分析解读(收集整合)

    OOM机制是机器底层的一种强制保鲜 在OOM发生的时候内核会排序强制杀掉进程来保证系统的继续运行 同样这种OOM异常容易发生在低内存机器上 比如512M 首先系统会根据程序是否是空进程 已经由用户关闭的不带有任何服务和provider的进程
  • top命令按内存和cpu排序

    一 按进程的CPU使用率排序 运行top命令后 键入大写P 有两种途径 a 打开大写键盘的情况下 直接按P键 b 未打开大写键盘的情况下 Shift P键 效果如图 二 按进程的内存使用率排序 运行top命令后 键入大写M 有两种途径 a
  • linux性能命令详解

    1 查看进程相关信息 1 1 查看当前进程 查看当前进程的启动命令 PID为线程ID 1 ps ef grep 进程信息 获得进程PID 2 cd proc PID 3 ll proc PID 显示的文件夹 cwd符号链接的是进程运行目录
  • 数据库读写分离,主从同步实现方法

    前言 众所周知 随着用户量的增多 数据库操作往往会成为一个系统的瓶颈所在 而且一般的系统 读 的压力远远大于 写 因此我们可以通过实现数据库的读写分离来提高系统的性能 实现思路 通过设置主从数据库实现读写分离 主数据库负责 写操作 从数据库
  • 使用Jmeter进行http接口做功能、性能测试

    使用Jmeter进行http接口做功能 性能测试 1 使用Jmeter进行http接口做功能 性能测试 在测试移动APP时 会有很多接口需要做测试 我在这里介绍一下对HTTP接口做功能 性能的测试 首先我们会从开发人员拿到接口数据 1 1
  • JVM分析工具

    JVM在运行过程中 我们可以利用各种工具对JVM进行分析 这是性能调优的利器 可以通过各种工具了解在系统运行过程中 在JVM底层到底发生了什么 JVM分析工具一般分为两种 一种是命令行工具 一种是图形界面工具 JVM分析工具 JDK自带的命
  • BF,KMP,BM三种字符串匹配算法性能比较

    三种最基本的字符串匹配算法是BF KMP以及BM BF算法是最简单直接的匹配算法 就是逐个比较 一旦匹配不上 就往后移动一位 继续比较 所以比较次数很都 关于KMP和BM的详细介绍可以参考下面的两个link 是讲得比较好的 KMP http
  • 性能测试,服务器资源监控工具nmon常用操作

    在性能测试过程中 对服务端的各项资源使用情况进行监控是很重要的一环 这篇博客 介绍下服务端监控工具 nmon的使用方法 一 认识nmon 1 简介 nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具 它能在系统运行过程
  • tomcat点击startup.bat一闪而退的解决方法

    1 点击startup bat会闪退 编辑startup bat 在最后一行加入pause 然后保存 再次运行 就可以看到闪退的原因 2 出现这个的原因是没有配置启动的环境JAVA HOME 下面配置一下JAVA HOME 右键电脑 点击属
  • 全链路压测

    核心流程 全链路压测实施的核心流程如下 骤一 确定压测目标 压测目标主要包括压测范围 策略 目的 往往与业务 技术目标息息相关 例如 压测范围 用户注册加登录 为大规模拉新做准备 压测策略 高仿真生产环境压测 提前经历真实的业务高峰 压测目
  • CPU 使用率低 负载高的原因

    原因总结 产生的原因一句话总结就是 等待磁盘I O完成的进程过多 导致进程队列长度过大 但是cpu运行的进程却很少 这样就体现到负载过大了 cpu使用率低 下面内容是具体的原理分析 在分析负载为什么高之前先介绍下什么是负载 多任务操作系统

随机推荐

  • 二叉树基本操作

    定义结构体 typedef int BTDatatype typedef struct BinaryTreeNode struct BinaryTreeNode left struct BinaryTreeNode right BTData
  • 分布式协议与算法——Raft算法

    目录 Raft算法 领导者选举 有哪些成员身份 领导者选举流程 选举细节 节点之间如何通信 什么是任期 选举有哪写规则 随机超时时间是什么 小结 日志复制 如何理解日志 如何复制日志 如何实现日志的一致 小结 节点成员变更 成员变更的问题
  • QCefView(1)—— CMAKE项目、库文件生成和项目测试

    目录 下载资源 说明文档 Quick Start with Qt Cef https tishion github io QCefView CMAKE生成 sln项目文件 库文件编译和测试项目编译运行 测试QCefView自带的项目QCef
  • 把Ethernet(以太网)基本工作原理说清楚

    文章目录 Ethernet 数据发送流程 1 载波侦听过程 2 冲突检测方法 发现冲突 停止发送 随机延迟重发 Ethernet帧结构 Ethernet V2 0标准 和 IEEE 802 3标准的Ethernet帧结构的区别 前导码 类型
  • java基础篇(一) 标识符、常量、变量、运算符

    一 标识符的学习和规则 1 定义 在程序中我们自定义的一些名称 在编程的过程中 经常需要在程序中定义一些符号来标记一些名称 如包名 类名 方法名 参数名 变量名 这些符号被称为标识符 2 组成元素 52个大小写英文字母a z 26 2 52
  • Moonbeam路由流动性

    Moonbeam路由流动性 Moonbeam Routed Liquidity MRL 使加密资产流动性能够从其他生态系统 如以太坊 Solana Polygon或Avalanche 进入波卡生态系统 借助MRL 用户可以通过简洁的用户体验
  • 大数据处理框架-Spark DataFrame构造、join和null空值填充

    1 Spark DataFrame介绍 DataFrame是Spark SQL中的一个概念 它是一个分布式的数据集合 可以看作是一张表 DataFrame与RDD的主要区别在于 前者带有schema元信息 即DataFrame所表示的二维表
  • Mysql多表连接

    表连接 前提 有时候我们需要的数据不止在一张表中 需要多个表结合查询时 就可以使用表连接 分类 1 1 内部连接 提供了两种表与表之间的连接方式 表与表之间建立起关联的列 要求列名可以不一样 但是这两个列的数据类型和内容得保持一致 1 2
  • Task01:概览西瓜书+南瓜书第1、2章(2天)

    第一章 绪论 1 1引入机器学习 引用周老师西瓜书对机器学习的解释 若计算机科学是研究关于算法的学问 则机器学习可以说是关于学习算法的学问 1 2 基本术语 机器学习是一门专业性很强的技术 它大量地应用了数学 统计学上的知识 周老师用挑选西
  • 【深度学习】CV_基于CNN的图像分类模型_代码逐行注释解析

    目录 前言 一 任务描述和关键环节 一 数据预处理 二 网络模块设置 三 网络模型保存与测试 二 具体步骤 一 任务分析与图像数据处理 1 导包 2 数据读取与预处理 2 1 数据读取 2 2 数据预处理 1 制作数据源 2 将预处理的数据
  • Nuxt3请求封装数据封装

    新建utils http ts import hash from ohash 后端返回的数据类型 export interface ResOptions
  • 重磅!Cloud Ace 在巴西圣保罗建立第一家南美子公司

    Cloud Ace Inc 总部 东京都千代田区 代表 青木诚 以下简称 Cloud Ace 于2023年3月10日宣布在巴西成立新子公司 Cloud Ace 一直在全球扩展其业务 从亚洲开始 目标是在世界各地设有办事处 我们最近加入的是在
  • Web菜鸟入门教程 - MyBatis通过数据库生成java代码

    SpringBoot大大简化了Web开发流程 可以这么说 做Web后来开发大部分时间就是在做配置文件修改 Web开发中 终端的运算能力越来越强 大部分场景就是数据库的操作 只有少部分逻辑会放在Web端处理 而这些增删查改基本属于标准的格式
  • 实现一个顺序存储的线性表(数据结构与算法 - 线性表)

    任务描述 本关任务 实现 step1 Seqlist cpp 中的SL InsAt SL DelAt和SL DelValue三个操作函数 以实现线性表中数据的插入 删除与查找等功能 相关知识 线性表是最基本 最简单 也是最常用的一种数据结构
  • Python list函数

    目录 描述 语法 使用示例 1 创建一个空列表 无参调用list函数 2 将字符串转换为列表 3 将元组转换为列表 4 将字典转换为列表 5 将集合转换为列表 6 将其他可迭代序列转化为列表 注意事项 1 参数必须是可迭代序列对象 将列表转
  • chrome中直接使用import

    现在我们在开发项目时都是基于构建工具 像webpack 上进行开发 所以在使用import时得心应手 但今天在chrome中直接使用import时 发现不知道如何使用 chrome中直接使用import 三个条件 浏览器版本需要支持 浏览器
  • c++常用输出函数详解

    1 printf printf的基本运用 printf是c 标准输出函数 目的是向标准输出设备按规定格式输出信息 格式如下 printf d a 上面的a是一个int形变量 但如果想输出一个字符型的变量 字符串等该怎么办呢 那我们就要把 后
  • 【mmdetection】小trick试验结果

    基准 faster rcnn r50 fpn 1x coco简称frrf config mAP 最好 模型大小 publish model cal train time s iter 1 frrf 0 9346 315 32MB
  • axios实现同步请求

    如何实现ajax请求的同步 通过jquery发送 将async属性设置为false 这样就会发送同步请求 在axios中 所有的请求都是异步发送的 所以单独用axios是实现不了同步的 需要结合async与await关键字使用 var da
  • ab压力测试 和 nginx 配置优化 及 用户打开的最大进程数

    原文 https blog csdn net wudinaniya article details 86064797 一 ab压力测试 和 nginx 配置优化 压力测试工具 ApacheBench 简称ab 是Apache 中自带的基准性