發表文章

目前顯示的是 10月, 2013的文章

如何將Linux打造成OpenFlow Switch:Openvswitch

圖片
因為工作上被指派去做SDN,自然需要SDN的網路設備才可以。問題是SDN Switch賣的超級貴的,一台差不多要30萬台幣。這跟當初推廣SDN的人說法完全不一樣!他們當初說SDN網路設備會變得比較便宜,因為網路設備上不需要在堆疊這麼多的網路協定,因此硬體可以Cost Down,也可以省下軟體的錢。問題是,如果單單賣純種SDN Switch根本是不可能的事情啊,因為缺少可以在上面跑的軟體和控制器,所以只好保留傳統設備上的功能,再多加OpenFlow的支援,並提供給使用者選擇的開關。這樣當然只會更貴不會便宜啊!! 在沒錢、沒人、沒資源的情況下,要怎麼辦呢?用模擬軟體?可惜要Demo的時候行不通。那就只好自己來打造一台SDN Switch了。雖然沒有晶片的支援,但只要不牽扯到效能的話,應該沒太多問題。下面是我和同事想過的一些解決方案: 自己打造OpenFlow的Agent,反正OpenFlow的網路協定並不複雜,然後透過Linux Kernel的netfilter來模擬晶片的行為。因為是用軟體模擬,所以效率會比較差,但反過來說,因為是軟體,所以我可以滿足所有OpenFlow的要求,不會有做不到的事情。不過這個提案被一個PM的同事封殺了,理由是這不能賣錢 ...  有一個同事找到一個有趣的專案 FlowForwarding 。這個專案提供了Open Source的OpenFlow Agent: LINC。LINC是用Erlang所開發的軟體。雖然我根本不會Erlang,但程式語言不是我考慮的重點,我好奇的是它要怎麼模擬晶片來處理封包。從網頁上看到,LINC在使用上需要libpcap的函式庫,初步猜測,LINC應該是把所有的封包透過libpcap攔截到user space以後進行修改。這樣做的效率應該會比我的解決方案更差。 OpenVswitch 。這是大部份產品的解決方案。我聽過一堆公司宣稱自己有了SDN Switch,而內容只不過是把Openvswitch移植到自己原有的產品上罷了。一樣,我好奇它要怎麼模擬晶片來處理封包,看了編譯過程,它會產生openvswitch.ko,在加上它利用bridge的特性,所以應該是在linux bridge那邊進行hook後修改。 考量到移植的方便性,所以後來我個人選擇openvswitch作為SDN Switch的解決方

SDN的迷思

軟體定義網路 Software Defined Networking ,簡稱SDN,是一個最近當紅的網路技術與研究題目。在工作上被分派到這個任務的我,除了要撰寫一大堆計劃書以外,還必須面對一堆長官的「刁難」和「冷嘲熱諷」。美其名叫作計劃審查,但我覺得和他們報告根本就是對牛彈琴、他們根本就是鴨子聽雷,然後在發表一堆可笑的「真知灼見」,如果不是因為他的位置比較高,真想把他們捻下來訓一頓,台灣的研發會走到今天這個地步,這群人的思維要附上很大的一部份責任。下面紀錄一些這些人的經典語錄: 技術方面不是重點啦,重點是能帶來多少的市場效益 ...(這位長官,你知道這次的報告是創新前瞻的計劃嗎?能帶來立即明顯效益的還叫作創新前瞻嗎?) 恩,我剛剛沒在聽(喔,原來你根本沒聽嘛)... 你應該想想其他網路廠商像是cisco他們的看法,還有能對台灣產業界帶來多少的幫助(...第1,我剛剛就提過了;第2,Cisco根本一開始就反對這樣的模式,後來不得已而轉型,今天你在叫我回去參考Cisco?第3,這個計劃才多少錢而已,要我揹負台灣產業的成敗?) 你不可以因為這個技術新的就來提計劃(所以要提舊的?)要做好效益評估...(我是RD還是策略規劃師?你長官的位置下來我做好了) 聽起來不錯,我想,先給你兩個人夠不夠?(很夠了,我想拿來應付會內的文件產生應該足夠了...) 其實還有更多,只能說無能的長官比競爭對手更可怕 ... 離題了,其實今天會寫這篇文章主要是想要回答一個問題:「 有什麼事情是傳統網路架構做不到,而透過SDN可以解決的? 」這種問題你去問一堆推動SDN的人,他們也許可以講的很頭頭是道,事實上,我也可以,畢竟對外也講過、報告過很多次了。但因為站在技術開發者的角度,有些話是當時講不出來的,這裡紀錄的是我內心真正的想法。 在回答這個問題以前,先來看看到底什麼是SDN?SDN說穿了就是下面幾個特性: 切割控制層和資料層 :讓網路設備負責執行資料的處理,而將網路控制權從網路設備中抽離。這樣最大的好處是可以簡化網路設備的成本並提升效率。 高效的網路處理晶片 。這個晶片可以處理所有L2-L4的封包。 這裡指的是晶片有能力處理封包,但是要怎麼處理要透過集中控制器來決定。 集中式控制 :所有網路設備控制權被集中到一台控制器。所以傳統網路在設計上的分散式架構被打破了,也因

