我想寫一個 script 對公司storage做壓力測試
1.自動建立n個目錄
2.共有n層階的目錄
3.每個層階的目錄下有n個目錄
ex:
1 2 3
1 2 3 1 2 3 1 2 3
123 123 123 123 123 123 123 123 123
是否可提供想法來寫這個script
利用 recursive function...
像這樣..
(javscript)
<pre class="c" name="code">
MkDirTest(level,level,".");
function MkDirTest(level,count,basedir)
{
if (level==0)
return;
var i;
for(i=1; i<=count; i++)
{
newFolderName=basedir+"/"+i;
mkdir newFolderName;
MkDirTest(level-1,count,newFolderName)
}
}
windows 的 script (wsh, jscript)
MkDirTest.js
<pre class="c" name="code">
oShell = WScript.CreateObject("WScript.Shell")
oFS = WScript.CreateObject("Scripting.FileSystemObject")
args = WScript.Arguments;
if (args.length!=1)
{
WScript.Echo("MkDirTest level");
WScript.Quit();
}
level = args(0);
MkDirTest(level,level,".");
function MkDirTest(level,count,basedir)
{
if (level==0)
return;
var i;
for(i=1; i<=count; i++)
{
newFolderName=basedir+"/"+i;
oFS.CreateFolder(newFolderName)
MkDirTest(level-1,count,newFolderName)
}
}
執行
cscript MkDirTest.js 3
G:\tools\js\t>find .
.
.\1
.\1\1
.\1\1\1
.\1\1\2
.\1\1\3
.\1\2
.\1\2\1
.\1\2\2
.\1\2\3
.\1\3
.\1\3\1
.\1\3\2
.\1\3\3
.\2
.\2\1
.\2\1\1
.\2\1\2
.\2\1\3
....
不懂這樣子的作法,是要測什麼"壓力"的測試?
平常狀況下不太可能會出現這樣的情況吧
既然是STORAGE,拿來測IOPS或者是傳輸速率不是更好?
#!/bin/sh
for i in 1 2 3 4 5 6 7 8 9; do
mkdir "$i"
for j in 1 2 3 4 5 6 7 8 9; do
mkdir "$i/$j"
for k in 1 2 3 4 5 6 7 8 9; do
mkdir "$i/$j/$k"
done
done
done
用 Linux shell script.
不過執行只需要不到一秒,沒辦法用來當成壓力測試。
用9為參數, 要有 9 層目錄吧!
這樣應該只有3層...
1/1/1/1/1/1/1/1/1
1/1/1/1/1/1/1/1/2
.................
1/1/1/1/1/1/1/1/9
1/1/1/1/1/1/1/2/1
.................
1/1/1/1/1/1/1/2/9
1/2/3/4/5/6/7/8/9
.................
9/9/9/9/9/9/9/9/9
如果我是要99層呢... 冏~ 上面要看storage 這麼極端的條件會不會crash
用遞迴的方式來做是標準的解法,
而 SY 大的做法,其實可以完全不用到迴圈,
也不需要做那麼多次的mkdir,一行指令就做到:
<pre class="c" name="code">mkdir -p {1,2,3}/{1,2,3}/{1,2,3}
所以利用 linux 上的這個蠻特別的mkdir的特點,
並具順應「要幾層就有幾層」的script,可試試以下這個script:
把以下的程式碼存成 make_dirs.sh
<pre class="c" name="code">#~/bin/sh
function a_set() {
echo -n "{" >> do.sh
for i in `seq 1 $1`
do
echo -n $i >> do.sh
if [ $1 != $i ]
then
echo -n ',' >> do.sh
fi
done
echo -n "}/" >> do.sh
}
echo -n "mkdir -p " > do.sh
for i in `seq 1 $1`
do
a_set $1
done
#sh do.sh
執行 make_dirs.sh 3 就會產生一個 do.sh 的檔,
可看看所產生的內容,即是一行指令就可建好所有目錄的script檔,
再手動作 sh do.sh 就建完成,
或者把 make_dirs.sh 最後一行的 # 拿掉,
那麼 make_dirs.sh 3,就同時把做好的 do.sh 也順便執行,
也把目錄都做好了。
make_dirs.sh 的做法很單純,
用 a_set 的這 function 等於可以畫出一個 {1,2,...}/ 這樣的字串,
利用 seq 1 .. 某數目,就例舉到某數,
重覆做 a_set 的動作,就畫出了幾層的 a_set 的內容,
就做好了一個 do.sh 的滿足所要 mkdir 所有目錄的script了。
這算是間接地做出 script,然後再用 mkdir 一次做出所有的目錄。
有點納悶,這樣測出來的東西方向是說哪個指標很好呢?
買之前先查查 SPC benchmark 的資料後,
最多要求提供測試機看看實務運作上的狀況 ,
就準備買了, 如果很擔心或是系統和硬體統包, 就是會有效能驗收的項目.....
跟前面幾位大大想法相同 , 也就是這樣子的測試沒啥意義!!
講白一點 , 目錄結構的問題是 file system 效能 , 與實體的儲存硬體關係不大 , 不要說 99 層目錄 , 就算是 9 百萬層 , 對實體儲存硬體來說也只不過是幾個 bytes ~ 幾百萬的資料 , 這樣子的資料量對目前硬碟科技來說是 cake ..
重點是 file system 的設計是否能夠容納這樣子的目錄結構 , 還有會不會 tuning file system!!
跳躍思考 , 再加沒有根據 , 是根本測不出什麼的喔!!
的確 我並非是要測storage的效能指標 而是要測出系統崩潰指標 並做scale-out擴展 簡單來講 未來雲端運算資料量無限制成長 你如何評估出storage資料乘載量 感謝各位長官指教
troubleson提到:
你如何評估出storage資料乘載量
其實任何測試皆有其意義,以你所要求的測試怎麼測都應該測不出結果,以windows來說當到達目錄長度限制時會出現目錄超出長度的錯誤訊息,他並不會因而造成系統當機,我想你想知道的應該是"如果同時要求建立目錄的結果",以script並無法做到,把script拆開來看他也是一次要求一個,而不是同時要求,所以一定不會因此而當機,若是同時要求建立大量目錄時有問題的部份可能是伺服器的負載能力,而不是建目錄的能力,參考看看。
dream提到:
其實任何測試皆有其意義
意指這個測試意義可以有很多如可以看出寫script的功力還有也可以看出目錄到底可以建多少及你所要求的壓力測試等等