性能测试分析案例-定位服务吞吐量下降

环境准备

预先安装 docker、curl、wrk、perf、FlameGraph 等工具

sudo yum groupinstall 'Development Tools'
# 安装火焰图工具
git clone https://github.com/brendangregg/FlameGraph
# 安装wrk
git clone https://github.com/wg/wrk
cd wrk && make && sudo cp wrk /usr/local/bin/

操作和分析

案例是一个 Nginx + PHP 应用
在这里插入图片描述
其中,wrk 和 curl 是 Nginx 的客户端,而 PHP 应用则是一个简单的 Hello World

<?php
echo "Hello World!"
?>

执行下面的命令,启动 Nginx 应用,并监听在 80 端口。如果一切正常,你应该可以看到如下的输出:

docker run --name nginx --network host --privileged -itd feisky/nginx-tpdocker run --name phpfpm --network host --privileged -itd feisky/php-fpm-tp

执行 docker ps 命令,查询容器的状态,你会发现,容器已经处于运行状态(Up)了:

docker ps

在这里插入图片描述

切换到终端二中,执行下面的 curl 命令,进一步验证 Nginx 能否正常访问。如果你看到 “Hello World!” 的输出,说明 Nginx+PHP 的应用已经正常启动了:

$ curl http://xxx.xxx.xxx.xxx
Hello World!

继续在终端二中,执行 wrk 命令,来测试 Nginx 的性能:

wrk --latency -c 1000 http://xxx.xxx.xxx.xxx

在这里插入图片描述
吞吐量(也就是每秒请求数)只有 156,并且所有 129个请求收到的都是异常响应(非 2xx 或 3xx)。这些数据显然表明,吞吐量太低了,并且请求处理都失败了。这是怎么回事呢?
根据 wrk 输出的统计结果,我们可以看到,总共传输的数据量只有 345KB,那就肯定不会是带宽受限导致的。所以,我们应该从请求数的角度来分析。

连接数优化

要查看 TCP 连接数的汇总情况,首选工具自然是 ss 命令。为了观察 wrk 测试时发生的问题,我们在终端二中再次启动 wrk,并且把总的测试时间延长到 30 分钟:

# 测试时间30分钟
wrk --latency -c 1000 -d 1800 http://xxx.xxx.xxx.xxx

回到终端一中,观察 TCP 连接数:

ss -s

在这里插入图片描述
wrk 并发 1000 请求时,建立连接数只有 109,而 closed 和 timewait 状态的连接则有 167 。其实从这儿你就可以发现两个问题:
一个是建立连接数太少了;
另一个是 timewait 状态连接太多了。
在终端一中,运行下面的命令,查看系统日志:

dmesg | tail

在这里插入图片描述
看到 nf_conntrack: table full, dropping packet 的错误日志。这说明,正是连接跟踪导致的问题。
连接跟踪数的最大限制 nf_conntrack_max ,以及当前的连接跟踪数 nf_conntrack_count。执行下面的命令,你就可以查询这两个选项:

sysctl net.netfilter.nf_conntrack_max
net.netfilter.nf_conntrack_max = 200
sysctl net.netfilter.nf_conntrack_count
net.netfilter.nf_conntrack_count = 200

最大的连接跟踪限制只有 200,并且全部被占用了。200 的限制显然太小,不过相应的优化也很简单,调大就可以了。
执行下面的命令,将 nf_conntrack_max 增大:

# 将连接跟踪限制增大到1048576
sysctl -w net.netfilter.nf_conntrack_max=1048576

执行下面的 wrk 命令,重新测试 Nginx 的性能:

# 默认测试时间为10s,请求超时2s
$ wrk --latency -c 1000 http://xxx.xxx.xxx.xxx

在这里插入图片描述
吞吐量已经从刚才的 156增大到了 1363,有 548响应异常,由于这些响应并非 Socket error,说明 Nginx 已经收到了请求,只不过,响应的状态码并不是我们期望的 2xx (表示成功)或 3xx(表示重定向)。
终端一,执行下面的 docker 命令,查询 Nginx 容器日志就知道了:

docker logs nginx --tail 3

在这里插入图片描述
响应状态码为 499。
499 并非标准的 HTTP 状态码,而是由 Nginx 扩展而来,表示服务器端还没来得及响应时,客户端就已经关闭连接了。换句话说,问题在于服务器端处理太慢,客户端因为超时(wrk 超时时间为 2s),主动断开了连接。
既然问题出在了服务器端处理慢,而案例本身是 Nginx+PHP 的应用,那是不是可以猜测,是因为 PHP 处理过慢呢?
执行下面的 docker 命令,查询 PHP 容器日志:

docker logs phpfpm --tail 5

