嵌入式Linux内存使用与性能优化_第1页
嵌入式Linux内存使用与性能优化_第2页
嵌入式Linux内存使用与性能优化_第3页
嵌入式Linux内存使用与性能优化_第4页
嵌入式Linux内存使用与性能优化_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式Linux内存使用与性能优化5.4性能分析5.4性能分析程序性能的问题,有很多原因,需要对症下药。导致软件性能低下,主要有下陶中原因。(1) 程序的运算量很大,导致CPU过于繁忙,CPU是瓶颈。可以在设备上运行“top”命令,如果某个进程的CPU利用率很高,则说明CPU是性能瓶颈。(2) 程序需要做大量的I/O,读写文件、内存操作等等,CPU更多的是处于等待,I/O部分成为程序性能的瓶颈。运行“top”命令,系统内进程的CPU利用率并不高,这时可以通过proc目录下的相关文件(后面将会讲到)查看系统I/O情况。如果系统存在大量的I/O,则可以断定I/O为性能瓶颈。对于大量I/O操作引起的程序性能问题,笔者向大家推荐一篇文章:《使用异步I/O大大提高应用程序的性能》,网址是/developerworks/cn/linux/l-async/这篇文章说得很透彻,也很详细,笔者就不再重复了。(3) 程序之间相互等待,结果CPU利用率很低,但运行速度依然很慢,程序间的共享与死锁制约了程序的性能。如果系统的CPU利用率并不高,而且也不存在大量的I/O操作,那么很可能是多个线程之间相互等待造成的,这时就需要对程序进行大规模的重构。本书将性能优化的重点放在第一种情况。proc目录通过proc目录,能够了解到CPU和IO设备的工作状况,从而能够帮助分析导致程序性能低下的原因。1.系统相关还是先通过proc目录,了解整个系统的性能。#cat/proc/statcpu511607801249195604155cpu0511607801249195604155intr364129000000007793000069000034250001000856126201400085936839200115701152033000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000ctxt231056btime1167696676processes515procs_running1procs_blocked0因为嵌入式设备中一般只有一个CPU,所以这里只关注第一行。cpu511607801249195604155cpu后面数值分别代表着CPU在不同状态下所用的时间,其单位为jiffy(0.01s),7个数值的含义分别是:user(5116):从系统启动开始累计到当前时刻,用户态的CPU时间,不包含nice值为负的进程。nice(0):从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间。system(7801):从系统启动开始累计到当前时刻,内核所占用的CPU时间。idle(249195):从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其他等待时间。iowait(60):从系统启动开始累计到当前时刻,硬盘IO等待时间。irq(41):从系统启动开始累计到当前时刻,硬中断时间。softirq(55):从系统启动开始累计到当前时刻,软中断时间。由此可以推导出:CPU时间=user+system+nice+idle+iowait+irq+softirqCPU的利用率二1-(idle)/(user+system+nice+idle+iowait+irq+softirq)根据CPU的利用率,可以知道当前系统的CPU的负载情况。从这些数据中,可以分析出性能瓶颈在哪:程序代码有问题,导致占用了大量的CPU,可以通过CPU用户态利用率二(user+nice)/(user+system+nice+idle+iowait+irq+softirq)来了解。程序代码调用了大量的系统调用,导致Linux内核占用了大量的CPU,可以通过CPU内核态利用率二(system)/(user+system+nice+idle+iowait+irq+softirq)来了解。系统和Flash、内存等有大量的交互和等待,从而导致系统性能下降,可以通过IO利用率二(iowait)/(user+system+nice+idle+iowait+irq+softirq)来了解。通过这些数据,可粗略定位系统的瓶颈为何种类型,从而进行有目的的优化。还有一个与程序性能有关的指标:#cat/proc/loadavg0.640.530.433/121482loadavg主要检查当前的系统的负载情况。其数据含义如下:0.64 1分钟平均负载。0.53 5分钟平均负载。0.43 15分钟平均负载。3 在采样时刻,运行队列的任务的数目,与/proc/stat的procs_running表示相同意思。121 在采样时刻,系统中活跃的任务的个数(不包括运行已经结束的任务)。482最大的pid值,包括轻量级进程,即线程。2.进程相关在proc目录下面,有很多以数字为名字的目录,这些数字对应着当前系统中的进程和线程,进入目录,可以看到很多文件,这些文件则标识着每个进程和线程的相关信息。cd/proc/510查看文件stat:catstat510(telnetd)S3673673670-1256223010060015010250583690496155429496729532768645464320444795232044470881091367176004032218344880017000c2477820每个参数解释如下:pid=510进程(包括轻量级进程,即线程)号。comm=telnetd应用程序或命令的名字。task_state=S任务的状态,R:runnign;S:sleeping;D:disksleep;T:stopped;T:tracingstop;Z:zombie;X:dead。ppid=367父进程ID。pgid=367线程组号。sid=367该任务所在的会话组ID。tty_nr=0(pts/3)该任务的tty终端的设备号,INT(34817/256)二主设备号,(34817-主设备号)二次设备号。tty_pgrp=-1终端的进程组号,当前运行在该任务所在终端的前台任务(包括Shell应用程序)的PID。task->flags=256进程标志位,查看该任务的特性。min_flt=223该任务不需要从硬盘拷数据而发生的缺页(次缺页)的次数。cmin_flt=0累计的该任务的所有的waited-for进程曾经发生的次缺页的数目。maj_flt=1该任务需要从硬盘拷数据而发生的缺页(主缺页)的次数。cmaj_flt=0累计的该任务的所有的waited-for进程曾经发生的主缺页的数目。utime=0该任务在用户态运行的时间,单位为jiffy。stime=6该任务在核心态运行的时间,单位为jiffy。cutime=0累计的该任务的所有的waited-for进程曾经在用户态运行的时间,单位为jiffy。cstime=0累计的该任务的所有的waited-for进程曾经在核心态运行的时间,单位为jiffy。priority=15任务的动态优先级。nice=0任务的静态优先级。num_threads=1该任务所在的线程组里线程的个数。it_real_value=0由于计时间隔导致的下一个SIGALRM发送进程的时延,以jiffy为单位。start_time=25058该任务启动的时间,单位为jiffy。vsize=3690496该任务的虚拟地址空间大小。rss=155(page)该任务当前驻留物理地址空间的大小。vsize=3690496该任务的虚拟地址空间大小。这些页可能用于代码、数据和栈。rss=155(page)该任务当前驻留物理地址空间的大小。rlim=4294967295(bytes)该任务能驻留物理地址空间的最大值。start_code=32768该任务在虚拟地址空间的代码段的起始地址。end_code=645464该任务在虚拟地址空间的代码段的结束地址。start_stack=3204447952该任务在虚拟地址空间的栈的结束地址。kstkesp=3204447088esp(32位堆栈指针)的当前值,与在进程的内核堆栈页得到的一致。kstkeip=1091357176指向将要执行的指令的指针,EIP(32位指令指针)的当前值.。pendingsig=0待处理信号的位图,记录发送给进程的普通信号。block_sig=0阻塞信号的位图。sigign=4忽略的信号的位图。sigcatch=0被俘获的信号的位图。wchan=3221834488如果该进程是睡眠状态,该值给出调度的调用点。nswap=0被swapped的页数,当前没用。cnswap=0所有子进程被swapped的页数的和,当前没用。exit_signal=17该进程结束时,向父进程所发送的信号。task_cpu(task)=0运行在哪个CPU上。task_rt_priority=0实时进程的相对优先级别。task_policy=0进程的调度策略,0:非实时进程;1:FIFO实时进程;2:RR实时进程。通过文件stat的utime、stime、cutime和cstime的数值,能够计算出进程的CPU占用率。主要思路:进程CPU占用率二进程占用CPU时间/系统总的时间。进程占用CPU时间,可以从进程的stat文件获得(utime、stime、cutime、cstime),系统总的时间,需要通过其他方式获得,例如通过/proc/stat或者通过C函数gettime获得。要想获得进程CPU占用率,需要两个采样点:采样点1:系统时间记为:sys1,进程时间分别为:utime1stime1cutime1cstime1采样点2:系统时间记为:sys2,进程时间分别为::utime2stime2cutime2cstime2进程CPU占用率二((utime2+stime2-cutime2-cstime2)-(utime1+stime1-cutime1-cstime1))/(sys2-sys1)进程用户态占用率=((utime2-cutime2)-(utime1-cutime1))/(sys2-sys1)进程内核态占用率=((stime2-cstime2)-(stime1-cstime1))/(sys2-sys1)3.top虽然能够通过proc目录获得绝大部分进程的运行信息,但对于程序员来讲还不是很直观,好在Linux上有一些现成的工具可以供我们使用。top是最常用来监控系统范围内进程活动的工具,它提供运行在系统上的与CPU关系最密切的进程列表,以及许多有意义的统计值,例如负载平均、进程数量以及使用的存储器和页面空间的数量。一般使用top命令来查看进程的CPU利用率的问题。在某一刻,系统突然变得很慢,这时候我们的第一反应就是运行top,来查看是哪一个进程占用了大量的CPU。#busyboxtopMem:87128Kused,27360Kfree,0Kshrd,17888Kbuff,42396KcachedLoadaverage:1.24,0.48,0.17(State:S=sleepingR=running,W=waiting)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论