ngrinder script

classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|

ngrinder script

shlee
This post was updated on .
안녕하세요 ngrinder 3.2 유저입니다.
질문이 있는데요. 너무 간단한 질문이라 조심스럽습니다만,

하나는
프로세스 / 스레드 개수 확인

위의 글에 있는 sample코드를 사용해서 test를 진행하면
agent node마다 파일이 생성되어야 하는것이 아닌가요??

에러 로그 없이 테스트가 죽어서 무엇이 문제인지 잘 모르겠습니다.
script validation check를 하면 controller 노드에는 파일이 생성됩니다만,
테스트를 진행하면 테스트가 죽습니다.

제가 혹시 놓치고 있는게 있나요?

그리고 두번째는 agent노드 별로 다른 파일을 읽어서 읽은 string으로 request 를 날리고 싶은데요
agent 노드의 정보를 얻을수 있나요? grinder.threadNumber 처럼 정보를 얻어와서
그걸 바탕으로 다른 파일을 열었으면 하거든요.혹시 가능한가요?



Reply | Threaded
Open this post in threaded view
|

Re: ngrinder script

junoyoon
Administrator
혹시 테스트가 죽는다는게.. 컨트롤러가 강제로 죽이나요?
해당 코드에는 record 함수 호출이 없어서 TPS가 나오지 않습니다. 따라서 일정 시간이 지난뒤 컨트롤러가 강제로 테스트를 죽일 겁니다.

이게 아니라면 혹시 에이전트에 F 드라이브가 없는 것은 아닐지.. (^^)

그리고 에이전트 별로 agent 노드 정보는 grinder.agentNumber 로 전체 테스트 참여 에이전트중 현재 몇번째 에이전트 인지 정도만 가지고 올 수 있습니다.

그런데.. 이게 매번 바뀌는 거라..

각 에이전트가 사용할 모든 파일을 리소스 폴더에 넣어서 동시 배포하시고...

open("filename_"+ grinder.agentNumber)와 같은 형식으로 스크립트 작성하셔야 할 듯 합니다.
Reply | Threaded
Open this post in threaded view
|

Re: ngrinder script

shlee
# -*- coding:utf-8 -*-

# A simple example using the HTTP plugin that shows the retrieval of a
# single page via HTTP.
#
# This script is automatically generated by ngrinder.
#
# @author admin
from net.grinder.script.Grinder import grinder
from net.grinder.script import Test
from net.grinder.plugin.http import HTTPRequest
from org.json import JSONObject
#import csv
 
test1 = Test(1, "Test1")
request1 = test1.wrap(HTTPRequest())
test1.record(request1)
 
class TestRunner:
        def __init__(self):
                grinder.statistics.delayReports=True
                global gfile
                gfile = open("./resources/agent_0", "r")
 
        def __call__(self):                
                 
                num = grinder.threadNumber
                agentNum = str(grinder.agentNumber)
                                #print agentNum
 
                grinder.logger.info("test")
                filename = str(num)
                lineStr = gfile.readline()
                json = JSONObject(lineStr)
                jsonsearch = json.get("search")
 
                file = open(("/home/" + filename+ ".txt"), "a")
                file.write(" Hello thread number is " + str(num) + "  " +  str(jsonsearch))
                file.close()
        def __del__(self):
                gfile.close()

==========================================================

script는 위와 같구요...
SCRIPT_ERROR 라고 나오고 죽는데요..
record 함수 호출이 없어서 그런가요? 일정시간이 지난뒤 컨트롤러가 죽는다고 하셨는데
시간은 어디서 설정 할 수 있나요??

그리고 리소스 폴더에 넣은 파일들이 배포되는 메커니즘은 어떻게 되나요?
test가 시작되는 순간에 resource폴더에 있는  파일들이 전체agent로 다 배포되는건지
파일이 참조되는 순간에 그 파일만 배포되는건지

두서없는 질문 드려서 죄송합니다~
Reply | Threaded
Open this post in threaded view
|

Re: ngrinder script

junoyoon
Administrator
리소스는 스크립트가 에이전트에서 실행되기 전에 배포됩니다.

