nGrinder 3.2를 설치하여 웹서비스 성능 검증을 해보려고 합니다.
다만, 환경이 좀 특이한 면이 있어서 접근이 되지 않는 문제가 발생하여 문의를 드립니다. Controller와 Agent는 서로 다른 망에 물려 있고, 가상 IP를 갖고 있으며, 서로 상대방의 public IP를 넣어줄 시 ping이 되는 점은 확인을 한 상태입니다. Controller와 Agent의 configuration파일에 각각 ngrinder.controller.ipaddress= agent.console.ip= 를 할당 해주었는데, 로그에 " Failed to connect to '/XXX.XXX.XXX.XXX:12001' "란 메시지가 남는군요. 혹시 해결하려면 어떻게 해야 할까요? |
Administrator
|
기본적으로 agent 상태를 controller 보고를 위한 16001 포트는 잘 연결되신 듯 하네요.
에이전트는 컨트롤러의 16001 번 포트로 커넥션을 맺어놓고, 이 명령채널을 통해 컨트롤러의 명령을 기다립니다. 12001~1200X까지의 포트는 실제로 테스트 실행될 때 컨트롤러가 사용되는 포트인데요. 실제 테스트가 시작되는 시점에 컨트롤러의 해당 포트가 리스닝으로 대기하고, 에이전트에게 명령채널을 통해 이 포트로 접근하라고 명령하게 됩니다. 말씀하신 경우, 실제로 XXX.XXX.XXX.XXX 로 표기하신 부분이 agent.console.ip 에서 지정하신 값과 같다면, 이미 16001 번의 포트 연결이 완료되었기 때문에 IP 접근 자체는 문제 없는데, 12001~1200X 까지의 포트 연결이 방화벽등으로 인해 막혀 있을 가능성이 높습니다. 네트웍 담당자에게 문의하여 ACL을 열으셔야 합니다. 참고로 에이전트 측에서 telnet XXX.XXX.XXX.XXX 12001 을 아무리 때려보셔도 확인하셔도 소용없습니다. 컨트롤러는 실제 테스트를 실행할때 빼놓고는 포트를 닫아놓습니다. |
컨트롤러가 테스트시 할당한다는 점도 이미 확인한바
테스트 실행하자마자 방화벽 테스트를 진행해서 12001~1200X 포트와 16001 포트 모두 열어놓은 것도 여러차례 확인을 해본 내용입니다. 혹시 다른 이유가 있을까요? |
Administrator
|
In reply to this post by Will
몇가지 의심해 볼 문제는 다음과 같습니다
1. 혹시 agent.console.ip=XXX.XXX.XXX.XXX 뒤쪽에 스페이스가 들어가지 않았나요? 2. XXX.XXX.XXX.XXX 에 컨트롤러의 Public IP를 기재하신 거 맞나요? 이 경우는 Public IP 여야 합니다. 3. 혹시 에이전트도 3.2 로 업그레이드 하신거 맞나요? 저와 함께 원인을 하나 하나 파해쳐 보죠. =================================================== 그리고 아래 설정은 ngrinder 3.1.3 부터는 동작하지 않습니다. 컨트롤러에서 이 설정을 빼시기 바랍니다. # 컨트롤러 system.conf ngrinder.controller.ipaddress= |
1. 일단 뒤에 스페이스가 없는 것은 확인했습니다.
2. agent.console.ip에 Public IP를 기재했습니다. 3. 전부 3.2로 설치를 했습니다. 4. system.conf에서 ngrinder.controller.ipaddress=부분을 삭제하고 로그를 확인해보니, 다음과 같은 에러가 있더군요. Failed to bind to console address, check options. at net.grinder.console.communication.ConsoleCommunicationImplementationEx.reset(ConsoleCommunicationImplementationEx.java:167) [ngrinder-core-3.2.jar:na] |
Administrator
|
혹시 윈도우 신가요? 아니면 리눅스 이신가요?
리눅스이시라면 /etc/hosts 파일을 paste 해주실 수 있나요? 해당 파일에 기재된 IP공개가 꺼려지신다면, C/D 클래스는 제외하시고, 나머지만 알려주세요. |
Administrator
|
In reply to this post by Will
1. 아무래도 이 경우에는 ngrinder.controller.ipaddress 를 다시 넣어야 할 것 같군요.
2. 그리고 system.conf 에 ngrinder.console.portbase 도 18000 로 설정한뒤 컨트롤러를 재시작후 테스트 실행 해보시기 바랍니다. |
Linux CentOs 환경이고
hosts 파일은 기본과 동일하며, Public IP는 211.43으로 시작합니다. system.conf에 public ipaddress 유무에 넣던 상관없이 Public Ip를 bind하려고 하는데 public ip를 bind하지 못하는게 에러내용입니다. |
Administrator
|
예. 해당 에러 내용은 인지하고 있습니다.
그러나 에러 내용과 실제 발생한 상황과는 좀 달라서 해당 로그가 특정 시점에 몇번 발생한 것인지 아니면 지속적으로 테스트 실행시마다 발생한것이지 확실치 않습니다. 지난번에 확인해 주신 내용으로는 12001 포트로 접근 테스트에 성공하셨다고 하셨는데요. 제 추측에는 테스트를 실행하신 뒤, 20초 내에 에이전트 머신에서 telnet 컨트롤러IP 12001 을 쳐보시고, 응답을 확인하신 것 같습니다. 그러나 위와 같은 컨트롤러측 포트 바인딩 실패 상황에서는 위와 같은 확인 자체가 성립하지 않거든요. 한가지 가능성있는 상황이라면 톰캣의 webapps 폴더내에 실수로 컨트롤러 war 파일을 두개 설치한 경우가 있을 수 있겠는데요. 이정도의 실수를 하셨을 것 같진 않습니다. ^^ 정확히 어떤 상황인지 좀 더 확인하기 위해.. 포트 바인딩만을 테스트 해보는 코드를 만들었습니다. 첨부한 파일을 해당 머신에서 실행해 주실 수 있으신지요? java ServerSocketTest 라고 실행하시고 화면 출력 결과를 공유해 주시면 원인을 찾는데 큰 도움이 될 것 같습니다. ServerSocketTest.class |
제가 지금은 외부에 있어서, 해당 클래스를 테스트 해보는건 금요일이나 가능할것 같습니다.
일단, 포트 12001이 열려 있는 것은 다른 방안으로도 검증을 해본 상태입니다. 사실, 로그에 public ip 관련 binding 에러가 있길레, 잠시 system.conf에서 ngrinder.controller.ipaddress를 public ip가 아닌 local ip로 진행을 해보기도 해서, 이때 접근이 되는 것을 확인했었던 것 같네요. 물론, 이 역시 agent쪽에서는 local ip로 접근을 하려고 해서 접근을 하지 못하는 상황이 발생합니다. |
Administrator
|
그렇다면.. 다음이 추측되는군요.
1. 리눅스 설치자에 따라, 특정 IP의 특정 포트 이하는 root 권한을 가진 사용자만 오픈 가능하도록 하는 경우도 있습니다. 지난번에 16001번은 잘 연결된다는 것을 보면, 아무래도 16001번 이하 포트 어딘가에 이 지점이 있을 수도 있겠습니다. 2. 네트웍 방화벽이 12001번 포트를 막았을 수도 있겠군요. 지난번에 하셨다는 테스트는 로컬 IP를 사용하셨다니.. 아무래도 같은 망에서 테스트 해본 것일 것 같네요. 두 경우 모두 앞서 말씀 드렸던 system.conf 에 ngrinder.console.portbase 를 16001 번 이후에 설정.. 으로 해결 가능할 수도 있겠습니다. 이 옵션은 실제 테스트 할때 사용하는 포트를 지정합니다. 이를 먼저 테스트 해보기 바랍니다. |
SocketTest에서 어느 포트를 바인딩하는거죠? 실행결과는 다음과같네요.
Bind Address: Public IP java.net.BindException: Cannot assign requested address . . . Socket by real connection - Bind Adress: 로컬 IP java.net.BindException: Cannot assign requested address . . . |
Administrator
|
첫번째 커넥션에서는 InetAddress.getLocalAddress() 의 결과로 바인딩을 시도합니다.
두번째 커넥션에서는 www.google.com 으로 연결을 시도한뒤, 연결된 로컬 IP를 사용하여 바인딩을 시도합니다. 리턴된 결과에 따르면 살펴보면.. Pulblic IP로 12001 포트 바인딩이 실패하는데요. 그리고 로컬 바인딩도 모두 실패하네요. 그러면 리눅스 Security 쪽의 문제인듯 합니다. 여기서 부터는 nGrinder 가 어찌할 수 있는 방법이 없네요. -.-; ==================================================================== import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketAddress; public class ServerSocketTest { public static void main(String[] args) throws IOException { InetAddress address = InetAddress.getLocalHost(); System.out.println("Bind Address: " + address.getHostAddress()); ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(12001, 50, address); System.out.println("port 12001 with " + address.getHostAddress() + " is succeeded"); } catch (Exception e) { e.printStackTrace(); } if (serverSocket != null) { serverSocket.close(); } InetAddress addressWithSocket = getAddressWithSocket("www.google.com", 80); if (addressWithSocket == null) { System.out.println("Connecting port returns null"); return; } serverSocket = null; try { System.out.println("Socket by real connection - Bind Address: " + addressWithSocket.getHostAddress()); serverSocket = new ServerSocket(12001, 50, address); System.out.println("port 12001 with " + addressWithSocket.getHostAddress() + " is succeeded"); } catch (Exception e) { e.printStackTrace(); } if (serverSocket != null) { serverSocket.close(); } } private static InetAddress getAddressWithSocket(String byConnecting, int port) { Socket s = null; try { s = new Socket(); SocketAddress addr = new InetSocketAddress(byConnecting, port); s.connect(addr, 2000); // 2 seconds timeout return s.getLocalAddress(); } catch (Exception e) { e.printStackTrace(); return null; } } } |
Administrator
|
In reply to this post by Will
혹시 다른 포트가 오픈 가능한 것이 있을지 모르니.. 아래 코드중 12001 부분을 다른 포트로 바꿔서 테스트 진행해 주실 수 있을런지요?
|
자세히 보니 보내주신 코드에 문제가 있네요.
밑에서 adress로 다시 테스트를 합니다. adressWithSocket주소로 바꾸면 문제 없이 진행됩니다. |
Administrator
|
아.. 그렇군요. 이런 실수를..
그렇다면 한가지를 시도해 볼 수 있겠습니다. /etc/hosts 파일을 편집하시어 localhost 항목을 public ip 로 설정하신뒤 재 시작해 보시기 바랍니다. |
호스트파일까지 고치는건 좀 무리가 있고,
ngrinder.controller.ipaddress를 로컬ip로 할당을 하되 agent에서 로컬ip가 아닌 public ip로 접속 시도를 하도록 할수는 없을까요? agent.console.ip에 public ip를 입력해봐도 system.conf설정으로 override가 되는것 같네요. Agent 로그에 Failed to connect to '로컬 ip:12000' 라고 기록됩니다. |
Administrator
|
예. 이 이슈는 고치는데 공수가 필요하여..
http://jira.cubrid.org/browse/NGRINDER-612 에 이슈를 등록하였습니다. 3.2.1 버전에 Fix 하여야 겠네요. 3.2.1 버전 릴리즈까지는 한달 정도 소요될 것 같습니다. |
Administrator
|
This post was updated on .
In reply to this post by Will
아직 공식 릴리즈 전인 ngrinder 3.2.1 을 써보시기 바랍니다. 이 버전은 말씀 하신 문제를 해결하였습니다. 에이전트는 3.2 버전을 그대로 쓰시면 됩니다.
https://docs.google.com/file/d/0BydpbzD7dWIFdW81RDVKdzh6UWs/edit?usp=sharing ngrinder.controller.ipaddress=리얼아이피 이렇게 system.conf 에 기재해 주세요. 그럼 |
미리 테스트해볼수 있어 감사드립니다.
바인드 문제는 더이상 없고 agent쪽 로그에는 에러 메시지가 없습니다. 다만, 여전히 테스트는 Fail이군요. 일단 컨트롤러 쪽 로그에 SCRIPT_ERROR란 에러 메시지가 있군요. Validate로 테스트할때는 문제가 전혀 없는데 스크립트 에러라고 나오는군요. 물론 agent에서 각각 접근이 되는지도 모두 테스트한 상태입니다. |
Free forum by Nabble | Edit this page |