nGrinder는 여러개의 쓰레드를 포함하는 프로세스를 여러 에이전트에서 실행하여 성능 테스트를 수행합니다. 간혹 성능 테스트 요구사항 중에 캐시 효과를 제거하기 위해, 각 쓰레드 마다 다른 일을 시키게 하고 싶다는 요구가 있습니다. 보통 이와 같은 요구사항은 grinder.threadNumber 라는 API를 통해 현재 쓰레드 번호를 가져와서 해결하는 경우가 있는데요. 이 threadNumber 라는 게 각각의 프로세스마다 0부터 새로 부여되는 거라서, 테스트 설정시 지정한 쓰레드 개수 이상을 처리할 수 없습니다. 이때는 grinder.processNumber 와 grinder.threadNumber를 조합하여 신규로 어떠한 구분자를 생성해 내어야 하는데요. 다음을 이를 처리하는 방법을 설명합니다.

Groovy

def curNumber;

@BeforeThread
public void beforeThread() {
  // 에이전트당 프로세스 개수를 가져옵니다.
  int totalProcessCount = grinder.getProperties().getInt("grinder.processes", 1);
  // 프로세스당 쓰레드 개수를 가져옵니다.
  int totalThreadCount = grinder.getProperties().getInt("grinder.threads", 1);

  // 현재 이 쓰레드가 동작하는 에이전트의 번호를 가져옵니다.(0부터 시작)
  int agentNumber = grinder.agentNumber

  // 현재 이 쓰레드가 동작하는 프로세스의 번호를 가져옵니다.(0부터 시작)
  int processNumber = grinder.processNumber

  // 현재 이 쓰레드의 번호를 가져옵니다.
  int threadNumber = grinder.threadNumber
  
  // 현재 쓰레드의 Unique ID를 계산합니다.
  curNumber = (agentNumber * totalProcessCount * totalThreadCount)
               + (processNumber * totalThreadCount) + threadNumber;
  ....
}

@Test
public doTest() {
   //curNumber를 가지고 여러 가지 장난을 칩니다.
}

Python

class TestRunner:
    # initlialize a thread 
    def __init__(self):
        # 에이전트당 프로세스 개수를 가져옵니다.
        totalProcessCount = grinder.getProperties().getInt("grinder.processes", 1)
        # 프로세스당 쓰레드 개수를 가져옵니다.
        totalThreadCount = grinder.getProperties().getInt("grinder.threads", 1)
        # 현재 이 쓰레드가 동작하는 에이전트의 번호를 가져옵니다. (0부터 시작)
        agentNumber = grinder.agentNumber
        # 현재 이 쓰레디가 동작하는 프로세스의 번호를 가져옵니다. (0부터 시작)
        processNumber = grinder.processNumber
        # 현재 이 쓰레드의 번호를 가져옵니다.
        threadNumber = grinder.threadNumber
        # 현재 쓰레드의 Unique ID를 계산합니다.
        self.curNumber = (agentNumber * totalProcessCount * totalThreadCount) + 
                         (processNumber * totalThreadCount) + threadNumber;
        ....
    # test method       
    def __call__(self):
        print ("curNumber :") +  str(self.curNumber)
        #curNumber를 가지고 여러 가지 활용을 합니다.

 

위와 같은 코드를 사용하면, 각 쓰레드는 curNumber 에 전체 성능 테스트상에서 유일한 값을 가지게 됩니다. 예를 들어 에이전트가 2개, 프로세스가 2개, 쓰레드가 10개면, curNumber 는 0 부터 39 까지의 값을 가지게 됩니다. 그 값을 가지고 doTest 메소드에서 적절히 분기 처리해주면, 각 쓰레드는 완벽히 다른 일을 처리하게 됩니다.

Posted by 윤준호

댓글을 달아 주세요