본문
OMNeT++ Result Recording and Analysis #1
12.1 Result Recording
OMNeT++은, 출력 벡터와 출력 스칼라를 통해, 시뮬레이션 결과를 저장하는 기능을 내장하고 있다. 출력 벡터는 시계열(time series) 데이터를 의미하며, simple 모듈 혹은 채널으로부터 기록된다. 출력 벡터를 사용하여 패킷에 대한 종단간 지연시간 혹은 round trip시간을 기록할 수 있으며, 이뿐만 아니라 큐의 길이, 큐잉 시간, 모듈 상태, 링크 사용량, 패킷 유실률등 시뮬레이션이 작동중에 모델상에 발생하는 모든 이벤트를 기록할 수 있다.
출력 스칼라는 결과의 요약값으로서, 시뮬레이션 도중에 계산되고 시뮬레이션이 끝나면 기록된다. 스칼라 결과는 숫자로 표현되며 혹은 갯수, 평균, 표준편차, 총합, 최소값, 최대값 등의 필드로 구성된 통계적 요약, 혹은 히스토그램 데이터로 나타낼 수 있다.
결과값은 statistics를 선언하여 시그널 메커니즘으로 기록되거나, 혹은 시뮬레이션 라이브러리를 사용하여 c++코드로부터 바로 불러와 저장될 수 있다. 두번째 방법은 결과를 기록하는 오랫동안 사용된 방법이다. 첫번째 방법은 시그널과 statistics의 선언을 통해 가능하고, 이는 OMNeT++4.1 에서부터 사용 가능하다. 이 방법은 시뮬레이션 모델의 복잡한 편성이나 지속적인 조작을 요구하지 않으면서도 원하는 형태로 결과를 저장할 수 있도록 하기 때문이다.
12.1.1 Using Signals and Declared Statistics
이 방법은 시그널 메커니즘과 NED 속성을 결합하는 방식으로서 기록과 결과 절차를 분리하여 어떤 형태로 기록할것인지에 대한 유연성을 제공한다. 이 방법의 자세한 사항은 4.15에서 자세히 다루었고, 이 절에서는 간단하게 훓어볼 것이다.
통계(statistics)는 NED파일 내에서 @statistic 속성을 통해 선언되고, 모듈은 시그널 메커니즘을 사용하여 값을 호출한다. 시뮬레이션 프레임워크는 시그널에 대한, 특별한 결과 파일 기록을 위한 리스너를 등록함으로서, 데이터를 기록한다. 어떤 리스너가 추가될지에 대해 선택하는것이 가능하여, 사용자는 결과 파일에 어떤것을 기록할지, 그리고 기록 전에 어떻게 선처리를 할것인가에 대한 제어가 가능하다. 앞에서의 4.15절에서 simple 모듈 또는 채널에서 어떻게 시그널 기반의 결과 기록을 수행할것인가에 대해 설명하였다.
시그널 방법론은 종합적 통계의 계산(예를 들어 패킷 유실 수의 합계)을 가능하게 하고, 모듈 코드상에서의 지원 없이도 warm-up 기간을 구현할 수 있다. 이는 또한 기존의 모듈을 건드리지 않고도 통계 전용 모듈을 만들 수 있도록 한다. 결과값 기록을 제어하기 위해 cOutVector와 recordScalar()에서 사용했던 동일한 설정 옵션이 시그널 방법론에서도 사용 가능하고, 추가적인 확률에 접근할 수 있도록 하는 추가적 설정 옵션이 존재한다..
12.1.2 Direct Result Recording
이 방법으로, 스칼라, 통계적 결과는 모듈내의 클래스 변수에 저장되고, recordScalar() 를 통해 종료 시점에서 기록된다. 벡터는 cOutVector 객체를 사용하여 저장된다. 최소/최대 값 혹은 편차와 같은, 더 자세한 사항을 기록하고자 한다면, cStdCDev와 cWeightedStdDev가 사용되고, 또한 분포를 기록하기를 원할 경우, 히스토그램 또는 다른 분포 예츨 클래스(cDoubleHistogram, cLongHistogram, cPSquare, cKSplit등)들이 존재한다. 이 클래스들은 7.7, 7.8절에서 상세히 설명되어 있다. 각 벡터, 스칼라, 통계치의 기록은 설정파일(ini 파일)을 통해 활성화/비활성화 할 수 있고, 또한 여기에서는 벡터의 기록 간격을 설정하는 것 또한 가능하다.
모듈로부터 바로 결과를 기록하는것의 단점으로서, 결과값 기록 부분이 모듈 내에 명시적으로 존재해야 하며, 따라서 아주 사소한 요구사항 변경(예를 들어 각각의 지연시간 값 대신 평균 지연시간을 원하거나 그 반대의 경우를 원하는 경우)에 있어서 코드의 수정이나 혹은 모듈내에서의 방대한 결과 수집 코드를 요구한다.
12.2 Configuring Result Collection
12.2.1 Configuring Signal-Based Statistics Recording
시그널 기반의 통계 기록방법이 제안된 이유는, 결과의 '최소 기본 항목'만 기록하거나 '상세한 항목'을, 혹은 결과의 특정 집합만을 선택하여(예를 들어 기존의 집합에서 변경하거나 혹은 새로 집합을 생성하여) 기록하는 과정을 쉽게 구성할 수 있기 떄문이다.
기록은 resulkt-recording-modes라는 객체단위 설정 옵션을 사용하여 조정될 수 있다. 여기에서의 '객체'는 통계항목을 의미하며, 이는 모듈 또는 채널 객체의 전체경로와(계층적 이름) 통계의 이름(@statistic 속성의 인덱스, 즉 []내에 있는 문자열)을 결합하는 형태로서 구분될 수 있다. 따라서, 설정 키는 <모듈전체경로>.<통계이름>.result-recording-modes=.와 같은 형태를 보인다.
result-recording-modes 옵션은 하나 혹은 그 이상의 항목을 값으로 가진다.(,로 구분) 각 항목은 결과 기록 모드일 수 있으며, 여기에서 두개의 단어인 default와 all은 특별한 의미를 갖는다.
* 결과 기록 모드는 항목은 @statistic 항목의 record 키에 명시될것이라는 것을 의미한다. 예를 들어 count, sum, mean, vector((count-1)/2)등이 있다.
* default는 @statistic 항목의 record 리스트에서의 선택적이 아닌 집합(set of non-optional)을 의미하며, 즉, 이는 ?표식을 추가하지 않는 경우를 나타낸다.
* all은 @statistic 속성의 record에 나열된 ?표식이 있는 항목을 포함한 모든 항목을 사용함을 의미한다.
* 옵션 값으로 -만이 사용되는 경우는 모든 기록 모드를 비활성화 함을 의미한다.
리스트상의 기록 모드 항목은 +, - 기호와 결합되어 결과 기록 모드 집합으로부터 추가되거나 삭제될 수 있다. 결과 기록 모드의 처음 집합은 default이고, 만약 첫번째 항목에 +혹은 -가 붙는 경우, 그 항목을 포함한 모든 이후의 항목들은 해당 집합을 수정하고자 하는 것으로 이해된다. 만약 첫번째 항목에 +혹은 -가 붙지 않는 경우, 이는 집합을 대체하며 따라서 이후의 항목은 해당 집합을 수정하고자 하는것으로 이해된다. 현재 서술된 문장은 실제보다 복잡하게 서술되어있으므로, 예제를 통해 이해하는것이 더욱 명확할 것이다. 예를 들어, 다음과 같은 통계를 설정한다고 가정해보자.
@statistic[foo](record=count,mean,max?,vector?);
그러면 ini파일에 다음 코드를 삽입함으로서 주석상에 있는 효과를 얻을 수 있다.
**.result-recording-modes = default # --> count, mean
**.result-recording-modes = all # --> count, mean, max
**.result-recording-modes = - # --> none
**.result-recording-modes = mean # --> only mean (disables ’default’)
**.result-recording-modes = default,-vector,+histogram # --> count,mean,histogram
**.result-recording-modes = -vector,+histogram # --> same as above
**.result-recording-modes = all,-vector,+histogram # --> count,mean,max,histogram
또한 아래의 예는 어떻게 더욱 상세한 옵션 키를 작성할 수 있는지 보여준다. 아래의 코드는 네트워크상의 fifo[] 서브모듈 벡터의 모든 queueLength 통계에 적용된다.
**.fifo[*].queueLength.result-recording-modes = +vector # default modes plus vector
결과 파일에 있어, 스칼라 값은 기록 모드와 결합되어 기록될 것이다. 즉, queueingTime의 평균값은 queueingTime:mean으로 기록된다. 참고할것은 시그널 기반의 통계 기록에서는 기본적인 스칼라와 벡터 기록 시스템 상에 기능이 추가되어, scalar-recording, vector-recording, vector-recording-intervals와 같은 옵션이 사용가능하다. 이 옵션들은 이어지는 절에서 설명될 것이다.
출처 : OMNeT++ User Manual
댓글