Broken pipe 오류

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

Broken pipe 오류

zepinos
종종(어쩔 때는 자주) 아래와 같은 형태의 오류가 발생합니다.

검색해보니 Controller 와 Agent 사이의 통신이 불량할 때 발생할 수 있다고 나오던데요...vlan 으로 연결된 클라우드 서버 간에 연결된 것이라...

처음부터 발생하는 경우는 기본 설정을 바꾸면 되던데, 테스트 도중 이렇게 뜰 때도 있습니다. 테스트 대상 서버의 문제는 아닌건가요?


조언 부탁드립니다.



2013-12-25 01:06:18,245 INFO  cc1e40dd-4f1d-4fb5-9155-5f0aa7988df7-1: Report to console failed
net.grinder.communication.CommunicationException: Exception whilst sending message
        at net.grinder.communication.AbstractSender.send(AbstractSender.java:57) ~[grinder-core-3.9.1.jar:na]
        at net.grinder.communication.QueuedSenderDecorator.flush(QueuedSenderDecorator.java:60) ~[grinder-core-3.9.1.jar:na]
        at net.grinder.engine.process.GrinderProcess.sendStatusMessage(GrinderProcess.java:568) ~[grinder-3.9.1-patch.jar:na]
        at net.grinder.engine.process.GrinderProcess.access$6(GrinderProcess.java:563) ~[grinder-3.9.1-patch.jar:na]
        at net.grinder.engine.process.GrinderProcess$ReportToConsoleTimerTask.run(GrinderProcess.java:552) ~[grinder-3.9.1-patch.jar:na]
        at java.util.TimerThread.mainLoop(Timer.java:555) ~[na:1.7.0_25]
        at java.util.TimerThread.run(Timer.java:505) ~[na:1.7.0_25]
Caused by: java.net.SocketException: Broken pipe
        at java.net.SocketOutputStream.socketWrite0(Native Method) ~[na:1.7.0_25]
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) ~[na:1.7.0_25]
        at java.net.SocketOutputStream.write(SocketOutputStream.java:153) ~[na:1.7.0_25]
        at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) ~[na:1.7.0_25]
        at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) ~[na:1.7.0_25]
        at java.io.ObjectOutputStream$BlockDataOutputStream.flush(ObjectOutputStream.java:1816) ~[na:1.7.0_25]
        at java.io.ObjectOutputStream.flush(ObjectOutputStream.java:716) ~[na:1.7.0_25]
        at net.grinder.communication.AbstractSender.writeMessageToStream(AbstractSender.java:90) ~[grinder-core-3.9.1.jar:na]
        at net.grinder.communication.StreamSender.writeMessage(StreamSender.java:70) ~[grinder-core-3.9.1.jar:na]
        at net.grinder.communication.AbstractSender.send(AbstractSender.java:53) ~[grinder-core-3.9.1.jar:na]
        ... 6 common frames omitted
Reply | Threaded
Open this post in threaded view
|

Re: Broken pipe 오류

junoyoon
Administrator
예. 말씀 하신 에러는 테스트 대상의 문제가 아니라..
ngrinder controller 와 agent 간의 통신 문제입니다.

agent 에서 대량의 트래픽을 다루고 있을때 controller와 agent 간의 통신이 끊기고 이에 테스트가 중단되는 경우가 간간히 발생하는데요.(대신 에이전트를 자동으로 재시작하여 재 접속 시킵니다.)  저희도 아직까지 해결하지 못했습니다.

하단의 grinder 엔진에서 컨트롤러<=>에이전트 간의 통신에 아주 기초적인 소켓 통신을 사용하고 있고, 여기에 에러 복구를 위한 어떠한 추가적인 프로토콜도 사용하고 있지 않기 때문에 엔진을 크게 손보지 않는이상 이 문제는 한동안 안고가야 하는 것이라 생각하고 있습니다.

이 문제는 너무 많은 트래픽을 발생시킬 때 발생 가능성이 증가함으로, 에이전트 수를 늘려서 한 에이전트당 실행하는 최대 vuser 수를 적절히(최대 3000 정도로) 줄여주시면 이 문제는 거의 발생하지 않을 겁니다. 참고로 네이버에서 운영하는 ngrinder 인스턴스(총 80여대 규모)에서는 해당 에러가 발생하지 않습니다. 이는 에이전트와 컨트롤러가 3gbps 정도로 빠르고 신뢰성 있는 네트웍 구간상에 연결되어 있어서 그런것 같습니다.

Reply | Threaded
Open this post in threaded view
|

Re: Broken pipe 오류

zepinos
저의 경우 원인은 찾았습니다. 스크립트를 잘못 만들었더군요.

@BeforeProcess 에 있던 DB 쿼리를 @BeforeThread 로 옮겼습니다. 이유는 사용자 id 을 random 하게 DB 에서 조회해서 Thread 에서 사용을 하게 하려고 했는데, @BeforeProcess 에 넣으니 프로세스 개수(10개) 만큼만 쿼리를 실행하기 때문에 2000 vUser 을 이용할 경우 200 번의 같은 아이디 동시접속(?)이 발생할 수 있겠더라구요. 그래서 이걸 @BeforeThread 로 옮겨서 실행하게 했더니 비교적 많은 쿼리를 실행하게 되어서 분산이 되더군요(그런데, 이 경우 2000 번을 실행하는 것이 맞죠?).

게다가 Groovy 에서 DB 을 connection 한 뒤 close() 을 안적어줘서 DB Connection Full 까지 떠버려서...

어쨌든 현재로썬 수정을 했습니다. 중복되지 않는 수를 가져오는 부분을 좀 더 고민해봐야겠습니다.



조언 감사합니다.