Friday, January 09, 2009

Linux Real Time Patch Review - Vanilla vs. RT patch comparison

Linux Real Time Patch Review - Vanilla vs. RT patch comparison

Hardly any standard operating system kernel is hard real time capable. At best, they're soft real time capable, with latencies up to milliseconds.

RTAI and Xenomai provide hard real time, which means that those operating systems (inserted between the hardware and Linux) can assure interrupt response times in the microsecond range. Not so with that standard Linux kernel. The 2.6 kernel - in comparison to the 2.4 kernel - has been much improved in regard to latencies, but still has some bottlenecks. Ingo Molnar provides a patch to compensate for those bottlenecks.
Ingo Molnar RealTime Preempt Patch

This patch improves the responsiveness of the kernel dramatically.
The tests below have been conducted with a tool provided by Andrew Morton. Within the amlat package, there is a tool called "realfeel" which also works on 2.6 kernels, despite the "amlat" tool which, well, doesn't even work on 2.4 kernels on recent systems.
Linux scheduling latency (Andrew Morton)

Here is a small tar.gz which provides just the "realfeel" tool from the AKPM package and the famous "hackbench" (tweaked to acually compile):
captest.tar.gz (2k)

Compile with "make".
# ./realfeel histogramfilename.hist
1400.038 MHz
secondsPerTick=0.000000
ticksPerSecond=1400037759.748198
2048 Hz
0.451 msec
0.361 msec
-0.004 msec
-0.029 msec
-0.146 msec
-0.205 msec

For the hackbench stress test call it like this:
# ./hackbench 100

Adjust the parameter - WARNING: if the parameter is too high, your system might freeze!

If you get something like this with "realfeel":
ioctl(RTC_IRQP_SET) failed: Invalid argument

do this:
# rmmod genrtc
# modprobe rtc

This removes the module "genrtc" and loads the "rtc" (real time clock driver).

In any case, you should unload the module "genrtc" and load the module "rtc".


THE RESULTS

The result with a vanilla 2.6.15 kernel:
(first column is in milliseconds; second column is the number of RTC (real time clock) interrupts received)

