iT邦幫忙

0

[Shell Script]海量目錄建立- 壓力測試

我想寫一個 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

蟹老闆 iT邦大師 1 級 ‧ 2010-10-12 01:52:12 檢舉
請問這個測試的用意是?
Ext2 (Second Extended Filesystem)32768 層
Windows 及 DFS 複寫支援的資料夾路徑長度上限為 32,000 個字元。DFS 複寫不受 260 個字元的資料夾路徑限制。
這等於是要有
1
2*2
3*3*3
4*4*4*4
5*5*5*5*5
……個目錄,就是做出N的N次方個目錄。
做那麼多的目錄真的有點瘋狂…
類似需要那麼多目錄的,
較會看到的是squid裡的cache的目錄,
是為了在各目錄存取大量的小cache的檔案。

若要做測試,也許配合產生大量的檔案,
來做存取的效能測試,應是會更適合吧!
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
16
eightcloud
iT邦新手 4 級 ‧ 2010-10-12 00:35:47

利用 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
....

14
chang0206
iT邦新手 1 級 ‧ 2010-10-12 08:49:29

不懂這樣子的作法,是要測什麼"壓力"的測試?
平常狀況下不太可能會出現這樣的情況吧
既然是STORAGE,拿來測IOPS或者是傳輸速率不是更好?

IOPS 容易測. 但如果像題述的情況 99層階的資料, 一般storage根本承受不了。

xeon iT邦新手 4 級 ‧ 2010-10-18 09:13:46 檢舉

99層階 => 一般 storage 根本承受不了 ??
這是想像的吧 , 我用 XPP + 老NB 玩了一下 , 一點問題也沒

2
shunyuan
iT邦研究生 1 級 ‧ 2010-10-13 09:16:36

#!/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

shunyuan iT邦研究生 1 級 ‧ 2010-10-13 09:18:27 檢舉

用 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

4
逮丸逮丸
iT邦大師 1 級 ‧ 2010-10-13 22:06:09

用遞迴的方式來做是標準的解法,
而 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 一次做出所有的目錄。

感謝twtw大大提供這麼棒的想法, 用{} 相當別出心裁, 但是當參數給得太大的話, 實際run會吃光所有memory而失敗.

xeon iT邦新手 4 級 ‧ 2010-10-18 09:29:56 檢舉

很好奇, troubleson所說的太大是多大, 還有 memory 是多少, 居然可以玩到失敗!!
既然是技術討論 , 還是把數字提出來 , 這樣子比較能夠解決問題 ..

0
kenkk
iT邦新手 3 級 ‧ 2010-10-15 15:36:11

有點納悶,這樣測出來的東西方向是說哪個指標很好呢?
買之前先查查 SPC benchmark 的資料後,
最多要求提供測試機看看實務運作上的狀況 ,
就準備買了, 如果很擔心或是系統和硬體統包, 就是會有效能驗收的項目.....

蟹老闆 iT邦大師 1 級 ‧ 2010-10-15 17:46:29 檢舉

kenkk提到:
這樣測出來的東西方向是說哪個指標很好呢?

樓主別出心裁的測試沒有人看出來,其實是在測寫script 的功力。

kenkk iT邦新手 3 級 ‧ 2010-10-15 18:57:31 檢舉

對對...有道理...應該是這樣吧...這些 script 真的是沒用過..

xeon iT邦新手 4 級 ‧ 2010-10-18 09:26:54 檢舉

同意 , 不知道在測什麼!!

0
xeon
iT邦新手 4 級 ‧ 2010-10-18 09:26:00

跟前面幾位大大想法相同 , 也就是這樣子的測試沒啥意義!!

講白一點 , 目錄結構的問題是 file system 效能 , 與實體的儲存硬體關係不大 , 不要說 99 層目錄 , 就算是 9 百萬層 , 對實體儲存硬體來說也只不過是幾個 bytes ~ 幾百萬的資料 , 這樣子的資料量對目前硬碟科技來說是 cake ..

重點是 file system 的設計是否能夠容納這樣子的目錄結構 , 還有會不會 tuning file system!!

跳躍思考 , 再加沒有根據 , 是根本測不出什麼的喔!!

的確 我並非是要測storage的效能指標 而是要測出系統崩潰指標 並做scale-out擴展 簡單來講 未來雲端運算資料量無限制成長 你如何評估出storage資料乘載量 感謝各位長官指教

蟹老闆 iT邦大師 1 級 ‧ 2010-10-18 13:03:24 檢舉

troubleson提到:
你如何評估出storage資料乘載量

其實任何測試皆有其意義,以你所要求的測試怎麼測都應該測不出結果,以windows來說當到達目錄長度限制時會出現目錄超出長度的錯誤訊息,他並不會因而造成系統當機,我想你想知道的應該是"如果同時要求建立目錄的結果",以script並無法做到,把script拆開來看他也是一次要求一個,而不是同時要求,所以一定不會因此而當機,若是同時要求建立大量目錄時有問題的部份可能是伺服器的負載能力,而不是建目錄的能力,參考看看。

蟹老闆 iT邦大師 1 級 ‧ 2010-10-18 13:07:55 檢舉

dream提到:
其實任何測試皆有其意義

意指這個測試意義可以有很多如可以看出寫script的功力還有也可以看出目錄到底可以建多少及你所要求的壓力測試等等

0
neoyin
iT邦新手 5 級 ‧ 2013-04-02 10:50:02

這個測試聽起來是測storage CPU? (create inode的速度&能力)

我要發表回答

立即登入回答