0
点赞
收藏
分享

微信扫一扫

从零开始自制实现WebServer(七)---- 进入首次压力测试开始调优 休整不牢地基开始大整改(上)

千行 2022-04-05 阅读 53

文章目录


前引


今天是4/3号了 现在是中午的11:43了 昨天休息了一天 确实不太想出门了 主要是4月1号的时候 晚上忙到了11点 把HTTP部分初步给做出来了 就想自己给自己放一天假

过会可以出去吃饭了 和朋友们好久没出去吃饭了 出去聚一聚
毕竟这段时间疫情挺严重的 可能也就这段时间能够出去了

这篇的话 我想把日记库的部分给初步搞定 毕竟也是网络库中非常核心的一个地方 需要去完成的 本来是想好好的抓一抓细节的 用用unique_ptr shared_ptr来认认真真解决一下问题的 结果呢 想了想 算了 这部分还是放在最后 基本上所有功能到差不差的时候 再来统一的解决吧 毕竟那个时候才是钻细节的时候 现在先把很多功能到差不差的实现出来才是真的

一路走到现在 博客现在也有个32w的浏览量了 从入学的第二个月尝试写博客到现在 一直在坚持做这件事 期间也有遇到了很多的困难 挫折 自己也都咬了咬牙坚持了下来 还算是运气好 还算是一路没遇到什么太多的烦心事 只是一路上的心理压力比较大 因为走的路毕竟与绝大部分人是不同的 做很多选择 抉择 包括现在我自己做的很多事情 都是背负着一定的心理压力的

昨晚看到自己大一 原来收藏过的几篇 关于校招 本科就业 还有几个非常优秀的学长谈了谈自己一路的心路历程 感触良多
人啊 一生中都是在忙忙碌碌的去做选择 可能想起原来自己做的选择会有时候有所后悔 但是无论怎么样 没有任何人会等待谁去做好准备 时间永远都是再往前走 做好准备和没做好准备 未来需要去面对的永远都在那里 都是需要去面对的

看到一个学长 聊他在大学生活中所做的选择 绝大部分在现在看来 都是错误的 还幸好做了几个正确的决定 现在生活过的还不错 还算是拿到了自己想拿到的东西
做选择时 需要去综合考量很多事情 自己平时的性格 自己自身的水平 自己对未来的考虑程度 自己对自己人生未来的考量 对自己未来规划的能力

看到一个十分优秀的学姐 后悔原来大学没有去大学没有直接去FaceBook实习 给了机会而选择继续考研 如果早几年入职的话 期权股票的话能多拿几百万美元
也看到了学长 后悔自己原来不去多做几个奇怪的项目 多去几个公司实习 感受不同互联网公司的所在氛围 是否真的是描述的那样

很多人不敢背负心理压力 不敢去做自己认知以外的事情 永远也只会在自己的舒适区做选择 我相信绝大部分人也是这样的
其实回想到现在 我没做的每一个选择 每一个抉择 其实都是对自己的一次考验 一次挑战 做很多的选择 我自己也是背负了相当大的心理压力 但是为了自己大学想要完成的事情 想要拿到的东西 没有办法 可以说是 不择手段的 无论怎么样都在努力的往自己的目标走

可能是原来在高中的时候 就看到了一点自己大学的影子 可能是自己真的也去很艰苦的地方 呆过一段时间 明白很多东西的游戏规则 不再把自己局限在一个很小的范围 总是提前去想很多事情 提前考虑很多事情

上高中的时候 我和我玩的最好的朋友 也是我们班级最不守规矩的两个人 从小到大 我也好像一直是这样的身份上来的 高中很清楚 如果每天6:30起床 我自己的休息睡眠是严重不足的 早读开始是7点 早读结束是7点30 每次我和朋友都是睡到7点20多的时候才起床 每次过去也是被班主任训斥

