记录一次系统调用慢的 分析过程

本文详细记录了一次系统调用慢的问题分析过程,涉及不同平台的对比测试,发现Skyworth系统中system函数执行命令时间长达250ms,远高于其他平台的20~50ms。通过实验和strace跟踪,确定问题与环境变量、系统调用开销及库查找时间有关。最后提出解决方案,包括使用静态busybox以减少库查找时间,以及在特定模式下管理环境变量,成功将系统调用时间降低到30ms左右。
摘要由CSDN通过智能技术生成


收到问题jira描述

   

      [EM][] [工厂适应性问题]执行shell命令,系统反应慢

      
分析发现调用系统system函数执行命令的时间过长,每条命令执行约250ms。对比其它平台只需要20~50ms,请安排确认一下。

      01-01 00:01:31.816 I/sita.common(1758): cmdstring is cp -rf /userdata/FactoryData.db/mnt/usb/sda/database/userdata/

        01-01 00:01:31.817 I/sita.common( 1758):@_@[os_cmd_system] temp_cmd_string:busybox cp -rf /userdata/FactoryData.db/mnt/usb/sda/database/userdata/

        01-01 00:01:31.817 I/sita.common( 1758):[os_cmd_system] temp_cmd_string:busybox cp -rf /userdata/FactoryData.db/mnt/usb/sda/database/userdata/

System_call

问题确认过程

 

 

Skyworth & 566TK对比数据

         Sky 562测试:

         system()测试如下:

         [Serial-COM40619-152503-980]wysdebugcall system() begin1 0

         [Serial-COM40619-152504-553]00:21:97:11:03:30

         [Serial-COM40619-152504-582]wysdebugcall system() end1

 

 

         [Serial-COM40619-152504-584]wysdebugcall system() begin1 1

         [Serial-COM40619-152505-180]00:21:97:11:03:30

         [Serial-COM40619-152505-181]wysdebugcall system() end1

 

         基本每次call system耗时600ms.

 

         566 TK 测试:  

         [20170620_16:17:13:448] wysdebugcall system() begin 0

         [20170620_16:17:13:557]00:21:00:87:00:01

         [20170620_16:17:13:557] wysdebugcall system() end 0

         [20170620_16:17:13:557] wysdebugcall system() begin 1

         [20170620_16:17:13:651]00:21:00:87:00:01

         [20170620_16:17:13:651] wysdebugcall system() end 1

         Skyworth 据和tcl一致566tk较快,但是566 ic性能较好.

 

      我一开始觉得这个不是主要因素.

      Bug单的问题是pc串口工具中间件通信超时.

      所以做了个实验写一个main函数测了一下时间

      gettimeofday(&t_start, NULL);

 

      system("busybox su");

 

      gettimeofday(&t_end, NULL);

 

      cost_time = t_end.tv_usec -t_start.tv_usec;

 

      printf("Cost time: %ldus", cost_time);

      只有10ms大概

 

      然后就回复客户请他们优化

      把多个system call 命令组合一下

      命令序列 ; & && ||

      ;  从左到右依次被执行,返回最后一个命令的执行状态

      &  该命令将在后台被执行,即在子bash中执行(或ctrl+zbg jobsbg命令号)(变量$!$one$two$three返回后台进程的pid

      && 当且仅当左边的命令退出状态为0时,才执行右边的命令(Linux0为执行成功,非0为失败)

      ||  当且仅当左边的命令执行失败时才会执行右边的命令

 

 

      客户回复如下:

      张工:

       

      目前的主要问题是执行一次fpi_system_shell_cmd()的时间过长,这个项目与其它项目相差太大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值