背景

在项目中需要用到解压功能,之前还记录了下,将uboot解压代码移植到另外的bootloader中时,碰到的效率问题。最终查明是cache的配置导致的。

https://www.cnblogs.com/zqb-all/p/11443127.html

优化前速度是uboot的十分之一,优化后速度达到uboot的两倍多。

没想到风水轮流转,最近在uboot中用了解压功能,结果最终在进行启动速度优化时,发现解压速度很慢,

不仅比不上移植到另一个bootloader中的解压速度,而且比之前测到过的uboot解压速度要慢得多。

同样的数据量,在另一个bootloader中解压耗时低于200毫秒,而记忆中的之前测到的uboot中耗时为数百毫秒,最新数据测得是接近2秒。

cache

最开始还是怀疑cache,一顿操作一无所获,经过确认cache是确实使能了的,类型也是write-back,没有问题。为了确认还故意将其配置为write-through,测得性能进一步降低了,这才确认此路不通。

watchdog

继续排查,最终才性能问题是一个watchdog配置项引入的,打开了watchdog之后解压耗时就从数百毫秒增加到了接近2秒,足足三倍。

watchdog怎么就影响到了解压速度呢?原来uboot在很多地方预置了watchdog的喂狗的钩子,当适配了watchdog驱动并使能之后,这些钩子就会生效,自动喂狗。

现在的问题就出在,zlib库中也被预置了喂狗的钩子,这就导致watchdog使能之后,解压的循环中会不停喂狗,多出了不少开销。

考虑到我们实际这块板子的watchdog超时时间长达16s,而解压的耗时在百毫秒级别,根本不需要考虑在解压过程喂狗,因此解决方式简单粗暴,将zlib中的喂狗操作全部去除即可。

指定解压后长度

搞定了watchdog之后速度提升不少,但还是比之前移植到另一个bootloader的解压慢,这个也不正常,于是进一步排查。

最终发现,问题出在我们本次在uboot中调用gunzip时偷懒了,没有去解析解压前后文件的大小,直接将src_len和dst_len指定为~0UL。

这是从unzip命令的实现中学的,默认 src_len = ~0UL, dst_len = ~0UL; 是否指定解压后文件大小是可选的

本想简单些,让解压库自行处理,反正我们已经分配了足够的大小,肯定不会越界,没想到不指定还会带来效率问题。

解决方法,从压缩包的尾部读出压缩前的原始文件大小,解压时作为参数传给gunzip函数。

下面是直接在控制台调用unzip命令,使用minicom的时间戳,来演示带长度和不带长度的区别

只指定源地址和目的地址,则耗时约430ms

[2019-11-25 09:59:43.014] => version;unzip 40901000 40000000
[2019-11-25 10:00:10.359] U-Boot 2018.05 (Nov 25 2019 - 09:20:58 +0800) Allwinner Technology
[2019-11-25 10:00:10.385]
[2019-11-25 10:00:10.385] arm-linux-gnueabi-gcc (Linaro GCC 7.2-2017.11) 7.2.1 20171011
[2019-11-25 10:00:10.385] GNU ld (Linaro_Binutils-2017.11) 2.28.2.20170706
[2019-11-25 10:00:10.815] Uncompressed size: 6553388 = 0x63FF2C

指定源地址和目的地址,同时指定长度,则耗时约170ms

[2019-11-25 10:00:10.831] => version;unzip 40901000 40000000 0x63FF2C
[2019-11-25 10:00:30.486] U-Boot 2018.05 (Nov 25 2019 - 09:20:58 +0800) Allwinner Technology
[2019-11-25 10:00:30.486]
[2019-11-25 10:00:30.486] arm-linux-gnueabi-gcc (Linaro GCC 7.2-2017.11) 7.2.1 20171011
[2019-11-25 10:00:30.487] GNU ld (Linaro_Binutils-2017.11) 2.28.2.20170706
[2019-11-25 10:00:30.646] Uncompressed size: 6553388 = 0x63FF2C

本文链接 https://www.cnblogs.com/zqb-all/p/11966601.html

