背景

在项目中需要用到解压功能,之前还记录了下,将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. 死磕 java线程系列之线程池深入解析——定时任务执行流程

    (手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:本文基于ScheduledThreadPoolExecutor定时线程池类. 简介 前面我们一起学习了普通 ...

  2. 2019 年容器生态统计报告发布 | 云原生生态周报 Vol. 26

    作者 | 酒祝.天元.元毅.心水.衷源 业界要闻 1.2019 年容器生态统计报告发布  据报告显示,Kubernetes 占据 77% 的容器编排产品份额,Docker 占据 79% 的容器引擎产品 ...

  3. 一些 bypass WAF 技巧

    也是之前讲课写的,现在搬运过来 --- WAF所处的位置 * 云WAF * 硬件WAF * 软件WAF * 代码级WAF   WAF的绕过 1 架构层    1 对于云WAF,寻找真实ip       ...

  4. JavaSE语法(中)

    6.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 是值传递.Java语言的方法调用支持参数的值传递.当一个对象实例作为一个 ...

  5. LNMP下zabbix_server安装部署二

    上一篇中搭建完成了zabbix的web端,但是虚拟机有点问题,所以转到笔记本上来写笔记本环境 server:192.168.112.9 agent:192.168.112.8 ​ 上一篇中完成了web ...

  6. NOIP模拟13

    上来看了一遍题,发现T2似乎不可做...暴力只给20分怎么玩? T1感觉是要离线处理,但是看了一会发现不会,遂决定先打暴力.然后去把T2 20分拿了,回去看T1,手摸了一下样例,成功推出式子,5分钟码 ...

  7. DOM增删改替换

    一.在创建元素的时候为什么要把创建元素到也页面写到后面?   要求:创建一个div,在div中创建10个span. var div = document.createElement("div ...

  8. Vue 2.x 3.x 配置项目开发环境跟线上环境

    先找到package.json  (这是nuxt版的vue 可能会跟一般vue不一样  当然总体上差不多的) "scripts": { "dev": " ...

  9. PHP Swoole-Demo TCP服务端简单实现

    tcp 服务端简单demo与client . <?php /** * author : rookiejin <mrjnamei@gmail.com> * createTime : 2 ...

  10. [LC]234题 Linked List Cycle (回文链表)(链表)

    ①中文题目 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2输出: false示例 2: 输入: 1->2->2->1输出: true进阶:你能否用 O(n) 时间 ...