Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

비동기적으로 작동하는 이벤트(Actor메시지)의 성능을 유닛테스트기를 활용하여 측정할수 있는 방법을 닷넷 환경에서 비동기적으로 작동하는 이벤트의 Message Delivery Once 를 검증하는방법과
Nbench를 이용하여 유닛테스트환경에서 성능측정을 할수 있는방법을 소개합니다.
이 샘플에서는 액터성능 테스트가 예시되어있지만 액터모델과 상관없이  유닛테스트내에서 심플한 측정모드를 액터메시지 모델이 이용되었지만 액터모델과 상관없이~
유닛테스트내에서  성능측정 기법을 이용할수 있습니다.

측정할 수 없는 것은 관리할수 없다 - 피터 드러크

Table of Contents


테스트 탐색기

...

테스트 탐색기를 통해 성능유닛 테스트를 수행하고 측정할수 있습니다.

...

성능제약이 잘 작동하는지도 검증할수 있습니다.


이벤트가를 이벤트는 N개 동시 발생하며,  소비가 되는구간에서 성능카운트를 1올려줍니다.발생시킬수 있지만, TPS제약을 할수있는  ThrottleLimitActor 가 준비되었으며

Code Block
themeEmacs
[Theory(DisplayName = "테스트 n초당 1회 호출제약")]
[InlineData(5, 1, false)]
public void ThrottleLimitTest(int givenTestCount, int givenLimitSeconds, bool isPerformTest)
{
.......
  // Create ThrottleLimit Actor
  throttleLimitActor = actorSystem.ActorOf(Props.Create(() => new ThrottleLimitActor(1, givenLimitSeconds, 1000)));
  throttleLimitActor.Tell(new SetTarget(probe))
  
  for (int i = 0; i < givenTestCount; i++)
  {
      throttleLimitActor.Tell(new EventCmd()
      {
          Message = "test",
      });
  }
  
  //Then : Safe processing within N seconds limit
  for (int i = 0; i < givenTestCount; i++)
  {
      probe.ExpectMsg<EventCmd>(message =>
      {
          Assert.Equal("test", message.Message);                        
      });
  
      output.WriteLine($"[{DateTime.Now}] - GTPRequestCmd");
  
      if (isPerformTest)
      {
          _dictionary.Add(_key++, _key);
          _addCounter.Increment();
      }
  }
...........
}  

도메인 검증은 기본유닛테스트는 발생메시지가 모두 소비되었나를 검증하며 , 소비가 되었는가만을 검증합니다.


TPS 1을 유지하였는가 성능검증은 다음과같이 작성합니다? 는 다음과 같이 분리하여 측정될수 있습니다.

Code Block
themeEmacs
        [NBenchFact]
        [PerfBenchmark(NumberOfIterations = 3, RunMode = RunMode.Throughput,
        RunTimeMilliseconds = 1000, TestMode = TestMode.Test)]
        [CounterThroughputAssertion("TestCounter", MustBe.LessThanOrEqualTo, 1.0d)]
        [CounterTotalAssertion("TestCounter", MustBe.LessThanOrEqualTo, 1)]
        [CounterMeasurement("TestCounter")]
        public void ThrottleLimitPerformanceTest()
        {
            ThrottleLimitTest(1, 1, true);
        }


통과옵션을을  1보다 작다로 설정을 하여 TPS1이하인지 TPS1이하를 검증을 할수가 있습니다.

  • [CounterThroughputAssertion("TestCounter", MustBe.LessThanOrEqualTo, 1.0d)]
  • [CounterTotalAssertion("TestCounter", MustBe.LessThanOrEqualTo, 1)]

...

Code Block
themeEmacs
    [PASS] Expected [Counter] TestCounter to must be less than or equal to 1.00 operations; actual value was 0.98 operations.
    
    [PASS] Expected [Counter] TestCounter to must be less than or equal to 1.00 operations; actual value was 1.00 operations.
    
    
    ---------- Measurements ----------
    
    Metric : [Counter] TestCounter
    
    Per Second ( operations )
    Average         : 0.9802234345891607
    Max             : 0.9823810933292493
    Min             : 0.9787775577268321
    Std. Deviation  : 0.0019042957466220024
    Std. Error      : 0.0010994456619288725
    
    Per Test ( operations )
    Average         : 1
    Max             : 1
    Min             : 1
    Std. Deviation  : 0
    Std. Error      : 0
    


검증 옵션을 GreaterThanOrEqualTo 반대로 설정을 하면 실패가 발생하며 아래와같이 검증 실패가 발생하게됩니다.옵션과 측정수가 일치하지 않으면 다음과같이 유닛테스트가 실패하게 됩니다.

(실패를 유발하기위해 GreaterThanOrEqualTo 으로 설정한 케이스)

Code Block
    [FAIL] Expected [Counter] TestCounter to must be greater than or equal to 1.00 operations; actual value was 0.98 operations.
    Expected: True
    Actual:   False

샘플 코드 : https://github.com/psmon/NetCoreLabs/blob/main/ActorLibTest/tools/ThrottleLimitActorTest.cs

이상  유닛테스트와 함께 심플한 성능테스트를 함께 할수 있는 방법을 살펴보았으며


Image Added

여기서 확장된 개념이 소비자의 소비능력을 측정하여 생산량을 동적 TPS조절할수 있는 조절기를 설계하는것이 BackPressure 입니다.


GC 성능 테스트기

...

Code Block
    ---------- Measurements ----------

Metric : TotalCollections [Gen0]

Per Second ( collections )
Average         : 251.73166139361632
Max             : 305.97882626522244
Min             : 178.82369771642138
Std. Deviation  : 47.515272144026895
Std. Error      : 15.025648361787713

Per Test ( collections )
Average         : 1
Max             : 1
Min             : 1
Std. Deviation  : 0
Std. Error      : 0

----------

Metric : TotalCollections [Gen1]

Per Second ( collections )
Average         : 251.73166139361632
Max             : 305.97882626522244
Min             : 178.82369771642138
Std. Deviation  : 47.515272144026895
Std. Error      : 15.025648361787713

Per Test ( collections )
Average         : 1
Max             : 1
Min             : 1
Std. Deviation  : 0
Std. Error      : 0

GC 성능테스트 측정도 이용할수 있는것은 보너스입니다.


이상  유닛테스트와 함께 심플한 성능테스트를 함께 할수 있는 방법을 살펴보았으며

측정할 수 없으면 성능 개선을 할수 없는것과 마찬가지로 여기서 이용된 기술과 관련기술 링크도 첨부합니다.


JUnit with Bench

자바에서는 JHM를 이용하여 마이크로 벤치마크할수 있으며 대응하는 버전도 동일하게 준비되어있습니다.

링크 : https://github.com/psmon/java-labs/blob/master/springweb/src/jmh/java/com/webnori/springweb/akka/README.md측정할수 없으면 개선할수 없으며~  활용된 기술의 링크도 추가하였습니다.



참고링크 :