草庐IT

从零开始自制实现WebServer(十八)---- 对服务器做最后的压力测试 WebBench压测小工具 项目迎来终章

Love 6 2024-04-29 原文

文章目录


全流程实现博客链接


从零开始自制实现C++ High-Performance WebServer 全流程记录(基于muduo网络库)


前引


没想到这个系列写到第十七篇了 哈哈
写这段话的时候 已经是下午的1:52了 还没有吃午饭 这部分前引写了就去吃了

争取今天下午和晚上把这个性能测试 和 这个项目上传GitHub 以及GitHub上面的ReadMe还有一些其他的功能完善一下吧
毕竟这个也算是之后可能面试要用的正式项目了 readme以及github的好多东西原来也只是浅浅学了一下 如果这个性能测试 之后我还要调一下我的虚拟机设置的处理器个数 我发现这个太影响我的服务器性能了… 而且到时候多次测试吧 争取测试做的正确一点 细致一点

github说实话 之前上传的时候 也是跟盲人摸象一样 这篇写完系统的去学学github bash方面的一些指令了

事情还有好多 哈哈 但是现在至少心情还算愉悦 那这部分先写到这里吧 去次午饭了


(十八)---- 对服务器做最后的压力测试 WebBench压测小工具 项目迎来终章


1、正确处理Vmware-Station 处理器设置(初步调试过程)


刚刚才发现 这个原来也是一个学问
确实是 我设置过各种不同的处理器参数 我的服务器跑出来的性能确实就是天差地别 如何正确设置处理器参数 核心数量怎么设置才能让性能最高

我之前一直没有研究 现在好好的看一下

VMware : 处理器数量和每个处理器的核心数量
VMWARE虚拟机的CPU分配(VMWARE14):处理器数量、核心数量分配验证
VMware不同处理器、硬盘设置——性能对比
VMWare中的处理器数量和每个处理器的内核数量概念及查询方法


我这里大概说一下 我的cpu是i5-10400 然后是6核12线程
我刚刚发现我设置了1处理器 12内核 跑服务器的时候

我的CPU 物理本机 占用率竟然是百分之百
我再去试试我的服务器 设置为12线程 会不会性能更高一些



2、正确处理Vmware-Station 处理器设置(设置结果)


我设置的是1处理器 6核心 我设置1处理器 12核心的时候 CPU明显占用比更高
1处理器6核心的时候 我电脑的CPU占用比只有60 但我还是设置的6核心 够用就行

因为我们是在相同环境下做性能测试 同机器对比即可
内存的话 越多越好 尽量有8GB 因为我设置的4GB 在10000并发的时候 经常机器直接卡死… 没有多余的内存空间了 所以尽量还是多设置一点

可能我机器性能就是这样了 也不花时间去调更多的参数了
反正测试的服务器都是在相同环境下测试的 都是关闭所有IO的
所以我们Lets Go 进入正题吧


3、c10k压力测试 对比Linya学长的WebServer(短连接)


不知道是我测试用例有问题 还是确实是编写的时候有问题
我连最基本的hello用例都跑不了 而且主页返回的网址也是乱码…


访问主页是这样的…
算了 这个样子的话 比我的服务器会多返回几个字节 但也无关大碍
/hello用例确实跑不起 不知道什么问题…

算了 就用/主页这个404 NOT FOUND作为测评吧


下面是测评结果 确实ET工作模式 在高并发下 短连接的表现是比LT要好的 由于一次读操作可以一次把所有的连接都加进来 故ET在这方面确实更有优势


3、c10k压力测试 对比Linya学长的WebServer(长连接 存疑?!)


下面就来测试一下长连接吧
尽管我觉得挺不靠谱的 由于我这边最大打开文件描述符只有65536 长连接又不自动关掉连接(默认不开启定时关闭连接功能)
但是看了看Linya学长是这样测试的 那我们也就这样 我觉得不是很靠谱的方法来测试一下吧

我个人也不太清楚 为什么可以有700多万的连接 用的这个Webbench有连接的版本 是用的linya学长提供的Webbench

真的不太懂连接原理 短连接在收到消息后里面关闭
我可以理解 长连接 我的服务器最大描述符才开了65536都是默认不关闭连接的 怎么做到测试的这么多的…


刚刚用netstat统计了一下 发现果真如同我的猜想一样 连接数被占满后就再也没有多出来了 我在不同的时段统计了三次 并且写入了文件 发现连接数在20000的时候 就再也没有动过了

从某个角度来说 可以说当我们文件描述符用到了上限时 我们的idle文件描述符起了大用 也可以说 从这边来说 这个长连接的测试 确实感觉是不太合理的

如果是我理解有误 或者确实考虑不全面 欢迎大家下面留言交流


4、c10k压力测试 对比muduo库的Webserver(短连接)


说实话 这个WebServer的框架结构 我也是绝大部分借鉴的muduo
如果存在性能巨大差异 要不就说明 我的代码哪里出问题 出现了性能障碍 要不也没其他可能了

如果性能有些许差异 是正常的 有可能muduo库相对我们做的前置工作更多 在连接的时候 调用了更多系统调用 比我们的更完善而导致表面的性能出现了差异

那我们下面就来最后测试一下吧 最后说明
这些测试都是在本机上面进行的测试 关闭所有Logging 也就是我去把所有的Logging都给注释 再重新编译了

还有 都是设置的6线程 因为本机为6核12线程 环境都是相同的

如果性能没有多少差异 或者差异不大 这才是我们想看到的
符合我们的预期的话 测试这一篇的话 就可以完美结束了 也说明我们的代码没有非常明显的性能陷阱了


十分符合我们的预期 这也说明我们的服务器没有明显的错误
没不存在明显的性能瓶颈

测试性能存在一定的偏差 这也是正常的
哈哈 终于可以舒一口气了 这段时间一直不敢和muduo测 我怕到时候又忽然发现自己的服务器出现性能瓶颈 又回到之前的那几天 真的很难绷的查找性能瓶颈的那些天 就会发现总会出现各种各样的问题 然后自己不停的从早改到晚

现在终于可以好好的松一口气了


结束语


我们的测试 明显没有跑到机器最高的性能 但是测试也是同样的环境 只需要横向对比 也可以知道 服务器是否达到预期性能 是否存在性能陷阱

至于如何优化虚拟机 如何设置虚拟机使其能够用尽本机的物理性能 这方面之前也想过要不要花点时间研究 但之后想了想还是作罢

优化后 与优化前 对比的服务器还是一样的
在稍微差一点的性能环境下跑 差距相对没有这么大
在好一点的性能环境下跑 性能差距也就会扩大 但也不至于扩大到难以想象的地步

何况我本机的cpu也跑到了7012核心的时候达到百分之百 但性能优化也不明显 说明瓶颈在其他地方… 这也说明没有优化虚拟机设置的必要了
从这方面说明 服务器代码没问题 性能是高性能 有保障的即可

好了 磨蹭着磨蹭着 也下午6点了 待会还要去交毛概作业
花个15分钟给他做了 开开心心的 休闲的把接下来的事情做了 哈哈

最后几篇了 还是放个什么图片结束吧 放张我的虚拟机的文件夹们的图片结束吧 再放张目前项目代码统计 来开心愉快的结束这篇博客啦


ε=ε=ε=(~ ̄▽ ̄)~跑辣~

有关从零开始自制实现WebServer(十八)---- 对服务器做最后的压力测试 WebBench压测小工具 项目迎来终章的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  3. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  4. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  5. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  6. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  7. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  8. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  9. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  10. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

随机推荐