天天看點

嵌入式Linux性能優化

什麼是嵌入式系統?

嵌入式系統(Embedded System),是一種嵌入機械或電氣系統内部、具有專一功能和實時計算性能的計算機系統。[1][2]嵌入式系統常被用于高效控制許多常見裝置,被嵌入的系統通常是包含數字硬體和機械部件的完整裝置,例如汽車的防鎖死刹車系統。相反,通用計算機如個人電腦則設計靈活,可以智能處理各式各樣的運算情況,以滿足廣大終端使用者不同的需要。 

現代嵌入式系統通常是基于微控制器(如含內建記憶體和/或外設接口的中央處理單元)的,但在較複雜的系統中普通微處理器(使用外部存儲晶片和外設接口電路)也很常見。通用型處理器、專門進行某類計算的處理器、為手持應用訂制設計的處理器等,都可能應用到嵌入式系統。常見的專用處理器有數字信号處理器。 

嵌入式系統的關鍵特性是處理特定的任務,是以工程師能對其進行優化,以降低産品的體積和成本,提升可靠性和性能。 

嵌入式系統的實體形态包括便攜裝置如計步器、電子手表和MP3播放器,大型固定裝置如交通燈、工廠控制器,大型複雜系統如混合動力汽車、磁共振成像裝置、航空電子裝置等。它們的複雜度低至單片機,高至大型底盤或外殼内安裝有多個部件、外設和網絡。

嵌入式Linux ?

嵌入式Linux 是嵌入式系統中比較主流的一種,其以Linux 為嵌入式裝置的作業系統,并廣泛用于消費電子,行動電話,航天航空電子中。其Wiki上如是描述: 

嵌入式Linux(英語:Embedded Linux)是一類嵌入式作業系統的概稱,這類型的作業系統皆以Linux核心為基礎,被設計來使用于嵌入式裝置。這類作業系統被廣泛地使用在行動電話、個人數位助理(PDA)、媒體播放器以及衆多消費性電子裝置中。 

比起發行版的Linux 系統,嵌入式Linux 以Linux 為藍本,進行了大規模的裁剪,隻保留目标平台需要用到的東西。其保留了Linux 的開放性,并且也具體嵌入式裝置的需求。 

但是由于Linux 的龐大以及其為桌面伺服器系統的本質,是以在一些性能方面确實是無法達到預期目标,為此還有專門的社群分支基于Linux 開發了支援硬實時的RT分支版本。由于Linux 的相容性非常的好,是以嵌入式Linux的賤人顯然也是完美的。嵌入式裝置提供商可以按照自己的需求随意裁剪Linux 源碼,并添加自己的功能。

啥?嵌入式裝置的使用者體驗?

不管要做出什麼樣形态的産品,使用者體驗總是會被大家推崇到首位,你系統做的在牛逼,架構選的多麼的新穎,算法多麼的前無古人。假如你的産品用起來體驗很爛,照樣沒有客戶埋單。 

使用者體驗又分為了好多類型,比如外觀、材質、手感這屬于外部的一個感官。俗稱顔值。比如玩王者農藥是否卡?費電嗎?防水嗎?能看VR嗎?美顔效果如何?這一類體驗屬于互動體驗。互動體驗是内在。再比如還有一類人比較關心的就是是否有一些特色功能,比如紅外、虹膜、指紋。 這些功能其實對于大多數的消費者而言都是錦上添花。但是對于一些極客而言,确實實打實的可用功能。歸到最後其實就是,始于顔值,陷于才華,忠于人品。 

那麼你如果滿足了上述的要求,作為消費産品,又會回歸一個比較俗的話題,那就是價格。 恩恩,扯遠了。

互動體驗的最終目的就是迅速,人機互動的響應很迅速。不過我任務對于大多數泛嵌入式終端産品來講,大多其實是無人值守的互動狀态。所謂無人值守,即是設定好了預期指令,可以在不需要人為互動的情況下,做出響應。比如交換機,路由器,中控器等。這些裝置大多是提供協作功能,其本身不需要太多的人機互動,更多的是用來做人機->機或者機->人機 互動的通路。 

這些裝置的要求,要比單純的人機互動裝置的響應要求更高。 大家可以接受電腦或者手機重新開機一次,或者當機一次。 但是無法忍受斷電,斷網。

還要優化什麼?

