2011-12-07 25 views
0

我必須寫一個程序(Perl中,Python或Java)來模擬工作量我們的服務器上,這樣它需要兩個參數:如何模擬工作量

  1. 內存

  2. 時間

基於這些參數,它應該啓動一個進程,消耗指定的內存量達指定的時間量。內存的最大值可以高達50-100GB,時間可以高達12-24小時秒。

我不能使用fork或多線程,這個過程應該是一個單線程,並應該連續做操作(如整數/浮點等)。我也不想做任何I/O操作。

我能想到的最簡單的方法是:

1. while(timeSpent < timeLimit || memoryConsumed < memorySpecified){ 
2.   if(memoryConsumed <){ 
3.    Add random number to ArrayList 
4.   }else{ 
5.    Multiply all numbers (Do some exception handling to prevent this from overflowing) 
6.   } 
7. } 

請讓我知道是否有這樣做的更好的方法。

感謝,

阿米特

+0

這是功課嗎? – carlosdc

+0

:)不,我一年畢業了。我實際上正在編寫這個文件來爲服務器上的代碼進行壓力測試。我可以選擇使用壓力http://weather.ou。edu /〜apw/projects/stress /但是後來我知道我需要一些東西,這些東西可能會讓人想要從非常簡單的東西開始。 –

回答

1

我使用的工具壓力weather.ou.edu/~apw/projects/stress ......雖然調整了它一下,延長我想要的功能..

感謝您的幫助球員。

1

豈不是這樣的Python代碼滿足您的需求?

import argparse 
import datetime 

def main(): 
    parser = argparse.ArgumentParser(description = "Consume memory and time.") 
    parser.add_argument('memory', metavar = 'M', type=int, help = "memory (in megabytes) to consume") 
    parser.add_argument('time', metavar = 'H', type=int, help = "time (in hours) to consume") 
    args = parser.parse_args() 

    data = bytearray(args.memory * 1000000) 
    now = datetime.datetime.today() 
    finish = now + datetime.timedelta(hours = args.time) 
    while now < finish: 
     for i in xrange(args.memory * 1000000): 
      data[i] = now.second 
     now = datetime.datetime.today() 


if __name__ == '__main__': 
    main() 
0

你的例子似乎是合理的,至少第一步。然而,有許多小細節,以得到正確的:

  • 你說你不想做的I/O,那是好的,但是在 分配50-100 GB的現代機器,你們將會做I/O,無論你是否想要 (通過頁面錯誤),所以你可能想重新定義你的規範 那裏。
  • 此外,考慮到您的「對象」的粒度,很多科學計算應用程序無法通過「許多小對象」獲得範例。你很多人想要有一些參數來平衡 「許多小物體」和「幾個大物體」。
  • 此外,通過將您的 容器中的所有數據點相乘或相加,您可能會生成一系列可能易於由操作系統預測的頁面錯誤序列,因此在 現實世界中不切實際,您可能需要添加一些隨機性在你穿越它的方式。

這是一個比它看起來更微妙的問題,許多人想從簡單的甚至是標準測試開始,比如SETI或者光線追蹤器。