大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是内存读写正确性压力测试程序memtester。

在嵌入式系统中,内存(RAM)的重要性不言而喻,系统性能及稳定性都与内存息息相关。关于内存性能有很多个不同指标,其中最基础的指标便是访问可靠性(即读写的正确性),只有稳定可靠的内存访问才能确保系统正常运行。很多时候简单地内存读写测试并不能发现隐藏的问题,因此我们需要一个完备的内存访问压力测试程序,今天痞子衡就和大家详细聊一聊memtester。

一、内存性能测试程序集

在讲memtester之前,痞子衡先给大家科普一下Linux系统下常用的内存性能测试工具,它们分别是mbw、memtester、lmbench、sysbench。这几个测试工具(程序)各有侧重点:

内存带宽测试工具 --mbw;内存压力测试工具 --memtester;内存综合性能测试工具 --lmbench;内存申请与读写速度测试工具 --sysbench;

二、memtester程序

memtester是Simon Kirby在1999年编写的测试程序(v1版),后来由Charles Cazabon一直维护更新(v2及之后版本),主要面向Unix-like系统,官方主页上介绍的是“A userspace utility for testing the memory subsystem for faults.”,其实就是为了测试内存(主要DDR)的读写访问可靠性(仅正确性,与速度性能无关),这是验证板级硬件设备必不可少的一项测试。

整个memtester测试的视角就是从用户的角度来看的,从用户角度设立不同的测试场景即测试用例,然后针对性地进行功能测试,注意是从系统级来测试,也就是说关注的不单单是内存颗粒了,还有系统板级的连线、IO性能、PCB等等相关的因素,在这些因素的影响下,内存是否还能正常工作。

2.1 获取程序

memtester程序的最新版本是4.5.0,早期的v1/v2/v3版本目前下载不到了,2012年Charles Cazabon重写了程序并发布了全新v4.0.0,此后一直不定期更新,v4.x也是当前最流行的版本。

核心程序下载:http://pyropus.ca/software/memtester/

核心程序包下载后,在\memtester-4.5.0\下可找到源代码。详细源文件目录如下:

\memtester-4.5.0 \memtester.h \memtester.c --主程序入口 \sizes.h --关于系统位数(32/64bit)的一些定义 \types.h --所用数据类型的定义 \tests.h \tests.c --测试算法子程序

如果是移植到ARM Cortex-M平台下裸系统运行,一般只需要简单修改memtester.c文件即可,其他源文件就是一些头文件包含方面的改动,memtester本身并没有太多移植工作,其源码本是用作在Unix-like系统上运行的,而在嵌入式系统里运行仅需要把一些跟系统平台相关的代码删除即可,此外就是打印函数的实现。

2.2 配置参数

memtester源码里的配置选项主要是如下五个宏:

/* 如下需用户自定义 */ULONG_MAX -- 确定系统是32bit还是64bitTEST_NARROW_WRITES -- 确定是否要包含8/16 bit写测试/* 如下借助linux头文件 */_SC_VERSION -- posix system版本检查_SC_PAGE_SIZE -- 内存page大小获取MAP_LOCKED -- Linux里mmap里的swap特性

2.3 程序解析

让我们尝试分析memtester主函数入口main,main()函数最开始都是一些输入参数解析,其实主要就是为了获取三个重要变量:内存测试起始地址、内存测试总长度、压力测试循环次数,有了这三个变量值之后便开始逐一跑tests.c文件里各项测试算法小函数:

