顯示具有 ns2 標籤的文章。 顯示所有文章
顯示具有 ns2 標籤的文章。 顯示所有文章

2011年3月30日 星期三

windows上用TortoiseSVN command line commit code

.

如果常常在windows上用TortoiseSVN commit code的話,你會發現GUI還是有其不方便的地方
找了一下如何用command line使用TortoiseSVN commit的方法

TortoiseSVN的中文說明書附錄(對,是簡中,我找過了,沒有繁中)

我用的批次檔內容如下:

"C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:commit /path:"D:\vm\vbsf\ns-2.29_svn" /closeonend:2


command:commit => commit code
path:"D:\vm\vbsf\ns-2.29_svn" => 這是我要commit code的位置,請自行置換
/closeonend:2 => 如果沒發生錯誤和衝突則自動關閉對話框

closeonend的參數有下列幾種:
/closeonend:0 不自動關閉對話框
/closeonend:1 如果沒發生錯誤則自動關閉對話框
/closeonend:2 如果沒發生錯誤和衝突則自動關閉對話框
/closeonend:3如果沒有錯誤、衝突和合併,會自動關閉
/closeonend:4如果沒有錯誤、衝突和合併,會自動關閉

我將其存成批次檔(如commit_ns229.bat),然後將該批次檔拉個連結到Launchy的utility folder中
之後要commit code時,只要alt + tab叫出Launchy,然後再輸入commit_ns229,perfect,就跳出commit code的視窗
你還是要按OK,按完OK後自動commit,commit完後自動關閉,放在以前還要手動再按一次OK將該progress dialog視窗關掉

你可能要問,為什麼不能全自動commit code,而是要再按一次OK
我也想問為什麼,因為我也想這麼做
但我實在找不到選項省略那一次OK,也許他們就是這樣設計
無論如何,我已經省掉過去GUI用滑鼠操作,和按第二次OK的時間

至於update?
將 /command:commit換成 /command:update即可(add,revert也一樣)
其他細節可參造中文說明文件

.

當gdb遇到SIGKILL……

.

在ns的開發階段,執行時遇到segmentation fault是很正常的
這時gdb非常的好用
但若gdb沒法用呢?

之前用gdb debug時遇到一個case……
在戴入ns的script file後,系統會hang住,過了好一陣子後出現下列的error msg:

Program terminated with signal SIGKILL, Killed.
The program no longer exists.

然後就停了,怎樣都跑不起來
上網查了一下,也沒什麼好答案

在解問題的過程中,我有注意到,一旦開啟gdb並戴入ns的script file時,系統會變得很慢,用top看了一下,ns的mem%衝到了93%,然後virtual和res還一直在漲上去,這是怎麼一回事?ns怎會用到那麼大量的記憶體?


最後我找到了問題的所在,因為我變數initialize錯誤,導致某個class的constructor配置了巨量的變數
然後gdb為了追蹤程式,又要為ns allocate的變配置對應的變數以做追蹤的動作,顯然的,他配置的變數也不少,結果導致gdb一直一直在配置memory,然後超過os的界限,os送個kill的signal給gdb正在trace的程式(也就是ns),將他kill掉
我想,這應該是gdb無法追蹤的原因

所以,下一次若你也遇到相同的問題,可以查查看是哪裡配置了太多、太大的記憶體囉

.

2011年3月21日 星期一

在ns中使用delay_bind() bind var (export var form c++ to tcl space)

.

想要將一個tcl的var和c++的var綁定(binding),按照NS by Example的範例,要在c++ clas的constructor中將想要bind的var透過bind這個function將c++的var address export到tcl space(畢竟兩個是在不同的記憶體空間)

但是ns的us manual 24.4.2中提到,在C++中使用bind()會使你創建的每個物件都消耗記憶體,若你創建許多相同的物件時,使用bind的代價太高。將bind()代換成delay_bind(),使得所需要的記憶體降到per-class level而非每個物件,從ns/object.cc參考如何binding的範例

那要如何使用delay_bind?

google了一下,其實沒有答案(中文的我就不期待了)

