Scalability 와 Performance, 그리고 언어 (PHP vs. Java)

‘스케일러빌러티’란 더 많은 시스템 자원 (e.g. 하드웨어) 을 제공하면 할 수록 전체적인 성능이 비례해 증가할 수 있는 어플리케이션의 특성을 말한다. 보통 어떤 어플리케이션이 스케일러빌러티가 있다면 그 어플리케이션은 ‘스케일러블’ 한 것이다. 그렇다면 언어와 스케일러빌러티는 어떤 관계가 있는가?

“없다.”

일반인들의 중요한 실수는 ‘스케일러빌러티 = 성능’ 이라고 단정하는 것이다. 그러나 이는 사실과 전혀 다르다. 스루풋이 매우 높은 어플리케이션이 자원을 더 할당해 주어도 스루풋이 더 높아지지 않는 경우가 있고, 스루풋이 낮은 어플리케이션이 자원을 더 할당해 주는 것에 비례해 높은 성능을 보여주는 경우도 있다. 이는 전적으로 그 어플리케이션이 어떻게 개발되었는가에 달려 있다. 언어 자체와는 별 상관 없다.

하지만 J2EE 라는 막강한 플랫폼을 고려한다면 개발 복잡성 측면에서 이야기가 달라진다. J2EE 는 미들웨어다 — 위에서 이야기한 문제들 (i.e. 엔터프라이즈 컴퓨팅의 문제들) 을 개발자들이 쉽게 해결할 수 있도록 표준화된 형태로 제공한다. 따라서 이렇다 할 표준화된 모듈 셋이 없는 PHP 에 비해, 표준화가 많이 진행되었고 컴포넌트 모델이 잘 확립된 J2EE 가 많은 개발자들이 협업하여 수행하는 큰 프로젝트에 더 적합하다.

한편 언어와 성능은 어떤 관계가 있을까?

“없다.”

어플리케이션의 성능은 일반적으로:

* 외부 자원의 조심스러운 사용 및 최적화
(e.g. 파일 입출력, 외부 시스템과의 소켓 통신, 데이터베이스 액세스)
* 공격적인 데이터 캐싱

에 의해 결정된다.

우선, 적절한 데이터베이스의 사용과 외부 자원의 조심스러운 사용은 당연히 언어와 전혀 관계가 없다. (물론 언어 위의 플랫폼과는 관계 있다.)

공격적인 데이터 캐싱은 주로 자바 진영에서 사용하는 가장 강력한 기술 중 하나다. 캐싱은 데이터베이스에서 한 번 읽었던 데이터를 메모리에 갖고 있다가, 추후에 필요한 경우 데이터베이스 접근 없이 재사용하는 기법이다. PHP 의 경우도 이를 인지하고 다양한 캐싱 모듈들이 개발되었고, 또 개발되고 있다. 따라서 이를 적절하게 사용하면 PHP 에서도 캐싱을 통해 성능을 극대화할 수 있다.

혹자는 스크립트 언어의 실행 성능을 의심스러워 하기도 한다. 하지만 일반적으로 우리가 말하는 성능은 지극히 상대적이다. 데이터베이스에서 데이터를 가져오는 데 0.3 초가 걸렸고, 스크립트 언어를 해석/실행하는 데 0.05 초가 걸렸다고 가정해 보자. 자바의 경우 스크립트 언어의 해석이 불필요하므로 실행하는데 0.02 초가 걸렸다면, PHP 는 0.35초, 자바는 0.32 초가 걸린 셈이다. 이 수치는 PHP 가 자바에 비해 약 9% 정도 밖에 느리지 않다는 결론에 이른다. 즉, 프로파일링 결과 발견한 병목 지점 (i.e. 데이터베이스) 튜닝에 시간을 투자하는 것이 훨씬 이득이다. (만약 9% 조차 용인하기 힘들다면 ZendOptimizer 와 같은 최적화 모듈을 탑재해 PHP 구문 해석에 소요되는 시간을 몇 배 이상 절감시킬 수 있다.)

여러분의 비즈니스 어플리케이션이 느리게 반응하는가? 그것은 그 어플리케이션이 Java나 PHP 로 짜여졌기 때문이 아니다. C/C++ 로 다시 짜야 한다는 신호도 아니다. 바로 프로파일링하고 병목 지점을 제거하라는 신호 외에 다름 아니다.