struct test { char *name; int (*fp)();};struct test tests[] = { { “Random Value”, test_random_value }, { “Compare XOR”, test_xor_comparison }, { “Compare SUB”, test_sub_comparison }, { “Compare MUL”, test_mul_comparison },

{ “Compare DIV”,test_div_comparison }, { “Compare OR”, test_or_comparison }, { “Compare AND”, test_and_comparison }, { “Sequential Increment”, test_seqinc_comparison },

{ “Solid Bits”, test_solidbits_comparison }, { “Block Sequential”, test_blockseq_comparison }, { “Checkerboard”, test_checkerboard_comparison }, { “Bit Spread”, test_bitspread_comparison },

{ “Bit Flip”, test_bitflip_comparison }, { “Walking Ones”, test_walkbits1_comparison }, { “Walking Zeroes”, test_walkbits0_comparison },#ifdef TEST_NARROW_WRITES { “8-bit Writes”, test_8bit_wide_random }, { “16-bit Writes”, test_16bit_wide_random },#endif { NULL, NULL }};/* Function definitions */void usage(char *me) { fprintf(stderr, “\n” “Usage: %s [-p physaddrbase [-d device]] 《mem》[B|K|M|G] [loops]\n”, me); exit(EXIT_FAIL_NONSTARTER);}int main(int argc, char **argv)

{ ul loops, loop, i; size_t bufsize, halflen, count; void volatile *buf, *aligned; ulv *bufa, *bufb; ul testmask = 0; // 省略若干变量定义代码 printf(“memtester version ” __version__ “ (%d-bit)\n”, UL_LEN); printf(“Copyright (C) 2001-2020 Charles Cazabon.\n”); printf(“Licensed under the GNU General Public License version 2 (only)。\n”); printf(“\n”); // 省略若干初始检查代码 // 从输入参数里获取physaddrbase计算出内存测试起始地址

aligned // 从输入参数里获取mem及B|K|M|G计算出内存测试总长度

bufsize halflen = bufsize / 2; count = halflen / sizeof(ul); bufa = (ulv *) aligned; bufb = (ulv *) ((size_t) aligned + halflen); // 压力测试的重要变量, loops即重复次数 for(loop=1; ((!loops) || loop 《= loops); loop++) { printf(“Loop %lu”, loop); if (loops) { printf(“/%lu”, loops); } printf(“:\n”); printf(“ %-20s: ”, “Stuck Address”); fflush(stdout); // 第一个测试

stuck_address if (!test_stuck_address(aligned, bufsize / sizeof(ul))) { printf(“ok\n”); } else { exit_code |= EXIT_FAIL_ADDRESSLINES; } // 遍历tests.c里的所有测试子程序 for (i=0;;i++) { if (!tests[i].name) break; if (testmask && (!((1 《《 i) & testmask))) { continue; } printf(“ %-20s: ”, tests[i].name); // 可以看到将内存测试总空间一分为二,传给子程序做处理的

if (!tests[i].fp(bufa, bufb, count)) { printf(“ok\n”); } else { exit_code |= EXIT_FAIL_OTHERTEST; } fflush(stdout); /* clear buffer */ memset((void *) buf, 255, wantbytes); } printf(“\n”); fflush(stdout); }}

tests.c文件里才是最核心的压力测试算法子程序,一共17个函数,涉及各种内存访问经验操作

2.4 结果格式

在Unix-like系统下使用make && make install命令进行编译可得到一个可执行的memtester,可以随便执行memtester 10M 1,即申请10M的内存测试1次,结果如下:

[root@as150 ~] memtester 10M 1memtester version 4.5.0 (64-bit)Copyright (C) 2001-2020 Charles Cazabon.Licensed under the GNU General Public License version 2 (only).pagesize is 4096pagesizemask is 0xfffffffffffff000want 10MB (10485760 bytes)got 10MB (10485760 bytes),

trying mlock 。。.locked.Loop 1/1: Stuck Address: ok Random Value: ok Compare XOR: ok Compare SUB: ok Compare MUL: ok Compare DIV: ok Compare OR: ok Compare AND: ok Sequential Increment: ok Solid Bits: ok Block Sequential: ok Checkerboard: ok Bit Spread: ok Bit Flip: ok Walking Ones: ok Walking Zeroes: ok 8-bit Writes: ok 16-bit Writes: okDone.

至此,内存读写正确性压力测试程序memtester痞子衡便介绍完毕了,掌声在哪里~~~

责任编辑:haq