我和我朋友自从高三之后 上课从来不听课 但是每次考理综 可能是我和我朋友确实也算聪明 每次都能理综排名全班前两名 年级前20左右 到最后高考 尽管考的不好 但我和我朋友还是全班前三四名考出来的 也都算自己走上了自己想走的路

有的时候 我经常会想 一直循规蹈矩守规矩去遵守一些没有任何意义的规则 究竟有什么意思 看到绝大部分人 对自己应该得到的利益 有的时候需要背负一点心理压力 去做一些选择的时候 永远都是选择沉默 低头 随大流而放弃

思来想去 这是我日常的生活 每天都经历着各种各样的选择 每天都是如此
原来自己会去跟很多朋友说 到后面自己也不再去说了 自己埋着头做自己的事情

总的来说 很感谢自己原来做的选择 在目前看来一切都好 尽管压力大了点 尽管需要去完成的事情很多还累在心中 但是仍然在坚持吧

好了 就先写到这里吧


(七)---- 回顾代码全部目前实现 进入首次压力测试开始调优


本来这一篇刚开始是想写Logging库的 结果刚刚停下来去看了看一个学长也是参照的muduo库实现的网络库 发现可以用webbench进行压力测试 看看是否运行正确 且看看连接数

我很清楚目前写的代码有点Toy 很多地方都是没有进行拓展性思考的 但毕竟这个项目是可以不断迭代的嘛 也是可以一点点的修改让这个项目越来越好的 所以 哈哈 下面就放一下muduo库和我目前的写的代码的库是什么情况 待会写完这段话我就重新回头 再去看看muduo库的源码 并且对我现在写的代码进行大幅度调整了 很多原来写的不恰当的地方都要改了


webbench的话 安装和使用我这里就不介绍了 下面贴两个链接吧
学习webbench的使用
WebBench(GitHub链接)

在同样的情况下进行性能测试 电脑由于目前在图书馆 就开的静音模式 大幅度降低了性能 下面是测试情况

在并发度为1000的情况下进行的测试 这边我只能接受1000个连接 哈哈 只能是苦笑了 苦笑的地方是 没有出现failed还算好 但是我大胆猜测限制了连接的问题是因为我的events的就是由Epoll所管理的数组 没有设置扩容 而一直都是默认设置5 而导致绝大部分的请求都被容量限制了 改了之后的情况应该会好得多 而且在中断连接后 我们也没有移除RemoveEvent的情况 就会导致被占满

在这里插入图片描述


又在一番尝试后 成功的胜利的 迈出了一步
从992 susceed -> 1001 susceed
从0 failed -> 150000 failed

我觉得主要原因是 需要释放资源 tcpconnectionptr没有析构
做出的一番改动是 当read到0字节时 则释放资源
确实释放了 只把在epoll中注册的部分给EPOLL_CTL_DEL掉了
但是呢 Tcpconnection 所占用的指针没有析构 没有析构是小事 但是占用的文件描述符是大事

在这里插入图片描述


好吧 上面好像还是有问题… 应该是我把所有的IO关了才导致的…
哎 头疼 算了 还是老老实实 乖乖的去把muduo库的源码认认真真的再重新看一遍来自己实现吧


1、muduo库出问题!? c1000 压力测试为什么会出现failed?


今天整个上午的其中一个小时 我为我的电脑发愁 我为muduo库发愁 因为我先压力测试的muduo库 发现在并发1000的时候 会出现failed
我的webserver 都还没有开始调试呢 怎么muduo库都会出现这么多failed啊… 昨晚到今天上午 我都一直在为这个问题头疼

因为我看了看测评数据 muduo库理论上c10k都不是什么大问题 而且看了看别人做的网络库 也都没有问题 尽管在图书馆 为了防止电脑全速跑而造成大量声音 我开了低功率模式 但是也不至于会failed啊…

刚刚才把这个问题解决了 并且又学到了几个好用的工具 下面就先说一下吧

