嵌入式Linux內(nèi)存使用與性能優(yōu)化_第1頁
嵌入式Linux內(nèi)存使用與性能優(yōu)化_第2頁
嵌入式Linux內(nèi)存使用與性能優(yōu)化_第3頁
嵌入式Linux內(nèi)存使用與性能優(yōu)化_第4頁
嵌入式Linux內(nèi)存使用與性能優(yōu)化_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

嵌入式Linux內(nèi)存使用與性能優(yōu)化5.4性能分析5.4性能分析程序性能的問題,有很多原因,需要對癥下藥。導(dǎo)致軟件性能低下,主要有下陶中原因。(1) 程序的運算量很大,導(dǎo)致CPU過于繁忙,CPU是瓶頸??梢栽谠O(shè)備上運行“top”命令,如果某個進程的CPU利用率很高,則說明CPU是性能瓶頸。(2) 程序需要做大量的I/O,讀寫文件、內(nèi)存操作等等,CPU更多的是處于等待,I/O部分成為程序性能的瓶頸。運行“top”命令,系統(tǒng)內(nèi)進程的CPU利用率并不高,這時可以通過proc目錄下的相關(guān)文件(后面將會講到)查看系統(tǒng)I/O情況。如果系統(tǒng)存在大量的I/O,則可以斷定I/O為性能瓶頸。對于大量I/O操作引起的程序性能問題,筆者向大家推薦一篇文章:《使用異步I/O大大提高應(yīng)用程序的性能》,網(wǎng)址是/developerworks/cn/linux/l-async/這篇文章說得很透徹,也很詳細,筆者就不再重復(fù)了。(3) 程序之間相互等待,結(jié)果CPU利用率很低,但運行速度依然很慢,程序間的共享與死鎖制約了程序的性能。如果系統(tǒng)的CPU利用率并不高,而且也不存在大量的I/O操作,那么很可能是多個線程之間相互等待造成的,這時就需要對程序進行大規(guī)模的重構(gòu)。本書將性能優(yōu)化的重點放在第一種情況。proc目錄通過proc目錄,能夠了解到CPU和IO設(shè)備的工作狀況,從而能夠幫助分析導(dǎo)致程序性能低下的原因。1.系統(tǒng)相關(guān)還是先通過proc目錄,了解整個系統(tǒng)的性能。#cat/proc/statcpu511607801249195604155cpu0511607801249195604155intr364129000000007793000069000034250001000856126201400085936839200115701152033000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000ctxt231056btime1167696676processes515procs_running1procs_blocked0因為嵌入式設(shè)備中一般只有一個CPU,所以這里只關(guān)注第一行。cpu511607801249195604155cpu后面數(shù)值分別代表著CPU在不同狀態(tài)下所用的時間,其單位為jiffy(0.01s),7個數(shù)值的含義分別是:user(5116):從系統(tǒng)啟動開始累計到當前時刻,用戶態(tài)的CPU時間,不包含nice值為負的進程。nice(0):從系統(tǒng)啟動開始累計到當前時刻,nice值為負的進程所占用的CPU時間。system(7801):從系統(tǒng)啟動開始累計到當前時刻,內(nèi)核所占用的CPU時間。idle(249195):從系統(tǒng)啟動開始累計到當前時刻,除硬盤IO等待時間以外其他等待時間。iowait(60):從系統(tǒng)啟動開始累計到當前時刻,硬盤IO等待時間。irq(41):從系統(tǒng)啟動開始累計到當前時刻,硬中斷時間。softirq(55):從系統(tǒng)啟動開始累計到當前時刻,軟中斷時間。由此可以推導(dǎo)出:CPU時間=user+system+nice+idle+iowait+irq+softirqCPU的利用率二1-(idle)/(user+system+nice+idle+iowait+irq+softirq)根據(jù)CPU的利用率,可以知道當前系統(tǒng)的CPU的負載情況。從這些數(shù)據(jù)中,可以分析出性能瓶頸在哪:程序代碼有問題,導(dǎo)致占用了大量的CPU,可以通過CPU用戶態(tài)利用率二(user+nice)/(user+system+nice+idle+iowait+irq+softirq)來了解。程序代碼調(diào)用了大量的系統(tǒng)調(diào)用,導(dǎo)致Linux內(nèi)核占用了大量的CPU,可以通過CPU內(nèi)核態(tài)利用率二(system)/(user+system+nice+idle+iowait+irq+softirq)來了解。系統(tǒng)和Flash、內(nèi)存等有大量的交互和等待,從而導(dǎo)致系統(tǒng)性能下降,可以通過IO利用率二(iowait)/(user+system+nice+idle+iowait+irq+softirq)來了解。通過這些數(shù)據(jù),可粗略定位系統(tǒng)的瓶頸為何種類型,從而進行有目的的優(yōu)化。還有一個與程序性能有關(guān)的指標:#cat/proc/loadavg0.640.530.433/121482loadavg主要檢查當前的系統(tǒng)的負載情況。其數(shù)據(jù)含義如下:0.64 1分鐘平均負載。0.53 5分鐘平均負載。0.43 15分鐘平均負載。3 在采樣時刻,運行隊列的任務(wù)的數(shù)目,與/proc/stat的procs_running表示相同意思。121 在采樣時刻,系統(tǒng)中活躍的任務(wù)的個數(shù)(不包括運行已經(jīng)結(jié)束的任務(wù))。482最大的pid值,包括輕量級進程,即線程。2.進程相關(guān)在proc目錄下面,有很多以數(shù)字為名字的目錄,這些數(shù)字對應(yīng)著當前系統(tǒng)中的進程和線程,進入目錄,可以看到很多文件,這些文件則標識著每個進程和線程的相關(guān)信息。cd/proc/510查看文件stat:catstat510(telnetd)S3673673670-1256223010060015010250583690496155429496729532768645464320444795232044470881091367176004032218344880017000c2477820每個參數(shù)解釋如下:pid=510進程(包括輕量級進程,即線程)號。comm=telnetd應(yīng)用程序或命令的名字。task_state=S任務(wù)的狀態(tài),R:runnign;S:sleeping;D:disksleep;T:stopped;T:tracingstop;Z:zombie;X:dead。ppid=367父進程ID。pgid=367線程組號。sid=367該任務(wù)所在的會話組ID。tty_nr=0(pts/3)該任務(wù)的tty終端的設(shè)備號,INT(34817/256)二主設(shè)備號,(34817-主設(shè)備號)二次設(shè)備號。tty_pgrp=-1終端的進程組號,當前運行在該任務(wù)所在終端的前臺任務(wù)(包括Shell應(yīng)用程序)的PID。task->flags=256進程標志位,查看該任務(wù)的特性。min_flt=223該任務(wù)不需要從硬盤拷數(shù)據(jù)而發(fā)生的缺頁(次缺頁)的次數(shù)。cmin_flt=0累計的該任務(wù)的所有的waited-for進程曾經(jīng)發(fā)生的次缺頁的數(shù)目。maj_flt=1該任務(wù)需要從硬盤拷數(shù)據(jù)而發(fā)生的缺頁(主缺頁)的次數(shù)。cmaj_flt=0累計的該任務(wù)的所有的waited-for進程曾經(jīng)發(fā)生的主缺頁的數(shù)目。utime=0該任務(wù)在用戶態(tài)運行的時間,單位為jiffy。stime=6該任務(wù)在核心態(tài)運行的時間,單位為jiffy。cutime=0累計的該任務(wù)的所有的waited-for進程曾經(jīng)在用戶態(tài)運行的時間,單位為jiffy。cstime=0累計的該任務(wù)的所有的waited-for進程曾經(jīng)在核心態(tài)運行的時間,單位為jiffy。priority=15任務(wù)的動態(tài)優(yōu)先級。nice=0任務(wù)的靜態(tài)優(yōu)先級。num_threads=1該任務(wù)所在的線程組里線程的個數(shù)。it_real_value=0由于計時間隔導(dǎo)致的下一個SIGALRM發(fā)送進程的時延,以jiffy為單位。start_time=25058該任務(wù)啟動的時間,單位為jiffy。vsize=3690496該任務(wù)的虛擬地址空間大小。rss=155(page)該任務(wù)當前駐留物理地址空間的大小。vsize=3690496該任務(wù)的虛擬地址空間大小。這些頁可能用于代碼、數(shù)據(jù)和棧。rss=155(page)該任務(wù)當前駐留物理地址空間的大小。rlim=4294967295(bytes)該任務(wù)能駐留物理地址空間的最大值。start_code=32768該任務(wù)在虛擬地址空間的代碼段的起始地址。end_code=645464該任務(wù)在虛擬地址空間的代碼段的結(jié)束地址。start_stack=3204447952該任務(wù)在虛擬地址空間的棧的結(jié)束地址。kstkesp=3204447088esp(32位堆棧指針)的當前值,與在進程的內(nèi)核堆棧頁得到的一致。kstkeip=1091357176指向?qū)⒁獔?zhí)行的指令的指針,EIP(32位指令指針)的當前值.。pendingsig=0待處理信號的位圖,記錄發(fā)送給進程的普通信號。block_sig=0阻塞信號的位圖。sigign=4忽略的信號的位圖。sigcatch=0被俘獲的信號的位圖。wchan=3221834488如果該進程是睡眠狀態(tài),該值給出調(diào)度的調(diào)用點。nswap=0被swapped的頁數(shù),當前沒用。cnswap=0所有子進程被swapped的頁數(shù)的和,當前沒用。exit_signal=17該進程結(jié)束時,向父進程所發(fā)送的信號。task_cpu(task)=0運行在哪個CPU上。task_rt_priority=0實時進程的相對優(yōu)先級別。task_policy=0進程的調(diào)度策略,0:非實時進程;1:FIFO實時進程;2:RR實時進程。通過文件stat的utime、stime、cutime和cstime的數(shù)值,能夠計算出進程的CPU占用率。主要思路:進程CPU占用率二進程占用CPU時間/系統(tǒng)總的時間。進程占用CPU時間,可以從進程的stat文件獲得(utime、stime、cutime、cstime),系統(tǒng)總的時間,需要通過其他方式獲得,例如通過/proc/stat或者通過C函數(shù)gettime獲得。要想獲得進程CPU占用率,需要兩個采樣點:采樣點1:系統(tǒng)時間記為:sys1,進程時間分別為:utime1stime1cutime1cstime1采樣點2:系統(tǒng)時間記為:sys2,進程時間分別為::utime2stime2cutime2cstime2進程CPU占用率二((utime2+stime2-cutime2-cstime2)-(utime1+stime1-cutime1-cstime1))/(sys2-sys1)進程用戶態(tài)占用率=((utime2-cutime2)-(utime1-cutime1))/(sys2-sys1)進程內(nèi)核態(tài)占用率=((stime2-cstime2)-(stime1-cstime1))/(sys2-sys1)3.top雖然能夠通過proc目錄獲得絕大部分進程的運行信息,但對于程序員來講還不是很直觀,好在Linux上有一些現(xiàn)成的工具可以供我們使用。top是最常用來監(jiān)控系統(tǒng)范圍內(nèi)進程活動的工具,它提供運行在系統(tǒng)上的與CPU關(guān)系最密切的進程列表,以及許多有意義的統(tǒng)計值,例如負載平均、進程數(shù)量以及使用的存儲器和頁面空間的數(shù)量。一般使用top命令來查看進程的CPU利用率的問題。在某一刻,系統(tǒng)突然變得很慢,這時候我們的第一反應(yīng)就是運行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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論