arm linux 内存压力测试,嵌入式中如何给内存做压力测试?相关推荐

  1. 技术分享 | 在GreatDB分布式部署模式中使用Chaos Mesh做混沌测试

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 1. 需求背景与万里安全数据库软件GreatDB分布式部署模式介绍 1.1 需求背景 混沌测试是检测分布式系统不确定性.建 ...

  2. 致测试同仁们:让我们做安全测试吧!

    今天,很多软件并没有经过专门的安全测试便运行在互联网上,它们携带着各类安全漏洞直接暴露在公众面前,其中一些漏洞甚至直指软件所承载的核心敏感信息或业务逻辑.这些漏洞一旦被不怀好意者利用,很可能会给企业造 ...

  3. mpi4py linux例子,python-3.x – mpi4py中的共享内存

    我使用MPI(mpi4py)脚本(在单个节点上),它与一个非常大的对象一起使用.为了让所有进程都可以访问该对象,我通过comm.bcast()分发它.这会将对象复制到所有进程并占用大量内存,尤其是在复 ...

  4. python变量存储 堆与栈内存内存_浅析JS中的堆内存与栈内存

    最近跟着组里的大佬面试碰到这么一个问题, Q:说说var.let.const的区别 A:balabalabalabla... Q:const定义的值能改么? A:你逗我?不能吧 不知道各位看官怎么想? ...

  5. 接口压力测试:Postman【Postman通常用于做接口测试,同时也可以用于作为压力测试】、Jmeter【专门做压力测试】、Loadrunner、Apache AB、Webbench

    做开发的同学一定会遇到接口对接,今天介绍两个对接测试两个我个人认为比较好的测试工具 postman和jmeter 1.postman通常用于做接口测试,同时也可以用于作为压力测试 2.jmeter做压 ...

  6. 测试工作中一定要学会做业务总结

    前言:在日常的测试工作中,不知道大家是否会有梳理自己测试业务的习惯.我个人觉得这个事情是值得做的,最好培养成一个习惯,另外一定要依托于业务价值来实现自己的变现.梳理被测业务,就是一种很好的自我提升方式 ...

  7. android驱动测试,Android: 通过 cucumber 驱动 monkey 做稳定性测试

    主要内容 稳定性测试是什么 Monkey 介绍 自动化 Monkey 稳定性测试是什么 通过随机点击屏幕一段时间,看看 app 会不会奔溃,能不能维持正常运行. Monkey 介绍 Monkey 是一 ...

  8. ARM Linux (S3C6410架构/2.6.35内核)的内存映射(三)

    这里记录一下Linux内核做二级内存映射的过程,以中断向量表的映射过程为例. 在S3C6410架构下,Linux采用的是粗粒度小页内存管理方式,即内存段(section)的大小为1M,而页(page) ...

  9. arm linux i2c 总线驱动,ARM-Linux中I2C总线驱动开发

    摘  要: 针对I2C总线的特点,Linux内核中定义了I2C驱动体系结构.在分析Linux的I2C总线驱动体系结构基础上,介绍了在S3C2410中设计I2C总线驱动的方法. 关键词: ARM-Lin ...

  10. arm linux 添加ntp服务,嵌入式linux添加NTP服务

    版本信息: Linux version 4.1.15 需求: RTC时间不够精确,过一段时间就可以看出和实际时间有明显出入,有必要添加NTP服务,使系统可以与网络同步时间. 首先把NTP服务build ...

最新文章

  1. R语言plotly可视化:plotly可视化分组归一化直方图(historgram)并在直方图中添加密度曲线kde、并在直方图的底部部边缘使用geom_rug函数添加边缘轴须图
  2. 查看Linux进程状态
  3. 合格前端系列第五弹- Virtual Dom Diff
  4. oracle中存在函数吗,Oracle中的函数
  5. ​来,一起搞AV,LiveVideoStack Meet再启动
  6. Linux LNMP 环境的搭建之【Nginx的安装】
  7. PHP开发常见功能实现流程
  8. [恢]hdu 2016
  9. 解决:ngxin做http强制跳转https,接口的POST请求变成GET
  10. 基于Ext Core的包含校验功能的表单提交扩展Ext.ux.submit
  11. 工业相机选型、高速摄像机选型、相机参数接口总结
  12. 高动态范围红外图像压缩
  13. java char a z_java中,char A,char a的值各是多少?
  14. php 支付宝退款40004,接入支付宝支付 错误码4000,排查方法——开发记录
  15. 回归预测 | MATLAB实现NCA(近邻成分分析)多输入单输出
  16. 猫眼CEO郑志昊:为什么说产品思维已“死”?
  17. 基于R语言的关联规则分析项目
  18. Dota对我来说是什么?
  19. python excel word模板_Python将Excel数据插入Word模板生成详细内容文档
  20. 从maven私服(nexus)拉取jar文件,解析项目pom依赖信息

热门文章

  1. 资管运营BAND原创|那些年,资管运营业务交互中的酸甜苦辣
  2. (转)财新特稿丨风口浪尖上,李笑来谈ICO
  3. 「转发领抱枕」40万奖金等你来挑战!阿里云ECS Cloudbuild开发者大赛重磅开启
  4. 如何从“人肉运维”升级为“智能运维”?
  5. 身份密匙~迷惑的要点——大盘点
  6. 腾讯云TStack与IBM LinuxONE互认证
  7. 【高薪、俱进、携手】只要你敢来,海云就敢要!
  8. 【情感识别】基于matlab KNN算法语音情感识别【含Matlab源码 542期】
  9. 【图像去噪】基于matlab即插即用法图像去噪【含Matlab源码 152期】
  10. matlab 串口 事件,MATLAB 串口通信