서브버전은 프로젝트 진행시 가장 많이 사용되는 인프라중 하나이다. 저장소에서 업데이트 받고 커밋하고 로그를 보는 작업이 오래 걸리면 개발 생산성이 떨이지기 마련이다.

생산성 향상을 위해 서브버전을 튜닝하는 방법을 알아보자.

 

apache httpd 성능 개선

명령행 기반이나 TortoiseSvn 등의 C/C++ 로 구현된 서브버전 client는 http/https 기반의 저장소를 사용할 경우 http와 webdav 프로토콜 처리를 위해 neon 이라는 클라이언트 라이브러리를 사용하였다.

neon 은 특성상 update, checkout, switch 등의 작업을 할 경우 전체 변경 필요 내역을 하나의 요청에서 처리해야 했으므로 속도가 오래 걸렸다.

서브버전 1.8 부터 serf 라는 라이브러리로 변경되었고 multiplex와 비동기 방식의 전송을 사용하여 모든 데이타를 한 번에 받지 않고 변경이 필요한 내역을 받은 후에  필요할 때 마다 내려 받게 최적화되었다.

이로서 성능과 응답속도가 월등히 향상 되었지만 서브버전 서버는 더 많은 클라이언트 요청을 처리할 수 있게 설정을 수정해야 하며 메모리등의 서버 자원도 더 많이 소비하게 되었다.

서브버전 1.8 의 개선사항에 맞게 아파치 웹서버의 변경되어야할 설정은 다음과 같다.

지시자권장값기본값의미
KeepAliveOnOffHTTP 1.1 의 persistent connection을 사용하며 메모리등 시스템의 자원을 더 사용하게 된다. RHEL 의 기본값은 Off 이므로 production 시스템이라면 이 부분을 꼭 수정해야 한다.
MaxKeepAliveRequests2,000 이상100connection 에서 최대 허용할 요청 건수. 서브버전 1.8부터 http 요청을 multiplex 으로 처리하므로 값을 늘려주어야 성능 향상을 볼 수 있다.

KeepAliveTimeout

30

15

동일한 클라이언트의 동일한 연결에서 다음 요청을 기다려줄 최대 타임 아웃 값. 개발자가 외부에 있거나 네트워크 상황이 안 좋을 경우 늘려 주자.

 

경로 기반 접근 제어 미사용

경로 기반 접근 제어는 모든 요청의 URL 을 파싱하고 접근 제어 설정을 참고해야 하므로 성능에 영향을 줄 수 있다. 이 기능이 꼭 필요한지 생각해 보고 필요하지 않다면 해당 기능을 사용하지 않도록 하자.

 

LDAP 캐쉬 크기 증가

mod_ldap 으로 서브버전 계정 통합 및 접근 제어를 사용하는 환경에만 해당된다. mod_ldap을 사용한다면 LDAPCacheTTL , LDAPConnectionTimeout 설정값을 크게 설정하면 성능이 향상될 수 있다.

 

서브버전 캐쉬 설정 및 압축 

서브버전 1.7 부터는 데이타 캐슁 기능이 추가되었다.  서브버전 서버의 메모리가 넉넉하다면 캐쉬 매모리를 크게 할당하면 성능이 향상될 수 있다.

지시자권장값기본값의미
SVNInMemoryCacheSize메모리 여유가 있다면 크게 설정(1048576 = 1G)16384캐쉬 사이즈를 KB 단위로 지정한다. 0 이면 사용하지 않겠다는 의미이다. 기본은 16M 이다.
SVNCacheFullTexts OnOffFull Text 를 메모리에 캐슁한다. 메모리가 여유있다면 On 을 추천한다.
SVNCacheTextDeltas OnOff컨텐츠의 변경 내역(delta)을 메모리에 캐슁한다. 메모리가 여유있다면 On 을 추천한다.
SVNCompressionLevel 5(시스템 상황에 따라 조정)5파일 전송시 사용할 압축 수준을 0 - 9 사이로 지정한다. 0은 압축을 사용하지 않고 9는 최대로 압축한다.

 

아파치 logging 변경

아파치 웹서버는 유연하고 강력한 로깅 기능을 내장하고 있다. 서브버전을 아파치를 통해 구동하면 이런 강력한 로깅 시스템을 그대로 사용할 수 있다. 기본적으로 아파치는 가상 호스트별 두 개의 로그 파일을 지원한다. 하나는 에러 상황을 기록하는 error.log 이며 다른 하나는 HTTP 요청 정보를 저장하는 access.log 이다. 서브버전의 HTTP 요청은 WebDAV 와 서브버전 프로토콜을 사용하므로 관리자는 클라이언트가 어떤 작업을 수행중인지 로그를 봐도 이해하기가 어려울 수 있다.  

 
 

서브버전은 관리자가 이해하기 쉽게 작업 내역을 변환하는 기능을 지원하고 있으며 변환된 로그는 SVN-ACTION 환경 변수에 지정되므로 CustomLog 항목을 env 지시자를 사용하여 변경하면 된다.  이때 CustomeLog는 Location 지시자 밖에 있어야 하는 점을 주의하자.

<Location /svn>
    DAV svn
    #…
</Location>
CustomLog logs/svn.example.com-logfile "%t %u %{SVN-ACTION}e" env=SVN-ACTION
CODE

%t와 %u 는 요청한 시간과 요청자로 치환되며 SVN-ACTION 은 이해하기 용이한 상위 레벨의 action으로 치환된다. 위와 같이 설정을 변경하고 아파치 웹서버를 재구동하면 로그가 가독성있게 기록된다.

[26/Jan/2014:22:24:20 -0600] - get-dir /tags r1729 props
[26/Jan/2014:22:24:27 -0600] - update /trunk r1729 depth=infinity
[26/Jan/2014:22:25:29 -0600] - status /trunk/foo r1729 depth=infinity
[26/Jan/2014:22:25:31 -0600] sally commit r1730