在这里插入图片描述
server reached max_children setting (5),并建议增大 max_children。
执行下面的命令,删除案例应用:

# 停止nginx和phpfpm容器
docker rm -f nginx phpfpm

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 66. 加一

一、题目 二、解答 1.思路 分三种情况 个位数加1小于10不需要进1&#xff0c;则个位数加一后返回数组即可 需要进1。又分为两种情况&#xff1a;1不需要增加最高位&#xff0c;如899 变为900&#xff1b;2需要增加一位&#xff0c;如999变为1000 第一种情况&#xff0c;不需…

波动,热传导,扩散方程建立

数学物理方程是从自然科学的各个领域和工程技术领域中导出的偏微分方程和积分方程.在这些以偏微分方程为基础的数学模型中&#xff0c;二阶线性偏微分方程中的三个典型方程与定解条件的建立、解法及其应用&#xff0e;描述振动和波动过程的波动方程、描述输运过程的热传导&…

连续多级主管

背景 组织中一般会有个直接主管&#xff0c;或者汇报主管&#xff0c;有的组织可能有多个主管&#xff0c;更有甚者一个人能可能在不同的业务项目中&#xff0c;这样这个人可能存在n个主管&#xff0c;这样在设计流程中就会衍生出很多问题来。一起看一款审批软件的设置&#x…

模拟开关灯

1&#xff0e;  实验任务 如图所示&#xff0c;监视开关K1&#xff08;接在P3.0端口上&#xff09;&#xff0c;用发光二极管L1&#xff08;接在单片机P1.0端口上&#xff09;显示开关状态&#xff0c;如果开关合上&#xff0c;L1亮&#xff0c;开关打开&#xff0c;L1熄灭。…

统计学-R语言-4.1

文章目录 前言编写R函数图形的控制和布局par函数layout函数 练习 前言 安装完R软件之后就可以对其进行代码的编写了。 编写R函数 如果对数据分析有些特殊需要&#xff0c;已有的R包或函数不能满足&#xff0c;可以在R中编写自己的函数。函数的定义格式如下所示&#xff1a; …

软件测试|如何使用pycharm实现批量替换

简介 PyCharm是一款功能强大的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;提供了许多实用的功能来提高开发效率。其中&#xff0c;替换功能是一个非常有用的工具&#xff0c;它可以帮助开发者快速地在代码中查找并替换特定的文本。本文将详细介绍PyCharm的替换…

DevOps搭建(十六)-Jenkins+K8s部署详细步骤

​ 1、整体部署架构图 2、编写脚本 vi pipeline.yml apiVersion: apps/v1 kind: Deployment metadata:namespace: testname: pipelinelabels:app: pipeline spec:replicas: 2selector:matchLabels:app: pipelinetemplate:metadata:labels:app: pipelinespec:containers:- nam…

ALIENWARE:卓越游戏体验,源自创新基因

美国拉斯维加斯当地时间1月9日&#xff0c;CES 2024在万众期盼中如约而至。 作为全球消费电子领域一年一度的盛宴和行业风向标&#xff0c;CES 2024汇聚了来自全球的众多消费电子企业以及令人目不暇接的最新科技产品&#xff0c;因而受到了全球广大消费者的密切关注。 众所周知…

19_注解

文章目录 注解注解的作用注解的语法注解的使用 元注解注解处理器案例 注解VS配置文件注解的应用 注解 Annotation是代码里的特殊标记&#xff0c;这些标记可以在编译、类加载、运行时被读取&#xff0c;并执行相应的处理可以把Annotation理解为一个标签注解是不允许继承的 注…

浏览器深色模式

1、Edge强制深色模式 1、先在edge里设定成深色模式 设置浏览器中的深色设置 但这种方式设置后很多网站仍是白色的背景 2、实验室设置强制深色 网址栏 输入 edge://flags搜索 dark 选择 enabled 重启 2、Chrome强制深色模式 浏览器输入 Chrome深色设置 chrome://flags/#…

中国信通院联合发布《数字孪生城市白皮书(2023年)》

2017年“数字孪生城市”概念被首次提出&#xff0c;2021年我国“十四五”规划纲要明确“探索建设数字孪生城市”&#xff0c;2023年《数字中国建设整体布局规划》再次提出“全面提升数字中国建设的整体性、系统性、协同性”以及“探索建设数字孪生城市”等要求。数字孪生城市建…

如何启用Windows电脑的内置Administrator账户

前言 不知道从什么时候开始&#xff0c;新电脑或者新系统开机之后都会出现一个界面让你创建一个账户&#xff0c;但这个账户有可能是本地账户&#xff08;Windows10&#xff09;还有强制你登录微软账户的&#xff08;Windows11&#xff09;。 好像曾经熟悉的电脑Administrator…