本文介绍如何在仿真开始之前,节点就有一些消息。即写脚本生成符合The ONE格式的消息事件,而后导入The ONE仿真器。

1. 创建消息事件

事件的格式举例如下:

#time    C    message    from    to    size
285.7    C    M1    163    509    550704
558.6    C    M2    752    241    100161

每行代表一个事件,仿真运行时,会产生一个消息。尽管The ONE/toolkit,有个Perl脚本文本createCreates.pl可以创建消息,但并不适合该场景。自己写一个也不难,我用的是Python,核心源代码如下:

### create a message event ###
i = 0
while i < nrofMessages :
    src_host = random.randint(minHostAddr, maxHostAddr)
    dst_host = random.randint(minHostAddr, maxHostAddr)

    while (dst_host == src_host) :
        dst_host = random.randint(minHostAddr, maxHostAddr)

    size = random.randint(minMsgSize, maxMsgSize)
    message = msgPrefix + str(nextMsgID)

    # print startTime, "\t", "C", "\t", message, "\t", src_host, "\t", dst_host, "\t", size
    print('\t'.join([startTime, "C", message, src_host], dst_host, size))
    nextMsgID += 1
    i += 1

值得注意的是random.randint(min, max)产生的随机数既包括上限也包括下限。参数如下:

#!/usr/bin/env python
import random
import sys

msgPrefix = "M"

minHostAddr = 0
maxHostAddr = 49

startTime = 0.0
endTime = 0

# nrofMessages = 100
nrofMessages = int(sys.argv[1])

minMsgSize = 1000
maxMsgSize = 2000
nextMsgID = 1

2. 导入The ONE

将上述的事件保存在一个文件中,导入The ONE很简单,只需要在设置文件进行相应的设置,如下:

Events.nrof = 1
Events1.class = ExternalEventsQueue
nrofMsgs = [500; 500; 500; 2000; 2000; 2000; 5000; 5000; 5000; 10000; 10000; 10000]
Events1.filePath = [nc/traces/initMsgs/n50_m500.txt; nc/traces/initMsgs/n50_m500.txt; nc/traces/initMsgs/n50_m500.txt; nc/traces/initMsgs/n50_m2000.txt; nc/traces/initMsgs/n50_m2000.txt; nc/traces/initMsgs/n50_m2000.txt; nc/traces/initMsgs/n50_m5000.txt; nc/traces/initMsgs/n50_m5000.txt; nc/traces/initMsgs/n50_m5000.txt; nc/traces/initMsgs/n50_m10000.txt; nc/traces/initMsgs/n50_m10000.txt; nc/traces/initMsgs/n50_m10000.txt]

3. 交流讨论

我想测试不同路由协议,传输相同数量的数据包,哪个快(最后一个数据包被接收的时间)。刚测了下,结果并不理想。这种在仿真之前,把消息固定好,也许并不是一个好的方法。如果您有更好的方法,期待您与我分享。

4. 一个疑问

我分别创建了500,2000,5000, 10000个消息,查看MessageStatsReportCreated是500, 1997, 4991, 9981。最开始以为是nrofPreload设置得不够大,但设置大到可以容纳所有消息,情况依然存在。求指点。

2016/01/21更新:这事实上是一个BUG,详情见《读取外部事件存在BUG》。

本文系Spark & Shine原创,转载需注明出处本文最近一次修改时间 2022-03-27 16:23

results matching ""

    No results matching ""