记一次uboot中gunzip解压速度慢的问题排查的更多相关文章

  1. *.tar 用 tar –xvf 解压 *.gz 用 gzip -d或者gunzip 解压 *.tar.gz和*.tgz 用 tar –xzf 解压 *.bz2 用 bzip2 -d或者用bunzip2 解压 、*.tar.bz2用tar –xjf 解压

    解压: 1.*.tar 用 tar –xvf 解压, --skip-old-files跳过已经存在的文件,压缩用tar -cvf 2.*.bz2 用 bzip2 -d或者用bunzip2 解压 3.* ...

  2. 解决ubuntu中zip解压的中文乱码问题

    转自解决ubuntu中zip解压的中文乱码问题 在我的ubuntu12.10中,发现显示中文基本都是正常的,只有在解压windows传过来的zip文件时,才会出现乱码.所以,我用另一个方法解决中文乱码 ...

  3. linux中的解压,压缩命令

    tar命令 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName gz命令 解压1:gunzip FileName.gz 解压2:gzip ...

  4. Linux中如何解压iso类型文件

    在Linux下如何解压iso类型的文件呢? 可以使用mount命令来处理 [root@DB-Server tmp]# ls /tmp/rhel-server-5.7-x86_64-dvd.iso /t ...

  5. 在linux中如何解压.tgz

    然后首先:打开终端 1,进入下载路径下,比如我的就是进入Downloads下. 输入命令: cd Downloads 2,解压到当前文件夹 输入:tar zxvf  文件名.tgz -C ./     ...

  6. Java代码中的(解压7z加密版)

    maven:需要加上这个下载这两个包 <dependency> <groupId>net.sf.sevenzipjbinding</groupId> <art ...

  7. linux 中压缩记得压缩用c,解压用x

    tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个.下面的 ...

  8. linux中tar及压缩解压命令用法

    把常用的tar解压命令总结下,当作备忘: tar 命令可以为Linux的文件和目录创建档案.利用 tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向 档案中加入新的文件.t ...

  9. linux中tar命令(打包、压缩、解压)、zip和unzip、rar多种压缩文件

    一.名词解释 打包:将一大堆文件或目录变成一个总的文件[tar命令] 压缩:将一个大的文件通过一些压缩算法变成一个小文件[gzip,bzip2等] Linux中很多压缩程序只能针对一个文件进行压缩,这 ...

随机推荐

  1. Redis(九)哨兵:Redis Sentinel

    Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,对于很多应用场景这种故障处理的方式是无法接受的. Redis从2.8开始正式 ...

  2. Spring中@Resource注解报错

    描述:Spring框架中,@Resource注解报错,在书写时没有自动提示 解决方法:因为maven配置文件的pom.xml文件中缺少javax.annotation的依赖,在pom.项目路中加入依赖 ...

  3. (JavaScript) JS方式调用POS机蓝牙打印

    function print(mac_address) { if (!mac_address) { mui.toast('请选择蓝牙打印机'); return; } main = plus.andro ...

  4. python:将网页图片保存到本地

    1.requests库介绍 在python中,有一个非常好用的网络请求库requests,使用它可以发起网络请求,并获取网页返回的内容.同时,也可以进行网页图片下载 requests是使用Apache ...

  5. PHP获取当前时间

    PHP获取系统当前时间,有date()可以使用. 但date()当前系统时间是格林威治时间,比我们所在的时区晚了整整8个小时.以前处理这个问题时,只是简单的把获取的当前系统的时间戳加上8个小时的时间, ...

  6. 爬虫之scrapy简介

    原始的爬虫流程:效率低.同步.阻塞 scrapy执行流程:效率高.异步.非阻塞 scrapy的概念 scrapy是一个爬虫框架 开发速度快 稳定性高 性能优越 scrapy的流程 1. 爬虫模块(Sp ...

  7. TCP/IP协议第一卷第二章

    环回接口: 127全网段均被作为环回地址. 传给广播地址或多播地址的数据报复制一份给环回接口,然后传送到以太网上.这是因为广播传送和多播传送的定义包含自己本身. 任何传给该主机IP地址的数据均送到环回 ...

  8. [考试反思]1103csp-s模拟测试99: 美梦

    可能这次考得好的原因就是熬夜颓废到不算太晚?(啪) 但是是真心困. 考前跟akt说:我希望今天考一点那种不用动脑子,就是一直码的题. 然后开门T1一道线段树维护单调栈的板子我就...了 当时调了一上午 ...

  9. Python 定义动态变量

    问题描述 在做数据处理时,对一些分组得来的数据,所做的操作大同小异,变量的命名也都拥有相同的结构,比如对每个月份的数据求均值.方差等统计量,变量的命名可取为“n月的均值”,“n月的方差”,抽象出来就是 ...

  10. python——自行实现sorted函数

    仿照内建函数sorted,自行实现一个sort函数,能够为列表进行排序 看下面实例的前提是掌握 0.掌握sorted函数的用法.1.函数基本概念.2.函数是如何传参的.3.掌握三元表达式.4.掌握内建 ...