如何模拟负载

0 投票
3 回答
937 浏览
提问于 2025-04-17 07:52

我需要写一个程序(可以用perl、python或java)来模拟我们服务器上的负载,这个程序需要接受两个参数:

  1. 内存

  2. 时间

根据这两个参数,程序应该启动一个进程,消耗指定的内存量,持续指定的时间。内存的最大值可以达到50-100GB,而时间可以长达12-24小时。

我不能使用fork或多线程,这个进程必须是单线程的,并且要持续进行一些操作(比如整数运算或浮点运算等)。我也不想进行任何输入输出操作。

我想到的最简单的方法是:

 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. }

如果有更好的方法,请告诉我。

谢谢,

Amit

3 个回答

0

你的例子看起来合理,至少作为第一步是可以的。不过,有很多小细节需要注意:

  • 你说你不想进行输入输出操作,这没问题,但在现代机器上分配50-100GB的内存时,无论你想不想,都会发生输入输出操作(通过页面错误的方式),所以你可能需要重新考虑一下你的要求。
  • 另外,要考虑你“对象”的粒度,很多科学计算应用无法处理“很多小对象”的模式。你可能需要设置一个参数,来平衡“很多小对象”和“少量大对象”之间的关系。
  • 此外,如果你对容器中的所有数据点进行乘法、加法或其他操作,可能会产生一系列的页面错误,这些错误可能会被操作系统轻易预测,因此在现实世界中并不真实。你可能需要在遍历数据时加入一些随机性。

这个问题比看起来要复杂得多,建议你从简单的开始,甚至可以试试一些标准测试,比如:SETI或者光线追踪器。

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()
1

我正在使用一个叫做 stress 的工具,网址是 weather.ou.edu/~apw/projects/stress ... 不过我稍微改了一下,增加了一些我想要的功能。

谢谢大家的帮助。

撰写回答