嵌入式系統裝置的優化目的大抵可以從下面幾個點去概括

  • 增強系統的穩定性
  • 加速系統和程式
  • 減小系統和程式的體積(裁剪)
  • 降低系統的功耗
  • 提供系統的響應能力
  • 成本群組合的優化效果
  • 終極優化的政策

上述總結出自魅族的核心團隊大神吳老師總結的,我覺得概括的很全面,也很到位。

增強系統的穩定性

随着業務的增量變化,沒有百分之一百的穩定性,隻有百分之99.9的穩定性,我們的目标其實也就是百分之99.9的穩定性,這樣的系統才是最健壯的。 

根據吳老師的描述,可以通過以下手段來進行穩定性的測試取樣,然後做評比。 

- 盡量模拟各種潛在的應用場景,需要構造應用場景測試例。 

- 使用各種壓力測試環境将系統上資源利用到極緻,采用Linux 現有的測試工具,可做成一套完整的測試流程。 

- 采用标準的測試套件将整個系統的相容性(是否符合标準)、完整性(功能是否完善)、健壯性(是否容易Crash)。

Linux 标準測試套件

  • Linux Test Project – 可靠性,穩定性。覆寫測試(runalltest.sh),壓力測試(ltpstres.sh)。
  • Open Posix Test Suite – 一緻性、功能、壓力(make tests-pretty)。
  • LSB Platform Specification – Linux App Checker。
  • ELC Platform Specification – 嵌入式Linux 标準測試架構。
  • Phoronix Test Suite – Hardware Platform Test Suite。

Linux 硬體測試工具以及功能測試相關工具

  • 處理器:cpuburn(FPU) + gkrellm + lm_sensor 壓力測試
  • 圖形處理器:Neocore (3D), NenaMark(OpenGPL ES 2.0)
  • 記憶體:memtest86+, memtester,CPU廠商自帶的bootloaderi/xloader
  • 序列槽:minicom, cat /dev/ttyS0, cat /dev/ttyUSB0
  • 閃存(NOR/NAND):mtd-utils, flash_eraseall, flashcp
  • 聲霸卡:alsa-utils, amixer, alsamixer, aplay /dev/urandom;mplayer -ao alsa|oss
  • 攝像頭:v4l2, mplayer tv://dev/video0
  • USB:usbutils, lsusb; usbstress,可挂載儲存設備測試
  • 顯示卡/LCD: mplayer, directfb, directfb-examples
  • I2C: i2c-tools, i2cdetect -l, i2cget, i2cset, i2cdump
  • RTC:util-linux, date + hwclock -r/-w
  • 傳感器:lm-sensors, sensors, gkrellm
  • 鍵盤/滑鼠:showkey; xdotool(simulate)
  • 功能鍵:/sys/class/input/; HAL+Dbus, hotkey.py
  • 觸摸屏:Tslib
  • 觸摸闆:gpointing-device-settings, tpconfig
  • 磁盤:hdparm; hddtemp; badblocks -s -v /dev/sda1;smartctl -a /dev/ad0,blkid,sg-utils
  • 以太網、無線、藍牙:/sys/net/, ethtool, dhclient, ifconfig, ping -IethX -s psize -f, netperf -A -l, network-manager, wireshark,netsniff-ng
  • FC,ISCSI: targetcli,lio,iscsitarget

嵌入式Linux 性能優化方向

那麼在嵌入式系統中,為了提高裝置的響應速度以及穩定性我們應該要優化什麼?我覺得可以從下面幾個方向入手。

  • 優化系統啟動時間
  • 根據特需優化CPU資源的配置設定
  • 根據特需優化記憶體資源的配置設定
  • 根據特需優化控制IO裝置的資源
  • 優化并提供系統實時性

上述優化前提是你自己的程式已經在一個比較良好的算法或者排程下已經無法邁出往前一步了,當然我這兒隻是類比。具體還要根據生産環境來決定。因為很多人根據無需去優化這些,把自己寫的業務代碼優化好才是王道。

嵌入式 Linux 業務軟體品質控制

  • 設計 – 遵循标準開發規範,參考POSIX,LSB等統一标準。
  • 流程 – 遵循标準開發流程。
  • 編碼 – 編碼風格參考核心代碼風格,風格一緻性檢查。 scripts/checkpatch.pl。
  • 靜态檢查 – Sparse,coccinelle,smatch。
  • 編譯時檢查 – -Wall -Werror -std=c89-pedantic-errors。
  • 運作時診斷和調試 – Debugging/Tracing API

繼續閱讀