몇가지 파이션 오류가 있네요.
예를 들어 gfile 이라는 글로벌 변수가 각 쓰레드 마다 정의되게 될겁니다.  즉 10개의 쓰레드이면 gfile 이라는 변수가 10번 정의되게 되죠..
아마 이게 에러원인이 아닐까 합니다.

다음과 같이 고쳐 보세요.

rom net.grinder.script.Grinder import grinder
from net.grinder.script import Test
from net.grinder.plugin.http import HTTPRequest
from org.json import JSONObject
from random import random
 
test1 = Test(1, "Test1")
request1 = HTTPRequest()
test1.record(request1)


class TestRunner:
        def __init__(self):
                grinder.statistics.delayReports=True
                agent_file =  open("./resources/agent_0", "r")
                self.file_content=agent_file.realines(100) # 일단 100라인만 읽어옵니다.
        def __call__(self):                
                num = grinder.threadNumber
                agentNum = str(grinder.agentNumber)
                                #print agentNum
                grinder.logger.info("test")
                filename = str(num)
                # file_content 에서 랜덤으로 특정 라인을 읽어옵니다.
                lineStr = self.file_content[random.randrange(0, 100)]

                json = JSONObject(lineStr)
                jsonsearch = json.get("search")
                # 여기는 이상한듯... /home/1.txt 를 생성할 권한이 있나요?  
                file = open(("/home/" + filename+ ".txt"), "a")
                file.write(" Hello thread number is " + str(num) + "  " +  str(jsonsearch))
                file.close()
        def __del__(self):
                gfile.close()


그리고 현재 agent 를 root 권한으로 실행하셨나요? /home/1.txt 같은 파일은 퍼미션 에러가 발것 같은데..
Reply | Threaded
Open this post in threaded view
|

Re: ngrinder script

jungjeongyun
저는 Agent를 일반 사용자로 실행하고 있습니다.
Agent를 Root권한으로 실행시키는 것과 일반 사용자로 실행시키는 것과 차이가 큰가요?!
Reply | Threaded
Open this post in threaded view
|

Re: ngrinder script

junoyoon
Administrator
/home/ 폴더자체는 root 만 접근할 수 있겠죠? ^^

일반유저는 /home/유저id 하위의 각자 폴더에만 접근할 수 있구요.

앞선 스크립트에서는 현재 /home/1.txt 같은 파일을 만들고 있어서요..
Reply | Threaded
Open this post in threaded view
|

Re: ngrinder script

shlee
알려주신 스크립트로 실행해봤으나, SCRIPT_ERROR로 죽네요

hadoop 이라는 개인 계정으로 실행하였구요
그래서 file = open(("/home/hadoop/" + filename+ ".txt"), "a")
이런식으로 수정했는데도 안되네요..
Reply | Threaded
Open this post in threaded view
|

Re: ngrinder script

junoyoon
Administrator
# -*- coding:utf-8 -*-
from net.grinder.script.Grinder import grinder
from net.grinder.script import Test
from net.grinder.plugin.http import HTTPRequest
from org.json import JSONObject
import random
 
test1 = Test(1, "Test1")
request1 = HTTPRequest()

def hello():
    pass
test1.record(hello)  # 더미 레코딩

class TestRunner:
        def __init__(self):
                grinder.statistics.delayReports=True
                self.agent_file = open("./resources/agent_0", "r")
                self.file_content= self.agent_file.readlines()
        def __call__(self):  
                hello()
                num = grinder.threadNumber
                agentNum = str(grinder.agentNumber)
                                #print agentNum
                grinder.logger.info("test")
                filename = str(num)
               
                lineStr = self.file_content[random.randrange(0, len(self.file_content))]

                json = JSONObject(lineStr)
                jsonsearch = json.get("search")
                file = open(("/home1/hadoop/" + filename+ ".txt"), "a")
                file.write(" Hello thread number is " + str(num) + "  " +  str(jsonsearch))
                file.close()
        def __del__(self):
                self.agent_file.close()

이게 동작하는 버전입니다.