Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Apache Bench 사용시 apr_socket_recv: Connection reset by peer (54) 오류

Apache Bench는 HTTP에 대한 벤치마킹 도구입니다. 아파치 웹서버에 포함되어 있는 도구이며 간단히 HTTP에 대한 성능 테스트를 할 수 있습니다.

ab -n 100 -c 100 http://127.0.0.1:3000/

예를 들어 위처럼 실행을 하면 http://127.0.0.1:3000/에 대해서 동시접속 100으로 100개의 요청을 보내서 테스트결과를 리포팅하게 되어 있습니다. 간단히 성능 테스트를 해볼 때 유용한데 잘 쓰고 있던 중에 OSX를 Lion으로 업그래이드 이후에 제대로 동작하지 않았습니다.

ab 벤치마킹의 오류 화면

위 화면처럼 정상적인 웹서버에 ab를 돌렸는데 apr_socket_recv: Connection reset by peer (54) 오류가 발생하며 제대로 벤치마킹이 동작하지 않았습니다. 정확한 이유는 확인하지 못했는데 아마 OS의 소켓류의 어떤 제한때문에 발생하는게 아닐까 여러가지 글들을 찾아보면서 추측해 볼 따름입니다.(왜냐하면 로컬이 아닌 외부로 ab를 돌리면 정상적으로 동작합니다.)

어쨌든 이 문제는 ab를 패치함으로써 해결할 수 있습니다.(그런 면에서는 ab의 어떤 버그 때문인지도 모르겠습니다.)

새로 Apache를 다운로드 받습니다. (현재 최신 버전은2.2.19입니다.)  다운받은 apache 파일의 압축을 풀어줍니다. 여기서는 httpd-2.2.19폴더에 압축을 풀었습니다. 이 아파치 파일을 이용해서 컴파일후 설치를 하면 ab도 설치되지만 그 전에 ab를 패치해 주어야 합니다.


$ cd httpd-2.2.19
httpd-2.2.19 $ wget https://www.rtfm.ro/download/patches/ab.patch --no-check-certificate
--2011-08-18 01:36:21--  https://www.rtfm.ro/download/patches/ab.patch
Resolving www.rtfm.ro... 188.240.88.9
Connecting to www.rtfm.ro|188.240.88.9|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1811 (1.8K) [text/x-diff]
Saving to: `ab.patch.1'

100%[===================================================================================================>] 1,811       --.-K/s   in 0s      

2011-08-18 01:36:23 (25.8 MB/s) - `ab.patch.1' saved [1811/1811]

httpd-2.2.19 $ 

https://www.rtfm.ro/download/patches/ab.patch에서 httpd-2.2.19 디렉토리안에 ap.patch파일을 다운로드 받습니다. 여기서는 wget을 이용해서 다운로드 받았습니다.


httpd-2.2.19 $ patch -p0 <./ab.patch
patching file support/ab.c
Hunk #1 succeeded at 683 (offset 13 lines).
Hunk #2 FAILED at 1696.
Hunk #3 succeeded at 1790 with fuzz 1 (offset 23 lines).
1 out of 3 hunks FAILED -- saving rejects to file support/ab.c.rej
httpd-2.2.19 $ 

patch -p0 <./ab.patch 명령어를 실행해서 ab.patch파일의 패치내용을 적용시킵니다. 결과 메시지에 일부가 Failed로 나타나지만 큰 상관은 없습니다.


httpd-2.2.19 $ ./configure --enable-module=most --enable-shared=max
checking for chosen layout... Apache
checking for working mkdir -p... yes
.............................
httpd-2.2.19 $ make
Making all in srclib
Making all in pcre
/usr/share/apr-1/build-1/libtool --silent --mode=compile gcc     -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK    -I/Users/outsider/Downloads/httpd-2.2.19/srclib/pcre
.......................

이제 아파치를 컴파일 합니다. ./configure 명령어로 설정을 한 후에 make명령어로 컴파일 합니다.


httpd-2.2.19 $ sudo cp ./support/ab /usr/local/apache2/bin/ab

전체 Apache를 컴파일 했지만 여기서 필요한 것은 ab파일 뿐이므로 support디렉토리 아래 있는 ab파일을 이미 설치되어 있던 apache의 ab를 덮어씁니다.

정상적으로 ab 벤치마킹을 성공한 화면

이제 다시 ab 벤치마킹을 돌리면 정상적으로 테스트가 되는 것을 볼 수 있습니다. OSX에서는 /usr/sbin/ab를 사용하게 되는데 여기서는 /usr/local/apache2/bin/ab에 복사를 했기 때문에 이 ab파일을 사용했습니다.
2011/08/18 01:57 2011/08/18 01:57