0.0 54410
0.1 32
0.2 8
0.3 5
0.4 3
0.5 1
0.6 1
0.8 1
1.0 1
1.4 1
1.5 1
2.0 1
3.7 1
As you can see, the max. latency of the RTC interrupt was about 3.7 milliseconds. (UPDATE: with "hackbench" I've even got more than ONE SECOND!!!)

Results with the rt16 RT patch:
0.0 308821
0.1 832
0.2 104
As you can see, the max. latency was just about 200 microseconds. (UPDATE: with "hackbench" I got a max. of about 400us)

If there is no or almost no load on your system, take into account that SMI (System Maintenance Interrupts on e.g. Intel 82845 845 (Brookdale) motherboards) can and will produce latencies of > 200us. Also see: Xenomai: High latencies with SMI not disabled

CONCLUSIONS:

If you need to have a low latency system for audio, music or video processing, the Molnar low latency patch might be the right thing for you.
But still, if you need hard real time performance, where latencies must not be higher than a few tens of microseconds, you'll better off with RTAI or XENOMAI.

Appendix:

Here are a few stress testing routines proven to be good for determining the worst case latencies.


# dd if=/dev/zero of=bigfile bs=1024000 count=1024
# ping -l 100000 -q -s 10 -f localhost
# ping -f -s 1400 & dd if=/dev/urandom of=/dev/null & ls -lR /
# - a=0; while "true"; do cat /proc/interrupts; a=`expr $a + 1`; echo $a; done
# while :; do dd if=/dev/zero of=/tmp/foo bs=1M count=500; sync; rm /tmp/foo; done


If you want to combine some of those:
#!/bin/sh
dd if=/dev/zero of=bigfile1 bs=1024000 count=1000 &
ping -l 100000 -q -s 10 -f localhost &
du / &
-or one from Paolo Mantegazza (RTAI.org)
a=0; while "true"; do dd if=/dev/hda1 of=/dev/null bs=1M count=1000;
a=`expr $a + 1`; date; echo $a; done
(this is just one line!)

If you use "hackbench" you can try this:
#!/bin/sh
while true; do dd if=/dev/zero of=bigfile bs=1024000 count=1024; done &
while true; do killall hackbench; sleep 5; done &
while true; do ./hackbench 20; done &
ping -l 100000 -q -s 10 -f localhost &
du / &


Most hardcore test
Philippe Gerum (Ingo Molnar):
http://lkml.org/lkml/2005/6/22/347
while true; do dd if=/dev/zero of=bigfile bs=1024000 count=1024; done &
while true; do killall hackbench; sleep 5; done &
while true; do ./hackbench 20; done &
( cd ltp-full-20040707; while true; do ./runalltests.sh -x 40; done; ) &
ping -l 100000 -q -s 10 -f localhost &
du / &


And last but not least, here is a process listing of the processes on a RT preempt patch patched kernel and a vanilla kernel just after booting on a debian sarge system ...
... to illustrate the differences between the rt-patch and vanilla kernel system:

2.6.15-rt16
# ps -A
PID TTY TIME CMD
1 ? 00:00:00 init
2 ? 00:00:00 softirq-high/0
3 ? 00:00:00 softirq-timer/0
4 ? 00:00:00 softirq-net-tx/
5 ? 00:00:00 softirq-net-rx/
6 ? 00:00:00 softirq-scsi/0
7 ? 00:00:00 softirq-tasklet
8 ? 00:00:00 desched/0
9 ? 00:00:03 events/0
10 ? 00:00:00 khelper
11 ? 00:00:00 kthread
12 ? 00:00:00 kblockd/0
13 ? 00:00:00 pdflush
14 ? 00:00:00 pdflush
16 ? 00:00:00 aio/0
15 ? 00:00:00 kswapd0
17 ? 00:00:00 kseriod
18 ? 00:00:00 IRQ 12
19 ? 00:00:00 IRQ 14
20 ? 00:00:00 kjournald
21 ? 00:00:00 IRQ 1
378 ? 00:00:00 IRQ 19
389 ? 00:00:00 IRQ 4
392 ? 00:00:00 IRQ 3
544 ? 00:00:00 syslogd
547 ? 00:00:00 klogd
579 ? 00:00:00 exim4
584 ? 00:00:00 inetd
592 ? 00:00:00 sshd
597 ? 00:00:00 atd
600 ? 00:00:00 cron
606 tty1 00:00:00 getty
607 tty2 00:00:00 getty
608 tty3 00:00:00 getty
609 tty4 00:00:00 getty
610 tty5 00:00:00 getty
611 tty6 00:00:00 getty
612 ? 00:00:00 sshd
614 pts/0 00:00:00 bash
618 pts/0 00:00:00 ps


2.6.15 vanilla
# ps -A
PID TTY TIME CMD
1 ? 00:00:00 init
2 ? 00:00:00 ksoftirqd/0
3 ? 00:00:04 events/0
4 ? 00:00:00 khelper
5 ? 00:00:00 kthread
6 ? 00:00:00 kblockd/0
7 ? 00:00:00 pdflush
8 ? 00:00:00 pdflush
10 ? 00:00:00 aio/0
9 ? 00:00:00 kswapd0
11 ? 00:00:00 kseriod
12 ? 00:00:00 kjournald
532 ? 00:00:00 syslogd
535 ? 00:00:00 klogd
567 ? 00:00:00 exim4
572 ? 00:00:00 inetd
580 ? 00:00:00 sshd
585 ? 00:00:00 atd
588 ? 00:00:00 cron
594 tty1 00:00:00 getty
595 tty2 00:00:00 getty
596 tty3 00:00:00 getty
597 tty4 00:00:00 getty
598 tty5 00:00:00 getty
599 tty6 00:00:00 getty
602 ? 00:00:00 sshd
604 pts/0 00:00:00 bash
609 pts/0 00:00:00 ps


Last-Modified: Thu, 09 Feb 2006 19:14:41 GMT

Linus Torvalds on git

轉自 http://people.debian.org.tw/~chihchun/2008/12/19/linus-torvalds-on-git/

Linus Torvalds on git

這段錄影已經躺在硬碟中很久,這兩日才利用通勤的時間消化了一番。這是 Linus Torvalds 在 Google 所進行的一段演講,身為一個性格強硬的硬底子駭客,他時常發出驚人的評論,有些有趣的言論甚至被整理成格言集,像是 The 10 Best Linus Torvalds QuotesLinus Torvalds Quotes

在這段演講中,身為 Git 計畫的發起人,Linus 說明了為什麼需要設計這樣的一套工具,基本的設計哲學與其他類似的工具的比較。

在技術的觀點上,他直接且尖銳的同時批判了 CVSSubversion, 演講一開始 Linus 就給了 CVS 贊頌 - 負面的贊頌,雖然 Linus 從來不用 CVS 管理 Kernel source tree,但是還是在商業公司有過一段不短時間的使用經驗,而且 Linus 打從心裡強烈的厭惡這個工具。同時他也批判 Subversion 這個計畫是他看過最沒有意義的,因為 Subversion 從各方面試著去改善 CVS 的一些技術上的缺點,卻無法根本的解決一些基本使用限制。具體來說 Subversion 改善的創建分支的成本 (意思是相對 CVS 所利用的硬碟、計算資源比較少),但是卻沒辦法解決合併分支的需求,任何使用過 Subversion 合併分支的人都知道那是如何痛苦的折磨。而許多高度開發中的專案,都時常需要為不同的新功能開分支、合併,Subversion 解決了開分支的成本,卻沒有考慮到合併的人工成本。如此讓 Subversion 變成一個沒有未來的軟體計畫。

因此,基於過去在 BitKeeper 上得使用經驗,Linus 設計了新的 Git, 並將效能視為主要的需求。當然分散式的設計也是最重要的概念之一,Linus 提到幾個觀點,討論如下。

第一個是分散式的概念,解決了政治紛爭。所謂政治紛爭指 commit/checkout/create branch 的權利,傳統中央集權式開發模式,你若想要創建一個新的分支,或者進行一些實驗性的開發,通常必須獲得主開發者授予 提交者 (commitor) 的權限,意指你是受到信任的一份子,有權限可以自行修改軟體程式碼,被授權進行一些嘗試。(唐鳳的人人皆為提交者開發模式為例外)

這種模式,很自然的排擠了在所謂信任圈 (core developers) 外的人。對,你依然可以在中央控管的機制下嘗試,你依然可以透過 patch 提交你想要做的更動。但是工具本身的限制,直接的限縮了自由發展的可能性。舉例來說,你相對不容易組成一個工作小組 (Task Group),因為分享程式碼的變動並不容易,你可能必須建立另外一個獨立的程式碼管理系統給這個工作小組使用。而不像分散式的管理工具如 Git/Mercurial 開發者間可以透過數種管道接取/同步雙方的進度。

或者中央集權工具的另外一個根本上的問題是 - 它阻礙了開發者的實驗精神。

簡單講,就是開發者礙於每次提交 (commit),都可能因為程式碼的不相容性,造成其他人必須停下來彙整變更,影響到其他人的工作進度的後果,因此每次提交/儲存都會有所疑慮。因此很 容易就演變成開發者埋頭苦幹,直到最後一刻才一口氣提交上線,結果造成的不相容與衝擊更大,反而造成最後的工作成果難以融合。

在分散式開發工具的輔助下,你可以隨意的開立新分支,自行修改、測試、同步、實驗,這些在本地的提交除了完全不會影響到其他人外,同時你也可以輕易的匯出成特定格式 (patches),讓他人更容易的整合。這大幅改善了協同開發模式的磨合問題。

Git 是以分散式開發模式為根本,自然可以融合於相對單純的中央集權 (cvs/svn) 的權利結構。Linus 在演講中也提出了一個我認為很值得討論的觀點,即是應用於 Linux kernel 開發的多層次分散權利結構。Linus 提了一個重點,基本上開發社群中有一種信任關係 (Web of trust),像 Linux Kernel 這樣的龐大計畫,每個版本參與的開發者大約千人。 實際上主要開發者如 Linus 不可能認識這麼多人,很自然的,他只能信任最熟識的幾個人,他指知道幾個人的智商與能力都是足以信賴的,於是他只需要仰賴這些人的成果。而其他人在於自己 的信賴圈內,找到其他可以仰賴的人,於是利用這樣的信賴機制來擴展成網狀的開發社群。

在實務上,社群中也會演化出幾個角色,像是司令官 (dictator)、副官 (lieutenants)、開發者。幾位副官只要專注在他們熟悉的領域,整合開發者的成果,並提交給司令官做最後的整合決策。這麼一來,各種不同的專業 領域都可以交給最熟悉的開發人員管理,而開發不會被限制、停頓在某個角色身上,相對而言是一個比較具有效率的開發社群結構。且分散式開發,也讓不同的開發 者得以有權利與自由自行發展,不受限於官僚機制的限制。

上述為演講內容的一些提要。

Web of trust 是我相當認同的一個概念,任何所謂社群中,都會自然的因為信賴關係存在更小的團體,有人誤解這是一種分裂,但是我認為這是一種演化,不該消弭小圈圈的存 在,反而應該鼓勵小團體的成立,自行交流、合作,才有機會產生或再演化出更大、更有力量、更健康的社群。(應該有什麼什麼政治學、社會學的理論在講這件事 情吧 ?)

另外也推薦一個網站,是即將被國家綁架去服役的 kanru 翻譯的「為什麼 Git 比 X 棒」(Why Git is Better than X)。這個網站簡約的說明了 git 與其他程式碼控制軟體的比較,可以讓你比較容易了解各種軟體間的差異細節。

另外 為什麼 Git 比 X 棒 這個網站中介紹的 github 服務,我個人相當欣賞,它基本上提供了 Git 的 hosting 服務,但同時也包含了更多 Web 2.0 的概念,是所謂 “Social coding hosting”,基本的功能除了提供 Git 外,像一般的社交網站一樣,你可以追蹤別人的狀態,別的網站你追蹤的是朋友發出來的訊息,這裡你追蹤的是朋友寫出來的程式碼,而且你可以直接在線上「複 製」(branching) 別人的工作成果,也提供了相當美觀的介面,讓你看到程式碼更動的網路關聯圖,相當有趣。剛開始使用 Git 時,可以試試這個網站。

若想學習 Git, 請參考 Learning git 一文的連結。

一小時內搞懂 Git

此文轉自:http://people.debian.org.tw/~chihchun/2009/01/05/understand-git-in-one-hour/


我已經在 Learning git 中提到 Scott ChaconGitCasts 網站,網站中包含相當多的操作示範影片。但是其中有一則在原本的文章沒提到的是 Scoot 在 RailsConf 2008 對 Git 做了一個相當精彩的演講,若你原本有使用其他版本控制系統的經驗,花一個小時聽完 Scott 的介紹應該是最有效率的方法。

這場演講中,Scott 廣泛的介紹 Git 的設計理念與使用方法,解釋了 Git 所使用的 DAG Storage 與 SVN 所用的 Delta Stroage 的內涵差異,深入說明 Git 所使用的 Object Model,並解釋那些特別容易令人困惑的 index, remote/local branches 的概念,甚至幫你說明了最重要的幾個 Git 指令的使用方式。專心聽完,真的可以馬上學會喔。


(請按播放視窗的圖示將影像全螢幕較適合閱讀。)

簡報可於 SlideShare 取得。聽完還意猶未盡的話,請深入閱讀 Git Community Book 吧。

對了,Perl 社群最近也開始使用 Git 來作為版本控制系統了。

January 5th, 2009 at 8:00 am | Comments & Trackbacks (1) | Permalink

Thursday, January 08, 2009

詩篇 第 一四三 章

143:0 大衛的詩。
143:1 耶和華阿,求你聽我的禱告,側耳聽我的懇求,憑你的信實和公義應允我;
143:2 求你不要傳喚你的僕人去受審,因為在你面前,凡活著的人沒有一個是義的。
143:3 原來仇敵逼迫我,將我的命壓倒在地,使我住在幽暗之處,像死了許久的人一樣。
143:4 所以,我的靈在我裏面發昏;我的心在我裏面驚懼。
143:5 我追想古時之日,默念你的一切作為,默想你手的工作。
143:6 我向你伸開雙手禱告,我的魂渴想你,如乾旱之地盼雨一樣。〔細拉〕
143:7 耶和華阿,求你速速應允我;我的靈耗盡。不要向我掩面,免得我像那些下坑的人一樣。
143:8 求你使我清晨得聽你的慈愛,因我信靠你。求你使我知道當行的道路,因我的魂仰望你。
143:9 耶和華阿,求你救我脫離我的仇敵;我逃往你那裏避難。
143:10 求你指教我遵行你的旨意,因你是我的神;願你至善的靈引我到平坦之地。
143:11 耶和華阿,求你為你的名將我救活;憑你的公義,將我從患難中領出來;
143:12 憑你的慈愛剪除我的仇敵,滅絕一切欺壓我的人,因我是你的僕人。

Wednesday, January 07, 2009

轉帳非IE不可?WebATM不必再受限!

http://tw.news.yahoo.com/article/url/d/a/090107/52/1ckos.html

你曾碰過使用WebATM服務,卻因為網路瀏覽器並非微軟IE而失敗嗎?現在這樣的情況將可獲得改善。由於國內民眾使用其他網路瀏覽器的比例越來越高,玉山銀行首創先例,將旗下WebATM擴大支援Firefox、GoogleChrome、Opera等瀏覽器,讓民眾從事網路金融交易更為方便。

...
這次擴大WebATM服務範圍,玉山銀行將提供支援Firefox、GoogleChrome、Opera等瀏覽器的軟體,民眾只要上網下載安裝驅動程式後,就能省略掉切換瀏覽器,才能使用WebATM的麻煩。

The Linux Kernel Module Programming Guide

The Linux Kernel Module Programming Guide

http://tldp.org/LDP/lkmpg/2.6/html/