草庐IT

Lmbench测试集 --- 延迟测试工具lat_mem_rd

MonologueYY 2023-08-29 原文

Lmbench测试集 --- 延迟测试工具lat_mem_rd

lmbench测试集简介

lmbench是一套简单的可移植的微型测评工具。

Linux性能测试

主要功能:延迟、带宽、处理器时钟比率计算

基本使用步骤:

  • 解压安装
  • make编译
  • make result命令 进行总体的性能测试
    执行过程中可根据提示自己选择需要的选项,若无特殊要求可以直接回车选择默认
  • make see命令 查看结果
    也可以cd到results目录下查看summary.out文件

lmbench所包含的测试工具有很多,从make result的结果中可以看出有以下:

  1. 系统基本参数
  2. 处理器Processor性能
  3. 数学运算:整型、无符号整型、浮点型、双精度型
  4. 上下文切换
  5. 本地通讯延时
  6. 文档、内存延时
  7. 本地通信贷款
  8. 内存操作延时

本篇博客将以内存读取延迟为例,主要介绍lat_mem_rd测试工具。

lat_mem_rd延迟测试工具

如何测试

从工具名就可以看出:latency_memory_read,内存读取的延迟测试
该测试工具是lmbench的常用测试之一,编译成功之后,cd到bin目录下就可以看到该程序的可执行文件啦。

测试CPU与内存之间的读取延迟

命令使用:./lat_mem_rd <-t> size_in_megabytes stride
若需要指定测试时的核与通道:numactl -C num1 -m num2

  • 举例:

numactl -C 0 -m 0 ./lat_mem_rd -t 1 16

-C 0:程序运行时指定使用0核
-m 0:程序运行时指定使用通道0
-t:随机访问模式,若无此选项为顺序访问
1:访问的最大数据块,单位M
16:访问的步长大小,单位Byte

测试结果

执行结果的左侧为数据块大小,单位为兆M;右侧为在该数据块大小时测得的延时,延时单位是纳秒ns。

stride=16
0.00049 1.584
0.00098 1.583
0.00195 1.593
0.00293 1.593
0.00391 1.597
0.00586 1.598
0.00781 1.600
0.01172 1.600
0.01562 1.602
0.02344 1.602
0.03125 1.628
0.04688 2.230
0.06250 2.207
0.09375 2.205
0.12500 2.204
0.18750 2.237
0.25000 2.278
0.37500 2.326
0.50000 2.351
0.75000 2.345
1.00000 2.349

源码分析

可以先看看官网对于该测试工具的一个描述:
点击进入官网

  • 测量不同内存大小和跨度的内存读取延迟。结果以每次加载纳秒为单位报告;
  • 测量整个内存层次结构,包括板载缓存延迟和大小、外部缓存延迟和大小、主内存延迟和TLB未命中延迟。
  • 仅测量数据访问;指令缓存没有测量。
  • 基准测试作为两个嵌套循环运行。外环是步幅大小。内部循环是数组大小。对于每个数组大小,基准创建一个指针环,指向前一个步长。遍历数组由p = (char **)*p;
  • 数组的大小从 512 字节开始。对于小尺寸,缓存会起作用,加载速度会快得多。

以下是博主自己的理解,若有不对请批评指正!
测试主要流程:

1、解析命令参数
2、根据输入的命令更新测试参数(步长,最大访问数据块大小等)
这里需要说明的是,除去最大访问数据块的大小必须设置之外,其他的选项都被赋予了默认值。
3、loads函数进行延迟测试
该函数就是最主要的函数了。测试是通过两层嵌套循环完成的:

  • 外层循环是每次访问的range大小(就是测试结果左侧那一列),最小值是0.00049M(512K),循环增加至所设置的最大数据块大小
  • 内层循环是访问次数count,count的计算是由range与stride(步长)共同决定的
    结果计算就是访问某个数据块大小所用的时间除以访问次数count就得到了延迟大小
  • 对于每次循环,基准创建了一个链表,指针指向前一个步长,数组的遍历通过指针完成

4、结果打印

有关Lmbench测试集 --- 延迟测试工具lat_mem_rd的更多相关文章

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

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

  2. 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(在整个项目的根目录中),然后当

  3. 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?并散列所有无济于事。

  4. 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

  5. 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/

  6. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  7. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  8. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

  9. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  10. ruby-on-rails - 如何调试 cucumber 测试? - 2

    我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element

随机推荐