發表文章

目前顯示的是 十月, 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的封包。 這裡指的是晶片有能力處理封包,但是要怎麼處理要透過集中控制器來決定。集中式控制:所有網路設備控制權被集中到一台控制器。所以傳統網路在設計上的分散式架構被打破了,也因此,傳統網路很多的行為是不必要的,如Flooding。畢…

列王記:約沙法

亞哈的份量比預期的多上很多,看來以利亞和耶洗別幫了不少忙。接下來把目光重新放到南國猶大。下一個要登場的君王是約沙法,約沙法是亞撒的兒子,也是個敬畏耶和華的君王。關於約沙法,列王記裏面的記載不多,大部份都在歷代志下,所以經文參考會以歷代志為主。

姓名:約沙法
國家:南國猶大
對應的南國君王:亞哈、亞哈謝、約蘭

聖經記載:
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); task(id);printf("Thread %ld done\n", id); pthread_exit(0);}/* Run 'task' num_tasks times serially. */void*serial(int num_tasks){int i;for(i =0; i < num_tasks; i++){ task(i)…