如果仔细看到这里的话 应该还是不能初步揣测出问题所在 我们首先确定muduo库的代码是没有问题的 这个是前提
那问题出在哪里了呢 看到第三条上面的lsof 应该能够看到提示就知道了 文件描述符的情况

因为muduo库的logging做的确实很好 出问题了 马上就会以 LOG_ERRNO显示出来 我就发现是 Acceptor accept出现了问题 而显示的原因是OPEN FILE TOO MUCH

之后通过top lsof看了看 发现cpu占比也是正常的 只跑到了45% 说明负荷也不大啊 lsof之后看了看文件描述符的占用情况 就发现 只开到了1024… 终于发现问题了

原来是linux默认只允许一个进程打开1024个文件描述符 我就说什么情况… 对于一个c1k1000并发连接的服务器而言 怎么可能是足够的…

下面是单次修改 file_open参数的方法 暂时我还不知道怎么永久修改

然后之后再进行测试就发现ok了 下面是测试截图
muduo库开的端口我改了一下代码 可以自己设置 这次设置的就是1430
因为是没有跑满cpu的 而且电脑也不是开的性能模式 肯定是相对慢一点的

这里是短连接 就是31000QPS/s(Queries-per-second) 哈哈 好像是有点慢了 我这个虚拟机是设置的8核的 我去把他改成8核 应该效果会更好 下面再进行测试一下

在这里插入图片描述


下面是cpu运行情况 哈哈 每个cpu只处理到了30左右 因为是短连接 看看处理速度 哈哈 怎么也没有快多少… 估计是自己对性能瓶颈在哪里还不太清楚

在这里插入图片描述

在这里插入图片描述


2、反观WebServer 增加文件描述符后明显变化 但I/O率异常


反正在按照上面的情况调整后 可打开的文件描述符已经来到了 65536
然后呢 我们看看再来重新跑一跑WebBench的效果
下面是截图

嗯?什么情况 succeed 数目怎么刚好是65000多 加上failed的130多个 怎么感觉刚好是65536 最大打开的文件描述符的数目啊 然后又回想了一下刚开始没有调整的时候 也是 只有1000个连接 加上一些必须要打开的文件描述符 那也不是刚开始的默认的1024吗

在这里插入图片描述

在这里插入图片描述


为了检验我的想法 我的webserver从来没有关闭过需要关闭的已经结束的连接文件描述符 我把file_open又设置为了30000 又测试了一次数据

数据如下 果然如我猜测的那样 我的心爱的webserver 真的是把每一个连接都用上了新的文件描述符… 属实是大无语了 给了多少资源用多少资源 一点也不吝啬 就像买一双鞋子 只穿一次就丢一样

而且我的webserver 明显是循坏一直在主线程 cpu占用率高达98% 基本上是满负荷 而且运行的时候 内存占用率是越来越高 到后面直接被爆掉 进程被杀死… 抓住了问题的主干 我们也要针对这些问题去找一下 哪里没有做好呢

在这里插入图片描述

在这里插入图片描述


1、先解决文件描述符重复使用问题 并发问题解决!但内存40秒4个G直接爆掉(简单修改)


终于在动了两个小地方的之后
并发终于正常了 只是内存只高不下 不足一分钟 在并发1000的情况下 4G的内存一下子就用掉了 然后就出现core dump

主要是没有释放内存 后面再改改吧
在这里插入图片描述


修改的地方就在 Read_size == 0的地方 关闭了Tcpconnection fd_
并且也把channel_注册在epoll的注册符给删了

但是下面我通过top 明显的发现 服务器是处于一个不正常的形态运行的
下面的截图 是Muduo网络库 压力测试的情况 top显示的
每个线程内存占用率仅仅占了0.1%
在这里插入图片描述


而我们的webserver则是内存消耗机 满满当当的马上能用完
下面是大概运行了40秒钟后 4GB的内存就已经被用掉了3.6GB
再过了两秒钟后 直接就被linux系统直接杀死了

