페이스북의 주요 가치 중 하나는 빠르게 움직인다는 것입니다. 지난 6년 동안, PHP의 빠른 개발 속도 덕분에 가능했던 일입니다. 프로그래밍 언어로서 PHP는 간결합니다. 배우기 쉽고, 작성하기도 쉽고, 읽기도 쉬우며 디버그 하기도 쉽습니다. 페이스북은 다른 언어보다 PHP 엔지니어들을 더 많이 늘려왔습니다. 페이스북을 빠르게 개선할 수 있는 사람들이죠.

오늘은 아주 능력 있는 사람들과 제가 지난 2년간 작업한 결과물을 공유하고자 합니다. 바로 HipHop for PHP 입니다. 우리는 HipHop을 사용해서 웹 서버의 평균 CPU 사용량을 50% 정도로 줄였습니다. CPU를 덜 사용한다는 것은 곧 서버를 덜 사용한다는 의미이고, 오버헤드가 더 적다는 뜻입니다. 이 프로젝트는 페이스북에 엄청난 영향을 끼쳤습니다. 우리는 HipHop이 웹 전반에 걸쳐 이득을 가져다 줄 것임을 직감하고, 새로운  오늘 저녁에 이 프로젝트를 오픈 소스로 공개하기로 결정했습니다. HipHop이 PHP를 사용한 대규모 복잡한 웹 사이트에  새로운 관심을 가져올 수 있도록 기대하면서 말이죠. 비록 HipHop이 우리에게는 믿을 수 없을 만큼의 결과를 보여주었지만, 아직 완성된 것은 아니므로 이를 사용하려면 베타 버전의 소프트웨어에 대한 불안감이 없어야 합니다.

기술적으로 HipHop for PHP는 컴파일러가 아닙니다. 오히려 소스 코드 변환기에 가깝습니다. HipHop은 PHP 소스 코드를 주어진 규칙에 따라 매우 최적화된 C++ 코드로 변환하고 g++를 사용해 이를 컴파일 합니다. HipHop은 소스 코드를 의미상 동등한 방법으로 실행하고, eval() 처럼 드물게 사용하는 기능들을 희생시켜 성능을 개선합니다. HipHop은 코드 변환기, 새롭게 작성된 PHP 런타임 시스템, 성능 최적화를 얻기 위해 재작성된 일반적인 PHP 함수 등으로 구성되어 있습니다.

Scaling PHP as a Scripting Language

PHP의 근간은 Perl, Python, Ruby 등과 같은 스크립트 언어로, 개발자의 생산성과 빠른 작업 속도에 이점을 가지고 있습니다. 이는 C++과 같은 전통적인 컴파일 언어나 Java와 갈은 인터프리터 언어와 비교되는 특징입니다. 반면, 스크립트 언어는 일반적으로 CPU와 메모리 사용에 있어 효율이 덜하다고 알려져 있습니다. 이 때문에, 페이스 북이 성장하려면 매월 4조의 PHP 기반  페이지 뷰를 극복해야 했습니다.

이러한 비효율을 극복하기 위해 언급되는 일반적인 방법 중 하나는 PHP 프로그램에서 더 복잡한 부분을 C++로 작성해 PHP 확장기능으로 만드는 것이 있습니다. 이는 PHP를 프론트 엔드 HTML과 프로그램 로직 C++ 중간의 접합 언어로 변환하겠다는 의미와 같습니다. 기술적인 관점에서 보면 이 방법은 잘 동작하겠지만, 전체 프로그램에 대해 작업할 수 있는 개발자 수를 급격하게 감소시킬 것입니다. PHP 확장기능을 작성하려면 C++을 먼저 배워야하고, 그 다음으로는 Zend API에 대해 이해해야 합니다. 우리의 개발팀은 상대적으로 작아서 — 개발자 한 명당 백만명 이상의 사용자가 있습니다 — 우리 코드 일부의 접근성을 떨어뜨리는 방법을 시도해볼 수는 없었습니다.

페이스북의 성장은 특히 힘든 도전이었는데, 거의 모든 페이지 뷰가 로그인 한 사용자에게 사용자화된 경험을 제공하기 때문입니다. 여러분이 자신의 홈페이지를 볼 때, 우리는 여러분의 모든 친구를 찾아서 (우리가 Multifeed라고 부르는 사용자화 서비스로부터) 가장 적절한 업데이트 내역을 뽑은 다음, 프라이버시 설정에 기반해 이를 걸러낸 후, 이렇게 걸러낸 이야기들을 댓글과 사진, 사람들이 페이스북을 좋아하게 만드는 모든 리치 데이터로 채웁니다. 그리고, 이 모든 동작은 1초 안에 처리됩니다. 우리는 뉴스 피드, 검색, 채팅과 그 외의 핵심 부분을 제공하는 커스텀 백엔드 서비스에 의존하면서도 HipHop을 사용해 최종 페이지를 PHP로 조합하고, 재빨리 반복할 수 있었습니다. 심지어 백엔드 서비스들은 C++, Erlang, Java, Python 등의 다양한 언어로 작성되었습니다.