列王記:約沙法

亞哈的份量比預期的多上很多,看來以利亞和耶洗別幫了不少忙。接下來把目光重新放到南國猶大。下一個要登場的君王是約沙法,約沙法是亞撒的兒子,也是個敬畏耶和華的君王。關於約沙法,列王記裏面的記載不多,大部份都在歷代志下,所以經文參考會以歷代志為主。 姓名: 約沙法 國家:南國猶大 對應的南國君王:亞哈、亞哈謝、約蘭 聖經記載: 1. 約沙法做王(代下17、王上22:41-47) 2. 拉末之戰(代下18-19:3、王上22:1-39) 3. 不是為人,乃是為耶和華(代下19:4-11) 4. 勝敗不在乎你們,乃在乎 神(代下20:1-30) 5. 約沙法和亞哈謝(代下20:31-37、王上22:48-50) 6. 約沙法和約蘭(王下3) 1. 約沙法做王(代下17、王上22:41-47) 不管是列王記還是歷代志,對壞王的描述都常都一樣,就是「效法他列祖、不遵行上帝的道」,而對好王的描述也都類似,只是把上面那句話改成「遵行上帝的道」。耶和華與約沙法同在,因為約沙法只尋求他父親的神,就是那創造天地的萬軍之耶和華。在歷代志那邊特別提到一句話:「他高興遵行耶和華的道」,約沙法是發自內心遵行上帝的命令。很多基督徒,包含我自己,有時候或多或少會覺得遵行上帝的命令好苦,會有內心的掙扎。這種天人交戰有勝有敗,求神憐憫。但約沙法是「高興」遵行上帝的道,沒有勉強、出於甘心樂意,這樣的評價真是何等的難得。怎樣才能甘心的遵行上帝的話?詩40:8那邊提到「 我的神啊,我樂意照你的旨意行;你的律法在我心裡。 」這是彌賽亞詩篇,但也教我們知道,要甘心樂意遵行上帝的話,必須把上帝的話刻在自己的心上,以上帝的心意為自己的心意,這樣按照上帝的心意行事就不會跟自己的老我產生衝突,而得享喜樂。願上帝保守我的心,使我能夠出於樂意的遵行上帝的話。 和其他猶大的好王不太一樣的地方是,約沙法他深知「樂意遵行上帝的話」的秘訣,所以他派了眾多的大臣、利未人到各城各鄉,用上帝的律法書來教訓百姓,好叫百姓也可以得知上帝的話語。約沙法很看重神學教育,那我呢?我常常在想,有小孩以後,我要好好的教她學習上帝的話語。現在有了小孩,我才在想,養小孩好花時間唷,怎麼自己的時間都沒了呢?有時候看著她,心中只希望她趕快睡覺吧,不要哭不要鬧。我在想,等她唸書以後,我還會記得要好好地教她讀聖經嗎?還是把她放給學

Linux 的好用指令:time

Well ... 寫程式常常要寫一個功能,那就是程式執行了多久。過去的作法往往是寫在程式內部,雖然不困難但是很煩。今天聽到一隻 Linux 的指令可以輕鬆達成我要的功能:time。不是新東西,只能說是自己孤陋寡聞。 用法如下: $ time ./multicoretest parallel 4 Creating thread 0 Creating thread 1 Creating thread 2 Thread 1 started Thread 0 started Task 0 started Thread 2 started Task 2 started Creating thread 3 Task 1 started Main completed Thread 3 started Task 3 started Task 0 completed with result 2.996422e+06 Thread 0 done Task 3 completed with result 2.996422e+06 Thread 3 done Task 1 completed with result 2.996422e+06 Thread 1 done Task 2 completed with result 2.996422e+06 Thread 2 done real    0m1.806s user   0m6.444s sys    0m0.000s real time 表示後面所接的指令或程式從開始執行到結束時間。 user time 表示程式在 user mode 所佔用的 CPU 時間總和。 system time 表示程式在 kernel mode 所佔用的 CPU 時間總和。 ㄟ...real 比 user 還要大ㄟ?這是因為這個範例有開 thread,而我的電腦是4個核心的緣故。

Pthread Example

說真的,我不喜歡寫 Multi-thread 的程式,因為討厭處理 thread 之間的同步問題(我這個人就是怕麻煩!)但怕以後可能會用到,所以還是留下一些範例程式以後可以參考。所有範例程式都是從網路上找來再加上一些修改後放上。 總共有兩個範例,第一個範例是單純的使用 multi-thread 的功能,可以比較 multi-thread 和 single-thread 的效率差異。程式碼如下: # include < pthread.h > # include < stdio.h > # include < stdlib.h > # include < math.h > /* A task that takes some time to complete. The id identifies distinct    tasks for printed messages. */ void * task ( int id ) { int i ; double result = 0.0 ; printf ( " Task %d started \n " , id ) ; for ( i = 0 ; i < 9000000 ; i + + ) { result = result + sin ( i ) * tan ( i ) ; } printf ( " Task %d completed with result %e \n " , id , result ) ; } /* Same as 'task', but meant to be called from different threads. */ void * threaded_task ( void * t ) { long id = ( long ) t ; printf ( " Thread %ld started \n " , id ) ; ta