接下来就好好的处理一下 很多细节问题了
例如对象如果管理 释放的问题了 这本来是我打算后面再来处理了

看样子就在一篇就要好好的来解决一下了

把目前代码中 基本上所有的不规范的地方都要进行处理了
尽管我们的并发数据 看起来好像相较原来的好像好了不少 确实是 但这表现也还是太糟糕了… 我们还是需要再做出改变

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


2、解决40秒内存爆掉的问题 使服务器的内存初步维持在正常水平(unique/shared_ptr 包装原始指针 增加内存释放处理)


其实我刚刚稍微分析了一下 内存一下子就报掉的主要原因是
channeltcpconnectionptr没有被析构
而我们在read_size 读入到0 bytes时 就需要关闭连接了
但很显然 这没有想象中的那么简单

首先 我们关闭channel在epoller中注册事件 这个确实是直接就关闭了 可以直接在Tcpconnection 中delete掉channel指针 但是我们的Tcpconnection 是在Tcpserver中new出来的 在什么地方得到的 就应该在什么地方移除

既然要涉及这么多文件 那就算了 不再用原始指针了 之后都用unique_ptr shared_ptr来管理了 不再当野战军了 走正规军了


刚刚在修改代码的时候 我就在想 我写这一系列博客 每一篇里面 站在之后的角度而言 里面总是充斥着各种问题 错误 我究竟是应该把这个WebServer完成出来之后 真的成品 里面的代码每一行都是经过我的深思熟虑 敲打过后的 我再来写 还是就像现在这样 我在一路上边学习 边记录下我的所想 所写 所得 让读者更能感觉到 写的很多话都是站在初学者角度而言的

想了想 还是就这样继续写下去吧 尽管前面的几篇博客 站在现在我的角度而言 发出来的确实是toy_server那样 但是确实是我一步步做出来的 在那个阶段代码确实就只能写成那样… 我也就老老实实的这样记录了下来

我写这一系列博客 我是真的希望 如果在我做完这个网络库后 真的能给很多同样的学弟学妹们 想学习后端的初学者 一条能够很清晰学习的道路 在很多时候没有思路 不知道怎么下手的情况下 至少能够看到一个正在前行的人 是怎么样走过这样一条道路的 真的希望写下来这一系列博客发出来 是能够帮助到各位的 对于一些地方的思考 对于一些地方怎么入手

因为我觉得 我思考出来的地方 我能够入手的地方 对于很多基础相对而言没有那么好的学弟学妹们 确实是想不到的 所以我发出来博客 也是希望提供一个思路 帮助到各位在这条道路上走的更轻松些吧 能够帮助到大家 我也很开心 我是一个喜欢分享的人 能够在力所能及的范围内帮助到大家 在一个我喜欢的学科里面 我觉得还是特别开心的 好了 我继续去改代码了


到这里的话 已经基本上把内存泄露的主要部分给解决啦 主要就是利用shared_ptrunique_ptrTcpconnectionChannel给包裹起来了 哈哈 刚刚在1000并发的时候 看到MEM占用仅仅在0.0的时候 确实有点难绷

在大概10000并发的时候 就出现了476failed了
下面这是我交出来的答卷 都是120秒钟

再在下面贴一下 两边运行 CPU的情况

而且看最下面的图片 我的服务器跑起来
主线程CPU 是占比非常高的 而子线程 也就是工作线程基本不动。。。
而muduo库则是比较均匀 主线程也没有明显的出现像我这种主要工作出现宰了主线程 看样子还需要去优化一下处理逻辑线路

应该是一些容器或者其他的问题产生才导致这样的问题…
之后再回头去看看源码 我之前初步写的代码哪里出现了问题

这一篇就先写到这里吧 先回寝室躺躺 哈哈
吃点东西 喝点开心的再回来继续优化优化

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

举报

相关推荐

0 条评论