自己試了一下,簡單的說
1.在class對應的header file(.h)中,在protected下宣告兩個virtual function:
2.在class的實作中(.cc)實作此兩function
delay_bind_init_all的實作中,要call delay_bind_init_one() initialize tcl space的var,最後要記得call繼承者的delay_bind_init_all()
delay_bind_dispatch的實作中,要call delay_bind()來實現binding,最後同樣要記得call繼承者的delay_bindl()

我提供了一個範例(download),這個範例是從NS by Example的ex-linkage.cc改過來
可以直接放到ns的目錄中,將ex_link_delaybind.o加入Makefile的object list(OBJ_CC)中,重新make

make

再下載script file(download),同樣的,這個script file也是從NS by Example的ex-linkage.tcl改過來的,執行即可看到binding結果,結果就是在tcl中任意改var,class中對應的var也會變

ns ex_link_delaybind.tcl


大概解釋一下程式,我的C++ class為:MyAgentDelBind,繼承自Agent,該class中有兩個private data member:my_var1_、my_var2_想要跟tcl的data member連結
c++的my_var1_要跟tcl的my_var1_otcl連結
c++的my_var2_要跟tcl的my_var2_otcl連結

具體做法為
1.在class對應的header file(.h)中,在protected下宣告兩個virtual function:

virtual void delay_bind_init_all();
virtual int delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer);




2.在class的實作中(.cc)實作此兩function

delay_bind_init_all()的實作如下,這裡是主要initialize tcl space的var,因為此class是繼承自Agent,所以最後要記得call agent的delay_bind_init_all()

void MyAgentDelBind::delay_bind_init_all()
{
delay_bind_init_one("my_var1_otcl");
delay_bind_init_one("my_var2_otcl");
// MyAgent inherit from Agent => remember to call the ancestor's delay_bind_init_all()
Agent::delay_bind_init_all();
}


delay_bind_dispatch的實作如下,delay_bind就是在這裡被call來做tcl space跟C++ space var的連結,因為此class是繼承自Agent,所以最後要記得call agent的delay_bind_dispatch(),如此,就完成了cl space跟C++ space var的連結,跟以前在class constructor中call binding的做法不同

int MyAgentDelBind::delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer)
{
if (delay_bind(varName, localName, "my_var1_otcl", &my_var1_, tracer))
return TCL_OK;
if (delay_bind(varName, localName, "my_var2_otcl", &my_var2_, tracer))
return TCL_OK;

// MyAgent inherit from Agent
// if delay_bind_dispatch matches none of above => remember to call the ancestor's delay_bind_dispatch()
return Agent::delay_bind_dispatch(varName, localName, tracer);
}
}


然後我在BTSim注意到,BTSim的parameters在tcl跟c++ space的var name相同,驗證了一下
確實tcl的var name可以跟c++ binding的var name同名(其實蠻理所當然的,兩個var在不同space,事實上addr也不同,也各自有自己的instance)

另一個問題是,針對export出去的var,若同時在c++ constructor給定初始值,又在script file中assign該export var,那麼結果會是怎樣?
同樣的,做了一下實驗
結果是,C++的constructor會先被執行,script file會接著overwirte該var
所以當script file有assign value時,以script file的value為準,否則,就是constructor assign的value為準

另外,delay_bind還有其他一些變化
delay_bind_bool:用來將c++的int連結到tcl的booling值 (FullTcpAgent有用到),但是實驗顯示,其連結的變數型態只能是int,只是可以在tcl裡設定true或是false而已
delay_bind_time:用來連結c++的double到tcl的time value(FullTcpAgent有用到,但型態還是dobule)
delay_bind_bw:用來連結c++的double到tcl的bandwidth value(雖沒人用到,但我試過,這個api是存在的,且有用)

.

ns節省記憶體的小技巧

.