2007년부터 우리는 이런 문제들을 해결할 수 있는 몇 종류의 방법에 대해 고민해왔고, 그 중 일부는 시도해보기도 했습니다. 공통적인 제안으로는 페이스북을 다른 언어로 바꾸는 것이 있었지만, 페이스북의 복잡도와 개발속도 덕분에 이 방법은 시간이 필요했습니다. 우리는 Zend Engine — PHP 내부 — 쪽을 재작성하고, 패치를 PHP 프로젝트에 보내기도 했지만, 궁극적으로는 필요한 만큼의 성능 향상을 얻지 못했습니다. HipHop의 장점은 우리 개발 속도와 거의 비슷하다는 것에 있습니다.

Hacking Up HipHop

저는 몇 년 전 Hackathon에 하룻밤 참가하면서(Prime Time Hack 참고), PHP를 C++로 변환해주는 프로그램을 작성하기 시작했습니다. 두 언어는 문법적으로 유사한 점이 많고, CPU 부하와 메모리 사용량 어느 측면에서 봐도 C++은 PHP보다 훨씬 나은 성능을 보여주었습니다. 심지어 PHP도 C로 작성되었을 정도입니다. 우리는 이미 작성된 전체 코드를 일일이 성공적으로 재작성한다는 것은 불가능하지만, 이런 변환을 프로그램 적으로 해결하는 시스템은 만들 수 있지 않을까라고 생각했습니다.

PHP 성능 개선을 위해 새로운 방법을 찾는 것은 새로운 개념이 아닙니다. 런타임에서 Zend Engine은 PHP 소스를 Zend 가상 머신에서 실행할 수 있는 opcode로 바꿉니다. APCeAccelerator 등의 오픈 소스 프로젝트는 바로 이 opcode를 캐시하며, 이미 PHP를 사용한 대형 웹 사이트에서 사용되고 있습니다. opcode 최적화와 캐싱을 통해 PHP를 더 빠르게 만드는 Zend Server와 같은 유료 제품도 있습니다. 이와 다르게, 우리는 PHP 소스를 C++로 바로 변환한 다음 이를 네이티브 머신 코드로 만드는 방법을 생각했습니다. PHP를 컴파일 하는 것도 새로운 아이디어는 아닙니다. 이미 공개된 오픈 소스 프로젝트들이 있습니다. Roadsendphc는 PHP를 C로 컴파일하며, Quercus는 PHP를 Java로, Phalanger는 PHP를 .Net 으로 변환해서 컴파일합니다.

물론, 이 작업이 하룻밤의 Hackathon으로 끝난 것은 아닙니다. 8개월이 지난 후에야 컴파일된 코드로 더 빠르게 실행하는 일이 실제로 가능한 것임을 시연할 수 있을 정도였습니다. 우리는 이 프로젝트에 박차를 가하기 위해 Iain Proctor과 Minghui Yang을 재빠르게 영입했습니다. 다시 10개월이 지나서 코딩을 마쳤으며, 6개월간 실제 서버에서 테스트를 진행했습니다. 그리고, 자랑스럽게도 HipHop은 배포 후 단 6개월만에 페이스북 웹 트래픽의 90% 이상을 담당하고 있습니다.

How HipHop Works

이 프로젝트의 주요 과제는 PHP와 C++의 차이를 줄이는 것입니다. PHP은 동적이고 약한 타입을 가진 스크립트 언어이고, C++은 강한 타입을 가진 컴파일 언어입니다. PHP에서 여러 동적인 기능들을 제공하긴 하지만, 대부분의 PHP는 상대적으로 직관적입니다. function foo($x) { include $x; } 보다는 if (...) {...} else {..} 를 보는 것과 같습니다. 우리가 성능 향상을 얻은 부분이 바로 여기입니다. 가능하다면 언제든 생성한 코드는 함수와 변수를 정적으로 바인딩합니다. 또한, 변수의 적합한 타입을 골라내는 타입 추론을 사용해서 메모리를 절약할 수 있었습니다.

변환은 크게 세 단계로 이루어집니다.

  1. 무엇을 선언하고 어디에 의존적인지에 대해 모은 정보를 기반으로 정적 분석을 합니다.
  2. 타입 추론을 통해 C++의 스칼라(scalar), 문자열(String), 배열(Array), 클래스(class), 객체(Object), 가변형(Variant) 중 가장 적합한 타입을 선택합니다.
  3. PHP 표현에서 직접적인 연관이 있는 부분을 C++ 표현으로 코드 변환합니다.

우리는 개발을 위해 고안된 실험적인 인터프리터인 HPHPi도 개발했습니다. HPHPi를 사용하면 PHP 소스 코드를 실행하기 위해 컴파일하지 않아도 됩니다. HPHPi 덕분에 HipHop의 버그를 찾아낼 수 있었고, 개발자들은 HipHop을 사용하기 위해 자신들의 PHP 개발 방식을 바꾸지 않아도 됐습니다.

전반적으로 HipHop은 PHP의 좋은 점을 취하면서도 C++의 성능을 얻을 수 있도록 해주었습니다. 우리는 300,000 줄 이상의 코드를 작성했고, 5,000개 이상의 단위 테스트를 실시했습니다. 이 모든 것들은 오늘 저녁 GitHub에서 오픈 소스 PHP 라이센스로 공개될 것입니다.

HipHop wiki : http://github.com/facebook/hiphop-php/wikis

From HipHop for PHP : Move Fast

신고
Posted by 행복한고니 트랙백 4 : 댓글 1

티스토리 툴바