星期日, 11月 04, 2012

不能用valgrind,用mtrace總可以了吧!

在嵌入式系統上,因為valgrind並不支援armv5﹙但,支援armv7﹚,所以,在抓memory leak時,有時會porting到x86上用Valgrind掃一次,能找多少修多少。但,有時還是會發生慘案,在x86上掃不出,可是,放到板子上跑時,卻會memory leak。

儘管[1]舉出數個可應用在embedded systems上的detectors,但,找不到因不慎操作shared library產生的memory leak。比如,不斷呼叫GLib GListappend/prepend卻忘了釋放,雖然GLib支援透過環境變數改變GSlice行為,變為直接呼叫malloc。可是,像mtrace這類的工具,只會回報shared library裡面有呼叫malloc,但,卻無法透過addr2line找出memory leak的地方。

所以,產生了一個想法,自己寫一個簡單的shared library,透過掛載malloc hooks,在每一次malloc被呼叫時,使用backtrace找出當時的callstack,程式結束時,把結果寫到檔案。在搜尋撰寫library相關知識時發現,其實已經有人寫好了libmtrace,也可以卻實找出當下的callstack,算是符合當初預期的目標。太好了,省事多了XD

[1] Memory Leak Detection in Embedded Systems

星期日, 10月 14, 2012

Markdown語法說明與線上編輯

最近看了一下Markdown語法[1],其實和wiki的語法很像,都可以用純文字的方式撰寫再轉成HTML。有好心人提供了線上編輯工具[2],同時提供了轉換後的source code和preview兩種功能。

[1] Markdown語法說明, http://markdown.tw/
[2] Markdown Web Dingus, http://daringfireball.net/projects/markdown/dingus

星期日, 9月 23, 2012

socket zero-copy

一直好奇socket能不能在user-mode和kernel-mode之間達成zero-copy[1,2],看起來是可以的。

一開始是看到Linux PACKET_MMAP[3],但,PACKET_MMAP是用來做packet capture的,如果拿來做實作像RTSP的串流協定,得先花很多工夫在實作TCP這類底層的協定,光想就覺得很累。

再試著搜尋一下,也許可以透過splice[4]達成,只是較不直覺。

方法是先建一個檔案﹙也許用fallocate﹚,然後開啟檔案並用mmap對映至行程空間,接下來就是用splice把資料搬至檔案,然後用透過mmap取得的指標操作資料。簡單的表示就是︰
socket fd -> write end pipe -> read end pipe -> file fd


[1] Linux 中的零拷贝技术,第 1 部分, http://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy1/index.html

[2] Linux 中的零拷贝技术,第 2 部分, http://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy2/index.html

[3] Raw socket, Packet socket and Zero copy networking in Linux, http://yusufonlinux.blogspot.tw/2010/11/data-link-access-and-zero-copy.html

[4] splice(2) - Linux man page, http://linux.die.net/man/2/splice

09/30更新

文章[5]講的更貼近實務,而文章[6]說明如何調整pipe大小

[5] splice(), http://ogris.de/howtos/splice.html

[6] 深入理解PIPE, http://blog.ddup.us/?p=285

星期二, 7月 31, 2012

練習Metaprogramming

之前讀完Metaprogramming Ruby就一直想找個機會練習metaprogramming,現在終於有機會了。

atop是一個Linux上很好用的效能監視工具,在LWN上有一篇介紹的文章One-stop performance analysis using atop

可是,分析atop的輸出檔就很痛苦了,system-level的部份畫出圖表來就一目瞭然,但,想要細究圖表中的變化,就要靠分析process-level的資料,但,process-level的資料實在太多了,一下子就被滿坑滿谷的資料淹過去。

在人工分析幾次後,我就想說﹙用Python﹚寫個程式來分析自動產生圖表吧,寫了幾行發現重複性的code很多,於是就藉機用metaprogramming的方式來處理,果真是威力強大啊!幾行code就把system-level處理的差不多了,剩下process-level。

事實上,我在使用metaprogramming之前,有用PyGTK硬寫出一個產生圖表的程式,但,無奈,產生圖表的函式庫功能不符需求,轉而使用pyplot。想說都重寫產生圖表的部份了,乾脆來重寫一次吧!才誕生metaprogramming的版本。

專案atop-plot放在github上,請各位多多指教。

星期日, 7月 15, 2012

一口氣補上The Linux Programming Interface第六,七章的投影片。
TLPI - 6 Process
View more presentations from Shu-Yu Fu
Tlpi 7-memory-allocation
View more presentations from Shu-Yu Fu

星期日, 6月 03, 2012

本週讀完了程式設計師的自我修養第10章,投影片在這