在ns user manual 24.4.2中介紹了一些節省記憶體的小技巧:

  1. 避免trace-all:$ns trace-all $f會使得trace objects被塞到所有links,若你只想trace一個link,這個overhead是可以避免的,每個link約可節省14KB
  2. 在使用系列的var時,盡量用array:ns中的每個var都有overhead,如set n$i [$ns node]中的n$i(就像n1, n2, n3, ...),若需要系列的變數時,使用array取代,如n($si)(就像n(1), n(2), n(3), ...),那麼其實只有一個變數會被使用(即n),每個變數可以節省40+Btye
  3. 避免宣告不需要的變數:若一個物件在後面不會再用到,那麼避免為該物件取名,每個變數可省約80B,如下列會為CtrMcast的物件指定一個變數:cmcast(1),但這其實是不必要的set cmcast(1) [new CtrMcast $ns $n(1) $ctrmcastcomp [list 1 1]]
    可以代換成:
    new CtrMcast $ns $n(1) $ctrmcastcomp [list 1 1]
  4. 在FreeBSD上run:在FreeBSD上malloc的overhead比其他的OS小,ns2的作者們最後還是會將FreeBSD的allocator port到其他平台
  5. Dynamic binding: 在C++中使用bind()會使你創建的每個物件都消耗記憶體,若你創建許多相同的物件時,使用bind的代價太高。將bind()代換成delay_bind(),使得所需要的記憶體降到per-class level而非每個物件(我個人的解讀時,bind會使得所有物件都用到它,不管需不需要,就像global variable的宣告,而delay_bind則是當宣告的物件有用到它時,也就是宣告的物件為該class時,這時才真的宣告=>這時才秏記憶體),從ns/object.cc參考如何binding的範例
  6. disabling packet header:在大量packet的simulation中,將你simulation中不會用到的packet header取消將會大量的節省記憶體(ns default是將所有packet header打開
    可在宣告ns前(set ns [new Simulator])輸入:
    remove-all-packet-headers,將所有packet header關閉(在ns宣告前輸入才有用)
    再將需要的packet header加回來,如IP、TCP:
    add-packet-header IP TCP Flags

原文如下:

Some tips to saving memory (some of these use examples from the cmcast-100.tcl script): If you have many links or nodes:
  1. Avoid trace-all : $ns trace-all $f causes trace objects to be pushed on all links. If you only want to trace one link, there’s no need for this overhead. Saving is about 14 KB/link.
  2. Use arrays for sequences of variables : Each variable, say n$i in set n$i [$ns node], has a certain overhead. If a sequence of nodes are created as an array, i.e. n($i), then only one variable is created, consuming much less memory. Saving is about 40+ Byte/variable.
  3. Avoid unnecessary variables : If an object will not be referred to later on, avoid naming the object. E.g. set cmcast(1) [new CtrMcast $ns $n(1) $ctrmcastcomp [list 1 1]] would be better if replaced by new CtrMcast $ns $n(1) $ctrmcastcomp [list 1 1]. Saving is about 80 Byte/variable.
  4. Run on top of FreeBSD : malloc() overhead on FreeBSD is less than on some other systems. We will eventually port that allocator to other platofrms.
  5. Dynamic binding : Using bind() in C++ consumes memory for each object you create. This approach can be very expensive if you create many identical objects. Changing bind() to delay_bind() changes this memory requirement to per-class. See ns/object.cc for an example of how to do binding, either way.
  6. Disabling packet headers : For packet-intensive simulations, disabling all packet headers that you will not use in your simulation may significantly reduce memory usage. See Section 12.1 for detail.


.

2010年10月14日 星期四

在Linux mint 8 (Ubuntu 9.10)下安裝ns 2.29

.

之前雖然成功的在Fedora Core 5下成功的安裝了ns 2.29和BittorrentSim
但是我常用的VM還是LinuxMint 8

若要同時開兩個VM,這不是個辦法
真要解決問題,還是得在Linux mint 8 (Ubuntu 9.10)下將ns 2.29裝起來才行

你會看到這篇文章的出現,就代表我已經成功的裝了起來

1.下載ns-allinone-2.29.3.tar.gz並解開

tar zxvf ns-allinone-2.29.3.tar.gz


2.在.bashrc下設定一些變數,設定完後logout,再login一次,讓變數發生作用
我自己的變數設定如下:


NSPATH229=$HOME/ns-allinone-2.29

PATH=$NSPATH229/bin:$NSPATH229/tcl8.4.11/unix:$NSPATH229/tk8.4.11/unix:$PATH
LD_LIBRARY_PATH=$NSPATH229/otcl-1.11:$NSPATH229/lib
TCL_LIBRARY=$NSPATH229/tcl8.4.11/library
export NSPATH229 PATH LD_LIBRARY_PATH TCL_LIBRARY


PS:
這裡的變數設定有參考 linux下安裝ns
但為什麼我的變數為NSPATH229而非NSPATH?
因為我之前有安裝過ns2.34,NSPATH已經被用掉了,因此我將原來的NSPATH comment掉,而NSPATH229就留給ns2.29

3.
在ns-allinone-2.29下,執行

grep 'system=MP-RAS-' ***/*/* -n

結果應如下:


將system=MP-RAS-`awk '{print $3}' /etc/.relid'`
'刪除
變成system=MP-RAS-`awk '{print $3}' /etc/.relid`
將所有有多出'的Makefile.in的行改掉,如下圖


4.我在這裡會遇到下面的問題:

undefined reference to `__stack_chk_fail_local'
ld: libotcl.so: hidden symbol `__stack_chk_fail_local' isn't defined
ld: final link failed: Nonrepresentable section on output
make: *** [libotcl.so] Error 1
otcl-1.11 make failed! Exiting ...

解法是參考這裡:NS-2 problem llType


簡單說,先安裝一些套件:

sudo apt-get install libx11-dev libxmu-dev libxmu-headers libxt-dev libtool g++-4.1

再下載tk-8.4-lastevent.patch (點我下載)
然後進入ns-allinone-2.29/tk-8.4.11/下

cd ns-allinone-2.29.3/tk-8.4.11/

執行:

patch -p0 < tk-8.4-lastevent.patch


再修改下列目錄中的"Makefile.in",將@CC@改成gcc-4.1,@CPP@改成g++-4.1

otcl-1.11/, line 7 : CC = gcc-4.1
tclcl-1.17/, line 40 : CC = gcc-4.1
tclcl-1.17/, line 41 : CPP = g++-4.1
ns-2.29/ , line 36 : CC = gcc-4.1
ns-2.29/ , line 37 : CPP = g++-4.1
nam-1.11/, line 44 : CC = gcc-4.1
nam-1.11/, line 45 : CPP = g++-4.1


若你在這之前有執行ns-allinone-2.29下的./install過,記得到ns-allinone-2.29/otcl-1.11/中執行make clean
(原文有說還要砍掉"Makefile",但我實驗的結果是,make clean即會砍掉"Makefile")

到這裡,我執行完ns-allinone-2.29下的./install
ns2.29就裝起來了

可喜可賀

.

2010年9月9日 星期四

在ns-2.29下安裝並執行bittorrentsim

.

ns-2.29安裝後,開始安裝bittorrentsim

bittorrentsim的作者為Kolja Eger(點我連結網站

作者網頁寫得很簡單,其實沒有那麼清楚
我還是紀錄一下安裝和測試過程吧

作者網站上有三個檔案
bittorrent.patch
bt_flashcrowd_flow.tcl
bt_flashcrowd_star.tcl

bittorrent.patch是作者的bt的實作
而後兩個檔案(bt_flashcrowd_flow.tcl和bt_flashcrowd_star.tcl)則是simulation的script file

請自行mapping到相對應的目錄
我的目錄是這樣
/root/ns-allinone-2.29/ns-2.29

安裝bittorentsim

將bittorrent.patch copy到ns-2.29後,在ns-allinone-2.29/ns-2.29下,依序執行:

patch p1 < bittorrent.patch
./confugrue
make clean
make


第一步驟執行後(上patch),會在ns-2.29下多出一個目錄:bittorrent
ns-2.29/bittorrent中的檔案就是作者bt的實作了
但要重新make ns才能將作者的實作的node加入ns中,讓simulation script file可以用

到這,bittorrensim就安裝進ns了,你可以寫simulation了
但是裝好我測試了一下……
本來不會有warning message的simulation script file在裝完bittorrentsim後,再執行同樣的simulation會跑出一堆warning……

warning: no class variable Node::AppRunning_

see tcl-object.tcl in tclcl for info about this warning.


anyway,只是warning而已,至少還是可以動的

20110104更新:
在將BTSim裝入NS229之後,之後跑任何script都會跳出"warning: no class variable Node::AppRunning_"這個warning,很煩
解法是在ns-default.tcl中加這一行:

Node set AppRunning -1

重編NS(這步我不確定要不要,我是習慣重編)
然後這warning就會消失囉


測試作者提供的兩個script file
測試過程中我遇到一些困難,在這我直接提解法,而為什麼會產生這些問題要等我trace code後才能回答了
在ns-2.29/bittorrent下再開一個folder:scripts
將兩個script file(bt_flashcrowd_flow.tcl和bt_flashcrowd_star.tcl)copy到該目錄(ns-2.29/bittorrent/ns-2.29/bittorrent/scripts)下

回到ns-2.29,也要copy兩個script file(bt_flashcrowd_flow.tcl和bt_flashcrowd_star.tcl)到這裡,執行

ns bt_flashcrowd_star.tcl 10 1 1000


第一個參數為peer數
第二個參數為random number generator
第三個參數為上傳頻寬(單位為kpbs)
所以上述的命令為:跑一個packet-level的simulation,10個peers,上傳頻寬為1000kbps

執行後,就會開始跑simulation,simulation的結果會在ns-2.29/bittorrent下再開新目錄,將結果寫入

以我的case,執行時會跑出下列這一行

bittorrent/results_flash_packet_star_100MB_N_P_10_C_125000.0Bps_seed_1_1284040923


這表示simulation完後,結果會被寫入
bittorrent/results_flash_packet_star_100MB_N_P_10_C_125000.0Bps_seed_1_1284040923這個資料夾

.

在linux fc5下裝ns 2.29

.

Efficient Simulation of Large-Scale P2P Networks Packet-level vs. Flow-level Simulations
這篇paper的作者Kolja Eger用ns2寫了bittorrent的simulation,並open source

所以想要用ns2寫p2p simulation的人,這個東西會是個不錯的參考

原本bittorrentsim是放在作者學校的網站上:
http://www.tuhh.de/et6/research/bittorrentsim/

然而,Kolja Eger畢業了,網站被移除了
經詢問,Eger把code改放到他的google site
https://sites.google.com/site/koljaeger/bittorrent-simulation-in-ns-2

然而,他的bittorent code是以patch file release的,並且是給ns-2.29用的

為此,我必需裝一個ns-2.29來安裝他的bittorrentsim

然而,安裝ns-2.29的過程不那麼順利
make時會有一堆error,據悉是gcc改版,規則變嚴格的原因
(這個我有印象,有次gcc更新後,本來可以make的code會make過不了)

我特地找個比較久的linux virtualbox image:Fedora Core 5
沒想這個distribution的gcc還蠻新的:gcc version 4.1.0 20060304 (Red Hat 4.1.0-3)
(其實我不確定是distribution本來的版本就這麼新,還是我以前有做過更新……)
所以make ns-2.29還是會有一堆error

要安裝ns-2.29時會出現一堆error,按照下列這個連結的方法就可以裝起ns-2.29
ns-2.29在Ubuntu8.04中的安装
基本上面文章的解法可行,按照他的方法,我把ns-2.29裝起來了

但是過程中會遇到另一個問題是文章中沒提到的,據說是bash 3.1.I的關係
error code如下:

checking system version (for dynamic loading)... ./configure: line 6017: syntax error near unexpected token `('


在ns-allinone-2.29的目錄下,複製下面這行:
for f in $(find -name configure); do sed "s/relid'/relid/" -i $f; done
貼上,執行,問題就解了
這個解法的原文出處:Compiling Network Simulator 2.29

到這裡,就裝好ns-2.29了
可以開始動手安裝bittorrentsim了


.